任何人都可以解釋爲什麼條件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