CPPFLAGS
似乎是 GNU Make 的一个发明,在一些内置的配方中被引用。
如果您的程序由某些自由软件发行版构建,您可能会发现其中一些需要包来插入此变量,使用 CPPFLAGS
传递选项,例如 -D_WHATEVER=1
传递宏定义。
这种分离在 GNU 环境中是一个糟糕的想法,完全没有必要,因为:
有一种方法可以运行 gcc
只进行预处理(同时忽略与预处理无关的编译器选项)。
独立的 GNU cpp
对编译器选项具有容忍性,例如与预处理无关的警告选项 -W
,甚至代码生成选项如 -fstrict-aliasing
和链接器传递选项如 -Wl,--whatever
。
因此,一般来说,需要调用独立预处理器的构建系统只需将其传递给 $(CFLAGS)
。
作为一个编写
Makefile
的应用程序开发人员,您不能依赖于
CPPFLAGS
的存在。不熟悉开源构建的内部专家的用户将不知道
CPPFLAGS
,并且在构建您的程序时会执行像
make CFLAGS=-Dfoo=bar
这样的操作。如果这样做不起作用,他们会感到恼怒。
作为一个发行版维护者,您不能依赖于程序来拉取
CPPFLAGS
;即使是表现良好的程序也会拉取
CFLAGS
、
LDFLAGS
和
LDLIBS
。
对于应用程序开发人员来说,编写GNU Make代码以将预处理器标志从
$(CFLAGS)
中分离出来非常容易:
cpp_only_flags := $(foreach arg, \
$(CFLAGS), \
$(or $(filter -D%,$(arg)), \
$(filter -U%,$(arg)), \
$(filter -I%,$(arg)), \
$(filter -iquote%,$(arg)), \
$(filter -W%,$(arg)), \
$(filter -M%,$(arg)))) \
$(CPPFLAGS)
all:
@echo cpp_only_flags == $(cpp_only_flags)
演示:
$ make CFLAGS="-Wall -I/path/to/include -W -UMAC -DFOO=bar -o foo.o -lm"
cpp_only_flags == -Wall -I/path/to/include -W -UMAC -DFOO=bar
在GNU编译器和预处理器的情况下,这可能是不必要的;但它说明了一种技术,可以用于非GNU编译器和预处理器,在基于GNU Make的构建系统中使用。