我有一个使用GNU Autotools的QPhiX项目。前者需要一个名为QPhiX-Codegen的非常相关的项目。整个构建过程如下:
make
。那将编译代码生成器并运行它。在运行时,它将创建平坦的C ++代码。CMakeLists.txt
,以便可以编译生成的代码。cmake
生成的make
上运行Makefile
和cmake
,将生成的代码编译为静态库libqphix_codegen.a
。这三件事都包含在一个用./generate-and-compile $isa $cxx $cxxflags
调用的Bash脚本中。 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
生成的Makefile
上运行./configure
。此过程向用户公开了比实际需要更多的步骤。此外,用户必须将相同的ISA标志,相同的CXX
和相同的CXXFLAGS
传递给两个不同的脚本。然后他们还必须将代码生成器的这条路径放入./configure
。
我认为在QPhiX项目中让代码生成器成为git子模块对用户来说是最方便的。然后./configure
可以运行codegen/generate-and-compile
脚本并将选项传递给它。
我的问题是:如何在./configure
中运行脚本?我只是将我想要的片段放入configure.ac
吗?该文件看起来像一个带有一些宏的shell脚本,但我不确定这是否适合放置它。
答案 0 :(得分:1)
此过程向用户公开了比实际需要更多的步骤。也 用户必须传递相同的ISA标志,相同的
CXX
CXXFLAGS
到两个不同的脚本。然后他们也必须加入这个 代码生成器到./configure
的路径。
这些都是有效的批评。解决这些问题的最快捷,最简单的方法可能就是编写一个小包装脚本。但你问,
我如何在
./configure
中运行脚本?我只是 把我想要的片段放入configure.ac
?该文件看起来像一个shell 一些宏的脚本,但我不确定是否会这样 把它放在正确位置。
configure.ac
是m4
宏处理器的输入,使用特殊配置和Autotools以及可能的其他源提供的宏库。 Autoconf使用m4
处理它以生成configure
shell脚本。
最后,如果您希望configure
运行外部命令(例如另一个脚本),您必须直接在configure.ac
中编写该命令(您确实可以这样做)或使用宏这将导致命令被发送到输出脚本。没有内置的通用宏。您必须小心谨慎以避免或逃避m4
将尝试解释的语法,但可以这样做。实际上,宏库包含几个扩展到外部命令的宏示例,例如运行编译器的命令。
另一方面,configure
通过收集信息,编写和启动另一个脚本config.status
来运作。您可以选择让configure
发出要运行的命令config.status
;你会通过AC_CONFIG_FILES
的第二个和/或第三个参数来做到这一点。
第三方面,更新主项目的配置脚本以通过其他项目自动合并代码生成有效地将两个项目合并在一起。如果我要这样做,那么我倾向于进行比你似乎提议的更深入的融合。配置应该,实际上,仅限于准备合适的Makefile。所有代码生成和构建都可以通过一个(可能是递归的)make
运行来更好地处理。我认为没有理由认为在你的情况下无法实现这一点,但设置它会涉及更多的工作。