Makefile:为什么在.后缀之后立即忽略条件块?

Makefile:为什么在.后缀之后立即忽略条件块?,makefile,Makefile,有人能解释为什么条件ifneq块紧跟在后缀:目标之后被忽略,但如果两者之间有什么东西,就不能解释了吗 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

有人能解释为什么条件
ifneq
块紧跟在
后缀:
目标之后被忽略,但如果两者之间有什么东西,就不能解释了吗

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
但是,如果我取消注释
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

您有虚假的制表符,如图所示:-

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
(保留
BOGUS
注释),您将看到:

COMPILE_FLAGS += 
make: COMPILE_FLAGS: Command not found
Makefile:13: recipe for target '.SUFFIXES' failed
make: *** [.SUFFIXES] Error 127
明确标签行确实是一个配方(尽管是一个配方) 外壳无法理解的)

若要修复此问题,请删除这些选项卡或将其替换为空格。这个 谨慎的习惯是永远不要在makefile中制表缩进行,除非您打算这样做
标签行是一个配方。

您必须提供更多信息。我无法使用从3.79到当前最新版本的GNU make的任何版本复制您的结果。您使用的GNU make版本是什么?什么操作系统?请显示您得到的输出。如果在
ifneq
块中添加类似
$(info hello)
的内容,它会被打印吗?您确定您尝试了这个确切的示例并验证了您看到了它的行为吗?
make .SUFFIXES
COMPILE_FLAGS += 
make: COMPILE_FLAGS: Command not found
Makefile:13: recipe for target '.SUFFIXES' failed
make: *** [.SUFFIXES] Error 127