2017-04-20 49 views
1

任何人都可以解释为什么条件ifneq块被忽略,如果它紧跟在.SUFFIXES:目标之后,但不是如果它们之间存在某种东西?Makefile:为什么在.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 [email protected] $< 

clean: 
    rm caca *.o 

这并不是说.SUFFIXES:后的第一件事情被忽略了:如果BOGUS行注释掉,该变量确实需要的价值,你要设置它,如果不是只有BOGUS线也是有条件块被评论,模式规则仍然有效。有任何想法吗?谢谢!

更新:我在Ubuntu 16.04 x86_64上运行GNU Make 4.1。所提出的Makefile对我确切的输出,不管我是否插入$(info hello)ifneq块内):

$ 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

您必须提供更多信息。我无法复制你的结果,使用任何版本的GNU make 3.79到当前的最新版本。你使用的是什么版本的GNU make?什么操作系统?请显示你得到的输出。如果你在'ifneq'块内添加'$(info hello)'这样的东西,它会被打印出来吗?你确定你试过这个_exact_例子,并确认你看到了它的行为吗? – MadScientist

回答

2

您有杂散制表符如下所示: -

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 

引起选项卡式线被解释为伪目标0的食谱 当他们是第一个非空,非注释行跟随该目标, 和控制ifneq是真实的。在这种情况下,当您运行make, 时,它们是而不是,即使ifneq被评估,并且为true。如果选择了伪目标.SUFFIXES:,则它们将被传递到执行的外壳, 扩展后$(...)

伪目标由make忽略作为候选默认的目标,所以 时只要运行make,你观察到默认的目标是caca 和选项卡式线已经被“忽略”。但是,如果你运行:

make .SUFFIXES 

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

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

这就很清楚,有翼线条的确配方(尽管 它的外壳可以没有意义)。

要修复,请删除这些选项卡或将它们替换为空格。谨慎的习惯决不会在制作文件中制表符缩进行,除非您打算将 选项卡式的行作为配方。