为什么用制表符缩进if-else会破坏Makefile?

时间:2018-12-05 15:08:39

标签: linux makefile gnu-make

这是一个Makefile:

.PHONY: all

ifeq ($(OS),Windows_NT)
    DETECTED_OS := Windows

else
    DETECTED_OS := $(shell uname -s)

endif

$(info DETECTED_OS is set to '$(DETECTED_OS)')

缩进标签时会打印

DETECTED_OS is set to ''

但是当缩进0或更多空格时,它会打印

DETECTED_OS is set to 'Linux'

但是,如果您删除第一行.PHONY: all,则会打印

DETECTED_OS is set to 'Linux'

无论制表符还是空格。

因此第一个版本已损坏,因为它没有将DETECTED_OS设置为零。为什么会这样?

我的版本:

GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

1 个答案:

答案 0 :(得分:2)

当用TAB缩进一行时,make会假设它是上一个目标的配方的一部分(如果有的话)。在这种情况下,有一个.PHONY目标,因此make假设这两行是.PHONY目标(从未使用过)的配方的一部分。因此,这些make变量分配不会运行。

makefile的简单规则是,始终使用TAB缩进配方行,而绝不使用TAB缩进任何其他行。