如何将编译器标志从 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.inMakefile 段? 谢谢@Vicente。我从来没有走那么远(即,足够远到我的Makefile.am变成Makefile)。 只有在极少数情况下才需要或想要双括号。 如果我怀疑您发现的解决方案与您想的不一样,那么我强烈建议您提交minimal reproducible example。我认为您开始使用的单括号方法没有任何本质上的错误。 只是为了知道发生了什么,您可以在配置文件中显示 16195 附近的行。 【参考方案1】:

看起来您的配置是正确的。您的Makefile.amconfigure.ac 文件中可能有一个换行符 或任何其他字符,它们正在破坏您的构建系统。

我建议查看生成 Makefile。您可以通过grep -nC5 AES_FLAG Makefile 来查看它的外观。这可能会给我们一些提示。

【讨论】:

谢谢@Vicente。这个问题被追踪到缺乏报价。也就是说,我需要使用AC_SUBST([GCM_FLAG], ["-mssse3 -mpclmul"])。单括号或双括号都不够。 @jww 我很高兴你解决了这个谜。你的问题让我很困惑! @jww,如果您确实解决了问题,我也很高兴您解决了问题。但是您描述的解决方案没有意义。您的autoreconf 错误可能已经消失,但请注意:我怀疑您最终会指定与您认为的不同的标志。

以上是关于如何将编译器标志从 Autoconf 传递给 Automake?的主要内容,如果未能解决你的问题,请参考以下文章

使用 autoconf/automake,如何指定包含文件路径?

如何通过 Qt 项目文件将命令的输出作为编译器标志传递?

如何配置 mex 以将编译器标志传递给 nvcc

如何阻止CMake将特定于平台的标志传递给编译器?

`--defsym` 链接器标志如何将值传递给源代码?

将一个变量(一个标志)从 urls.py 传递给 django 中的 views.py