如何将编译器标志从 Autoconf 传递给 Automake?
Posted
技术标签:
【中文标题】如何将编译器标志从 Autoconf 传递给 Automake?【英文标题】:How to pass compiler flags from Autoconf to Automake? 【发布时间】:2017-11-03 20:13:05 【问题描述】:我正忙着将编译器选项从 Autoconf 导入 Automake。我的一些源文件有Automake per-object flags:
## Makefile.am
librijndael_simd_la_SOURCES = rijndael-simd.cpp
librijndael_simd_la_CXXFLAGS = $(AES_FLAG)
AES_FLAG
需要 IA-32、Aarch32/64 和 Power8 的架构标志。其他平台没有标志。以前,这些标志被硬编码在 Makefile.am
中。
在构建初始 Autotools 支持时,我正在尝试对 Autoconf 中的选项进行硬编码:
# configure.ac
AC_SUBST([GCM_FLAG], [-mssse3 -mpclmul])
AC_SUBST([AES_FLAG], [-msse4.1 -maes])
AC_SUBST([SHA_FLAG], [-msse4.2 -msha])
...
AC_OUTPUT(Makefile)
但结果是:
$ ./configure
...
checking how to run the C++ preprocessor... g++ -E
./configure: line 16195: -mpclmul: command not found
./configure: line 16199: -maes: command not found
./configure: line 16201: -msha: command not found
Autoconf 手册 3.1.2 The Autoconf Language 说要使用双括号([[
和 ]]
):
AC_SUBST([[GCM_FLAG]], [[-mssse3 -mpclmul]])
AC_SUBST([[AES_FLAG]], [[-msse4.1 -maes]])
AC_SUBST([[SHA_FLAG]], [[-msse4.2 -msha]])
结果(我猜这就是大多数人不遵循手册的原因):
$ autoreconf --force --install
...
error: AC_SUBST: `[AES_FLAG]' is not a valid shell variable name
configure.ac:50: the top level
autom4te: /usr/bin/m4 failed with exit status: 1
aclocal: error: echo failed with exit status: 1
autoreconf: aclocal failed with exit status: 1
我相信这是文档,但它没有提供示例或故障排除步骤:7.2 Setting Output Variables。
天真地,我以为会有 1000 多个博客展示如何执行这个简单的任务,但事实并非如此:autoconf pass compiler option to automake。
如何将编译器标志从 Autoconf 传递到 Automake?
【问题讨论】:
您能否添加处理 GCM_FLAG 和其他问题的Makefile.in
或 Makefile
段?
谢谢@Vicente。我从来没有走那么远(即,足够远到我的Makefile.am
变成Makefile
)。
只有在极少数情况下才需要或想要双括号。
如果我怀疑您发现的解决方案与您想的不一样,那么我强烈建议您提交minimal reproducible example。我认为您开始使用的单括号方法没有任何本质上的错误。
只是为了知道发生了什么,您可以在配置文件中显示 16195 附近的行。
【参考方案1】:
看起来您的配置是正确的。您的Makefile.am
或configure.ac
文件中可能有一个换行符 或任何其他字符,它们正在破坏您的构建系统。
我建议查看生成 Makefile
。您可以通过grep -nC5 AES_FLAG Makefile
来查看它的外观。这可能会给我们一些提示。
【讨论】:
谢谢@Vicente。这个问题被追踪到缺乏报价。也就是说,我需要使用AC_SUBST([GCM_FLAG], ["-mssse3 -mpclmul"])
。单括号或双括号都不够。
@jww 我很高兴你解决了这个谜。你的问题让我很困惑!
@jww,如果您确实解决了问题,我也很高兴您解决了问题。但是您描述的解决方案没有意义。您的autoreconf
错误可能已经消失,但请注意:我怀疑您最终会指定与您认为的不同的标志。以上是关于如何将编译器标志从 Autoconf 传递给 Automake?的主要内容,如果未能解决你的问题,请参考以下文章