CPPFLAGS
似乎是 GNU Make 的一项发明,在它的一些内置配方中被引用。
如果您的程序是由一些自由软件发行版构建的,您可能会发现其中一些需要包来插入此变量,CPPFLAGS
用于传递选项,例如-D_WHATEVER=1
传递宏定义。
这种分离是一个糟糕的主意,在 GNU 环境中完全没有必要,因为:
有一种方法可以运行gcc
只进行预处理(同时忽略与预处理无关的编译器选项)。
独立的 GNUcpp
可以容忍编译器选项,例如-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) # also pull this in
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 Make 的构建系统中用于非 GNU 编译器和预处理器的技术。