General Automake principles
"Automake"简单来说就是将名为"Makefile.am"的文件转换为与 GNU 兼容的"Makefile.in", 以便与"configure"结合使用. 每个"Makefile.am"都是根据 make 语法编写的; "Automake"可以识别特殊的宏和目标名称, 并根据这些名称生成代码.
这里列举一些"Automake"规则与"make"规则的不同之处:
- 一般的"make"的注释会传递到输出(也就是会在输出中显示), 但是在"Automake"中, 以"##"开头的注释则不会传递到输出中.
- "Automake"支持 include 指令. 这些个指令不会传递到"Makefile.in", 而是由"Automake"处理 -- 以这种方式 include 的文件将被视为在文本层面上包含在"Makefile.am"中. 这可用于通过集中维护的文件将样板添加到项目中的每个"Makefile.am"中. 要 include 的文件名可以以
$(top_srcdir)
开头, 表示在相对于项目的最顶层目录找到它. 如果它是相对路径, 或者它以$(srcdir)
开头, 则它表示的是相对于当前目录. 例如, 如何从文件"config/Make-rules"(其中"config"是项目中的顶级目录)中引用样板代码的方式:
include $(top_srcdir)/config/Make-rules
- "Automake" 不传入到"Makefile.in"中的条件编译语句
- "Automake"中支持宏使用"+=", 这个被 Automake 翻译到"Makefile.in"中就是"=".
所有宏和 target(包括"Automake"无法识别的宏和 target)都传递到生成的"Makefile.in"中 -- 这是一种强大的扩展机制. 有时"Automake"会在内部定义宏或 target. 如果在"Makefile.am"中也定义了这些内容, 则以"Makefile.am"中的定义为准. 此功能提供了一种简便的方法, 可以以较小的方式定制输出的特定部分.
但是请注意, 覆盖生成的代码中未记录的部分是错误的(并且因此被 Automake"导出").
"Automake"还会扫描"configure.in". 有时, 它使用发现的信息来生成额外的代码, 有时则提供额外的错误检查. "Automake"还将每个 AC_SUBST
转换为"Makefile"变量. 这方便了多个方面: 不仅意味着无需再进行额外的工作即可在"Makefile.am"中引用这些宏, 而且由于"Automake"在读取任何"Makefile.am"之前会扫描"configure.in", 这还意味着可以在"configure.in"中一次定义"Automake"可以识别的特殊变量.
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于