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

时间:2016-08-22 08:54:21

标签: makefile macros automake

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

2 个答案:

答案 0 :(得分:1)

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

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

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

在编译FOO程序时会定义foo(它会为预处理程序标记添加' -DFOO和#39}。

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

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

使用包含以下内容的configure.ac:

FOODEF=KNURK
AC_SUBST(FOODEF)

,相当于#define KNURK

的每个源文件中都有foo

以上是非典型的,因为通常你会取代"自足的"标志,例如类似下面的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)

答案 1 :(得分:0)

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