在configure运行期间运行脚本

时间:2017-06-02 07:58:46

标签: autotools autoconf

我有一个使用GNU Autotools的QPhiX项目。前者需要一个名为QPhiX-Codegen的非常相关的项目。整个构建过程如下:

  1. 在QPhiX-Codegen中运行make。那将编译代码生成器并运行它。在运行时,它将创建平坦的C ++代码。
  2. 运行一个Python脚本,该脚本使用模板引擎将该平面C ++代码包装成完整的头文件和源代码文件。这也将创建一个CMakeLists.txt,以便可以编译生成的代码。
  3. cmake生成的make上运行Makefilecmake,将生成的代码编译为静态库libqphix_codegen.a
  4. 这三件事都包含在一个用./generate-and-compile $isa $cxx $cxxflags调用的Bash脚本中。 ISA可以是AVX2,C ++编译器可以mpiicpc

    然后将目录切换到QPhiX并继续构建过程:

    1. 运行./configure ... --enable-arch=ISA --with-codegen=path/to/codegen/directory CXX=$CXX CXXFLAGS=$CXXFLAGS以创建Makefile。在Makefile中,它将包含所需的编译器标志,以包含生成的头文件并链接到libqphix_codegen.a
    2. make生成的Makefile上运行./configure
    3. 此过程向用户公开了比实际需要更多的步骤。此外,用户必须将相同的ISA标志,相同的CXX和相同的CXXFLAGS传递给两个不同的脚本。然后他们还必须将代码生成器的这条路径放入./configure

      我认为在QPhiX项目中让代码生成器成为git子模块对用户来说是最方便的。然后./configure可以运行codegen/generate-and-compile脚本并将选项传递给它。

      我的问题是:如何在./configure中运行脚本?我只是将我想要的片段放入configure.ac吗?该文件看起来像一个带有一些宏的shell脚本,但我不确定这是否适合放置它。

1 个答案:

答案 0 :(得分:1)

  

此过程向用户公开了比实际需要更多的步骤。也   用户必须传递相同的ISA标志,相同的CXX   CXXFLAGS到两个不同的脚本。然后他们也必须加入这个   代码生成器到./configure的路径。

这些都是有效的批评。解决这些问题的最快捷,最简单的方法可能就是编写一个小包装脚本。但你问,

  

我如何在./configure中运行脚本?我只是   把我想要的片段放入configure.ac?该文件看起来像一个shell   一些宏的脚本,但我不确定是否会这样   把它放在正确位置。

configure.acm4宏处理器的输入,使用特殊配置和Autotools以及可能的其他源提供的宏库。 Autoconf使用m4处理它以生成configure shell脚本。

最后,如果您希望configure运行外部命令(例如另一个脚本),您必须直接在configure.ac中编写该命令(您确实可以这样做)或使用宏这将导致命令被发送到输出脚本。没有内置的通用宏。您必须小心谨慎以避免或逃避m4将尝试解释的语法,但可以这样做。实际上,宏库包含几个扩展到外部命令的宏示例,例如运行编译器的命令。

另一方面,configure通过收集信息,编写和启动另一个脚本config.status来运作。您可以选择让configure发出要运行的命令config.status;你会通过AC_CONFIG_FILES的第二个和/或第三个参数来做到这一点。

第三方面,更新主项目的配置脚本以通过其他项目自动合并代码生成有效地将两个项目合并在一起。如果我要这样做,那么我倾向于进行比你似乎提议的更深入的融合。配置应该,实际上,仅限于准备合适的Makefile。所有代码生成和构建都可以通过一个(可能是递归的)make运行来更好地处理。我认为没有理由认为在你的情况下无法实现这一点,但设置它会涉及更多的工作。