任何人都可以解释为什么条件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
答案 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中缩进行缩进行,除非你打算这样做 标签线是一个食谱。