在构建之前,如何使Cmake在构建之前运行Python脚本,以生成用于构建中的项目的文件

How do I make CMake run a python script before building, in order to generate files for my project to be used in the build?

本文关键字:构建 用于 文件 项目 Python 何使 Cmake 运行 脚本      更新时间:2023-10-16

我有一个python脚本,该脚本在项目目录中解析了所有C 源文件,在文件中寻找一些内容,然后生成文件。这个python脚本正常工作,但是我希望它在构建我的C 项目之前自动运行。

基本上,我希望这个python脚本在每个构建之前运行,因此,如果更改了任何.h或.cpp文件。如果Python脚本本身已更改,我也希望它运行。我的python脚本在有问题的 genenums.py中,与我的C 源文件(例如main.cpp(相同的目录,等等。

我尝试过基于文档的add_custom_command尝试,但是无论如何我都无法运行此Python脚本。我不确定如何使这项工作正确,因为我是Cmake的新手。

这是我当前的cmake文件:

cmake_minimum_required(VERSION 3.9)
project(enum_test)
set(CMAKE_CXX_STANDARD 17)
include_directories(include)
find_package( PythonInterp 2.7 REQUIRED )
find_package( PythonLibs 2.7 REQUIRED )
add_custom_command(
 COMMAND ${PYTHON_EXECUTABLE} genenums.py
 DEPENDS genenums.py $(CMAKE_CURRENT_BINARY_DIR)
 OUTPUT enums.h
 WORKING_DIRECTORY $(CMAKE_CURRENT_BINARY_DIR)
 COMMENT "Generating enums"
)
add_executable(enum_test main.cpp test.h test.cpp)

好吧,我有一种万无一失的,非态度的方式,可以在构建构建依赖项之前立即运行任何类型的命令,等到命令完成构建之前完成命令。

add_custom_target(
 run ALL
 COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/genenums.py ${CMAKE_CURRENT_SOURCE_DIR}
 BYPRODUCTS enums.h
 COMMENT "Generating enums"
)
add_dependencies(enum_test run)

两个关键部分是add_custom_targetadd_dependencies,都需要进行此工作。将两个在add_executable之后放置在CMakeLists.txt中。enum_test是指add_executable创建的目标(其列表中的名字(,因此您将其设置为项目的名称。

您可以通过更改add_custom_targetadd_dependencies中的run将自定义目标命名为您喜欢的任何东西(我在此使用run(。

add_custom_target ... WORKING_DIRECTORY又有一个捕获量对我的python脚本没有任何作用。即使我尝试将WORKING_DIRECTORY设置为${CMAKE_CURRENT_SOURCE_DIR},脚本也会在默认的${CMAKE_CURRENT_BINARY_DIR}中执行。

因此,对于此捕获量,无论您使用的命令所需要的任何命令都需要能够采用${CMAKE_CURRENT_SOURCE_DIR}的命令行参数,并使用它在源目录中正确操作(假设这是您的目标(。这就是为什么我在这条线结束时拥有${CMAKE_CURRENT_SOURCE_DIR}

 COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/genenums.py ${CMAKE_CURRENT_SOURCE_DIR}

这是具有工作设置的完整CMakeLists.txt,应该很容易适应任何特定项目的CMakeLists.txt

cmake_minimum_required(VERSION 3.9)
project(enum_test)
set(CMAKE_CXX_STANDARD 17)
include_directories(include)
find_package( PythonInterp 2.7 REQUIRED )
add_executable(enum_test enums.h main.cpp test.h test.cpp)
add_custom_target(
 run ALL
 COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/genenums.py ${CMAKE_CURRENT_SOURCE_DIR}
 BYPRODUCTS enums.h
 COMMENT "Generating enums"
)
add_dependencies(enum_test run)