运行 配置 运行 期间的脚本
Run a script during the run of configure
我有一个使用 GNU Autotools 的项目 QPhiX。前者需要一个非常相关的项目,叫做QPhiX-Codegen。整个构建过程是这样的:
- 运行
make
在 QPhiX-Codegen 中。这将编译代码生成器并 运行 它。 运行ning 时,它将创建平面 C++ 代码。
- 运行 Python 脚本使用模板引擎将平面 C++ 代码包装到完整的头文件和源代码文件中。这也将创建一个
CMakeLists.txt
以便可以编译生成的代码。
- 运行
cmake
和make
就Makefile
生成cmake
将生成的代码编译成静态库,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
中,它将具有所需的编译器标志以包含生成的头文件和 link 到 libqphix_codegen.a
。
- 运行
make
在 Makefile
上由 ./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.ac
是 m4
宏处理器的输入,利用特殊配置和由 Autotools 和可能的其他来源提供的宏库。 Autoconf 使用 m4
处理它以生成 configure
shell 脚本。
最后,如果你想 configure
到 运行 一个外部命令(例如另一个脚本),你必须直接在 configure.ac
中写那个命令(你确实可以do) 或使用宏将命令发送到输出脚本中。没有内置的通用宏。您必须小心避免或转义 m4
将尝试解释的语法,但这是可以做到的。实际上,宏库包含几个扩展为外部命令的宏示例,例如 运行 编译器的命令。
另一方面,configure
通过收集信息以及编写和启动 另一个 脚本 config.status
来运作。您可以选择让 configure
将您想要的命令 运行 发送到 config.status
;您可以通过 AC_CONFIG_FILES
.
的第二个和/或第三个参数来执行此操作
另一方面,更新主项目的配置脚本以通过其他项目自动合并代码生成有效地将两个项目合并在一起。如果我打算那样做,那么我会倾向于执行比你似乎提议的更深入的合并。实际上,配置应该仅限于准备合适的 Makefile。所有的代码生成和构建最好由一个(可能是递归的)make
运行 来处理。我看不出有任何理由认为您的情况无法实现,但设置它需要更多工作。
我有一个使用 GNU Autotools 的项目 QPhiX。前者需要一个非常相关的项目,叫做QPhiX-Codegen。整个构建过程是这样的:
- 运行
make
在 QPhiX-Codegen 中。这将编译代码生成器并 运行 它。 运行ning 时,它将创建平面 C++ 代码。 - 运行 Python 脚本使用模板引擎将平面 C++ 代码包装到完整的头文件和源代码文件中。这也将创建一个
CMakeLists.txt
以便可以编译生成的代码。 - 运行
cmake
和make
就Makefile
生成cmake
将生成的代码编译成静态库,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
中,它将具有所需的编译器标志以包含生成的头文件和 link 到libqphix_codegen.a
。 - 运行
make
在Makefile
上由./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 sameCXXFLAGS
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 intoconfigure.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.ac
是 m4
宏处理器的输入,利用特殊配置和由 Autotools 和可能的其他来源提供的宏库。 Autoconf 使用 m4
处理它以生成 configure
shell 脚本。
最后,如果你想 configure
到 运行 一个外部命令(例如另一个脚本),你必须直接在 configure.ac
中写那个命令(你确实可以do) 或使用宏将命令发送到输出脚本中。没有内置的通用宏。您必须小心避免或转义 m4
将尝试解释的语法,但这是可以做到的。实际上,宏库包含几个扩展为外部命令的宏示例,例如 运行 编译器的命令。
另一方面,configure
通过收集信息以及编写和启动 另一个 脚本 config.status
来运作。您可以选择让 configure
将您想要的命令 运行 发送到 config.status
;您可以通过 AC_CONFIG_FILES
.
另一方面,更新主项目的配置脚本以通过其他项目自动合并代码生成有效地将两个项目合并在一起。如果我打算那样做,那么我会倾向于执行比你似乎提议的更深入的合并。实际上,配置应该仅限于准备合适的 Makefile。所有的代码生成和构建最好由一个(可能是递归的)make
运行 来处理。我看不出有任何理由认为您的情况无法实现,但设置它需要更多工作。