2017-04-20 82 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 

這就很清楚,有翼線條的確配方(儘管 它的外殼可以沒有意義)。

要修復,請刪除這些選項卡或將它們替換爲空格。謹慎的習慣決不會在製作文件中製表符縮進行,除非您打算將 選項卡式的行作爲配方。