运行 配置 运行 期间的脚本

Run a script during the run of configure

我有一个使用 GNU Autotools 的项目 QPhiX。前者需要一个非常相关的项目,叫做QPhiX-Codegen。整个构建过程是这样的:

  1. 运行 make 在 QPhiX-Codegen 中。这将编译代码生成器并 运行 它。 运行ning 时,它将创建平面 C++ 代码。
  2. 运行 Python 脚本使用模板引擎将平面 C++ 代码包装到完整的头文件和源代码文件中。这也将创建一个 CMakeLists.txt 以便可以编译生成的代码。
  3. 运行cmakemakeMakefile生成cmake将生成的代码编译成静态库,libqphix_codegen.a .

这三件事都包含在一个 Bash 脚本中,可以用 ./generate-and-compile $isa $cxx $cxxflags 调用。 ISA 可以是 AVX2,C++ 编译器可以是 mpiicpc.

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

  1. 运行 ./configure ... --enable-arch=ISA --with-codegen=path/to/codegen/directory CXX=$CXX CXXFLAGS=$CXXFLAGS 创建 Makefile。在 Makefile 中,它将具有所需的编译器标志以包含生成的头文件和 link 到 libqphix_codegen.a
  2. 运行 makeMakefile 上由 ./configure 生成。

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

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

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

This process exposes more steps to the user than really needed. Also the user has to pass the same ISA flag, the same CXX and the same CXXFLAGS to two different scripts. Then they also have to put in this path to the code generator into the ./configure.

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

How would I run a script in the ./configure? Do I just put the snippet I want into configure.ac? That file looks like a shell script with some macros, but I am not sure whether that would be the right spot to put it.

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

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

另一方面,configure 通过收集信息以及编写和启动 另一个 脚本 config.status 来运作。您可以选择让 configure 将您想要的命令 运行 发送到 config.status;您可以通过 AC_CONFIG_FILES.

的第二个和/或第三个参数来执行此操作

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