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