我通常使用以下选项将宏定义从“make命令行”传递到“makefile”: -D名称=值。该定义可以在 makefile 中访问。
我还使用类似的编译器选项将宏定义从“makefile”传递到“源代码”: -Dname=value(许多编译器都支持)。这个定义可以在源代码中访问。
我现在需要的是允许我的 makefile 的用户能够立即将任意宏定义从“make.exe 命令行”传递到“源代码”,而无需更改 makefile 中的任何内容。
因此用户可以输入:
make -f mymakefile.mk -SOMEOPTION var=5
然后直接main.c中的代码就可以看到
var
:
int main()
{
int i = var;
}
这样调用
make
命令:
make CFLAGS=-Dvar=42
并确保在 Makefile 的编译命令中使用
$(CFLAGS)
。正如 @jørgensen 提到的,将变量赋值放在 make
命令之后将覆盖已在 Makefile 中定义的 CFLAGS
值。
或者,您可以将
-Dvar=42
设置为 CFLAGS
之外的另一个变量,然后在 CFLAGS
中重用此变量,以避免完全覆盖 CFLAGS
。
由于声誉较低,我无法评论已接受的答案。
我想提一下预定义变量
CPPFLAGS
。
它可能比 CFLAGS
或 CXXFLAGS
更适合,因为 GNU Make 手册将其描述为:
提供给 C 预处理器和使用它的程序的额外标志 (C 和 Fortran 编译器)。
CPPFLAGS
n.o
由 n.c
自动制成,配方如下:
$(CC) $(CPPFLAGS) $(CFLAGS) -c
n.o
由 n.cc
、n.cpp
或 n.C
自动制成,配方如下:
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
可以使用命令
make CPPFLAGS=-Dvar=123
来定义所需的宏。
只需使用特定变量即可。
$ cat Makefile
all:
echo foo | gcc $(USER_DEFINES) -E -xc -
$ make USER_DEFINES="-Dfoo=one"
echo foo | gcc -Dfoo=one -E -xc -
...
one
$ make USER_DEFINES="-Dfoo=bar"
echo foo | gcc -Dfoo=bar -E -xc -
...
bar
$ make
echo foo | gcc -E -xc -
...
foo
以这种方式调用 make
make CFLAGS=-Dvar=42
因为您确实想要覆盖 Makefile 的 CFLAGS,而不仅仅是环境(对于 Makefile 变量而言,环境的优先级较低)。
foo.c
main ()
{
int a = MAKE_DEFINE;
printf ("MAKE_DEFINE value:%d\n", a);
}
生成文件
all:
gcc -DMAKE_DEFINE=11 foo.c