Makefile:为什么在.suffixes之后会立即忽略条件块?

时间:2017-04-20 10:06:56

标签: makefile

任何人都可以解释为什么条件ifneq块会在.SUFFIXES:目标之后立即被忽略,但如果它们之间存在某些内容则不会被忽略?

COMPILE_FLAGS = -Wextra -Wall -g -fopenmp
LINK_FLAGS = -lm -fopenmp
PKG_CONFIG_LIBS = glib-2.0

# Disable all default implicit rules
.SUFFIXES:

# If the following line is uncommented, the pkg-config
# block works perfectly, not if it is not.
#BOGUS = 

ifneq ($(PKG_CONFIG_LIBS),)
    COMPILE_FLAGS += $(shell pkg-config --cflags $(PKG_CONFIG_LIBS))
    LINK_FLAGS += $(shell pkg-config --libs $(PKG_CONFIG_LIBS))
endif

%.o: %.c
    gcc $(COMPILE_FLAGS) -c $<

caca: caca.o
    gcc $(COMPILE_FLAGS) $(LINK_FLAGS) -o $@ $<

clean:
    rm caca *.o

忽略.SUFFIXES:之后的第一件事:如果BOGUS行被取消注释,该变量确实会获取您想要设置的值,如果不是BOGUS 1}}行但条件块也被注释,模式规则仍然有效。有任何想法吗?谢谢!

更新:我在Ubuntu 16.04 x86_64上运行GNU Make 4.1。无论我在$(info hello)块中插入ifneq,我建议的Makefile的确切输出都是:

$ make
gcc -Wextra -Wall -g -fopenmp -c caca.c
gcc -Wextra -Wall -g -fopenmp -lm -fopenmp -o caca caca.o

但是,如果我取消注释BOGUS行,结果就像预期的那样:

$ make
gcc -Wextra -Wall -g -fopenmp -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -c caca.c
gcc -Wextra -Wall -g -fopenmp -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lm -fopenmp -lglib-2.0 -o caca caca.o

1 个答案:

答案 0 :(得分:3)

您有虚假的标签字符,如下所示: -

ifneq ($(PKG_CONFIG_LIBS),)
<tab>COMPILE_FLAGS += $(shell pkg-config --cflags $(PKG_CONFIG_LIBS))
<tab>LINK_FLAGS += $(shell pkg-config --libs $(PKG_CONFIG_LIBS))
endif

导致标签线被解释为伪目标.SUFFIXES的配方 当它们是跟随该目标的第一个非空的非注释行时, 控制ifneq是真的。在这种情况下,当您运行make时,它们执行, 即使ifneq被评估,也是如此。它们将被传递给shell执行, $(...)扩展后,如果选择了伪目标.SUFFIXES:

make将伪目标忽略为候选默认目标,因此 当您只是运行make时,您会发现默认目标是caca 标签线已被忽略&#34;。但如果你跑:

make .SUFFIXES

(保持BOGUS注释掉),您会看到:

COMPILE_FLAGS += 
make: COMPILE_FLAGS: Command not found
Makefile:13: recipe for target '.SUFFIXES' failed
make: *** [.SUFFIXES] Error 127

明确标签线确实是一个配方(尽管一个 外壳无法理解。

要修复,请删除这些标签或用空格替换它们。该 谨慎的习惯永远不会在makefile中缩进行缩进行,除非你打算这样做 标签线是一个食谱。