如何在 makefile.am 中设置我可以在代码中使用的宏

how to set macro in makefile.am that i can used in code

如何在 makefile.am 中设置我可以在代码中使用的宏,例如 #ifdef ABC,其中 ABC 变量在 makefile.am 中定义但可以在代码。我读过这个 question,这是关于如何在 makefile 中设置宏而不是 makefile.am

makefile 本身不关心你的代码,编译与否。这是编译器的工作。

如果您使用 GCC,您可以使用 -D 选项定义符号,如下所示:

gcc -DABC=3 -o main.o main.c

您当然可以像这样使用 Makefile 变量:

DEFINED_MACRO = ABC
target.o: file.c
    gcc -D$(DEFINED_MACRO)=3 -o target.o file.c

a Makefile.amMakefile 的模板(好吧,Makefile.in 是最终 Makefile 的模板)。 虽然 automake 会在 Makefile.am -> Makefile.in 翻译中生成相当多的代码,但它会保留部分不变,允许您插入自己的 make-code。

典型的(演示)Makefile.am 看起来像:

bin_PROGRAMS = foo
foo_SOURCES = xyz.c
foo_CPPFLAGS = -DFOO

编译 foo 程序时将定义 FOO(它向预处理器标志添加“-DFOO”)。

一个更复杂(和不寻常)的示例可能如下所示:

bin_PROGRAMS = foo
foo_SOURCES = xyz.c abc.c
foo_CPPFLAGS = -D@FOODEF@

configure.ac 包含如下内容:

FOODEF=KNURK
AC_SUBST(FOODEF)

相当于在每个源文件中为 foo

提供 #define KNURK

以上是非典型的,因为通常您会替换 "self-contained" 标志,例如类似下面的 Makefile.am:

bin_PROGRAMS = foo
foo_SOURCES = xyz.c abc.c
foo_CPPFLAGS = @FOODEFS@ -I/usr/include/fu/

伴随 configure.ac 片段,例如:

FOODEFS=
AC_ARG_WITH([knork], AC_HELP_STRING([--with-knork=<str>], [build with knork (or frozz otherwise]))
AS_IF([test "x$with_knork" = "xyes" ],FOODEFS="-DKNORK")
AS_IF([test "x$with_knork" = "xno" ], FOODEFS="-DFROZZ")
AC_SUBST(FOODEF)