2017-06-02 137 views
2

我有一个使用GNU Autotools的项目QPhiX。有一个非常相关的项目叫做QPhiX-Codegen,它是前者需要的。整体构建过程如下所示:运行配置时运行脚本

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

这三样东西都包装在Bash脚本中,用./generate-and-compile $isa $cxx $cxxflags调用。 ISA可以是AVX2,C++编译器可以我mpiicpc

然后一个切换目录QPhiX并继续构建过程:

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

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

    我的问题是:我将如何在./configure中运行脚本?我只是把我想要的片段放入configure.ac?该文件看起来像一个shell脚本与一些宏,但我不知道这是否是正确的地方把它放在

    +0

    另请参阅Automake手册中的[27.8 Per-Object Flags Emulation](https://www.gnu.org/software/automake/manual/html_node/Per_002dObject-Flags.html)。 – jww

    回答

    1

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

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

    我该如何运行./configure脚本?我只是 把我想要的片段放入configure.ac?该文件看起来像像一个壳 脚本与一些宏,但我不知道这是否是 正确的地方把它。

    configure.ac是用于m4宏处理器输入端,在特殊的配置,并通过自动工具和可能的其他来源提供宏的库绘图。 Autoconf使用m4处理它以生成configure shell脚本。如果你想让configure运行一个外部命令(例如另一个脚本),你必须直接在configure.ac(你确实可以这样做)写这个命令,或者使用一个宏来使命令成为发射到输出脚本中。没有内置的通用宏。你必须小心谨慎,以避免或逃避m4将尝试解释的语法,但它可以完成。实际上,宏库包含几个扩展为外部命令的宏的例子,例如运行编译器的命令。

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

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

    +0

    看起来我更喜欢'make'中的子项目脚本。我如何将一个目标添加到主'Makefile'中,使得其他所有内容都依赖于该目标? –