如何在构建之前使CMake运行python脚本,以便为我的项目生成文件以在构建中使用?

irf*_*fna 4 c++ cmake

我有一个python脚本解析项目目录中的所有C++源文件,在文件中查找一些东西,然后生成一个文件.这个python脚本工作正常,但我希望它在构建我的C++项目之前自动运行.

所以基本上,我希望这个python脚本在每次构建之前运行,所以如果任何.h或.cpp文件已被更改.如果python脚本本身已被更改,我也希望它能运行.我有问题的python脚本,genenums.py与我的C++源文件在同一目录中,如main.cpp等.

我已经尝试过add_custom_command基于文档的实验,但我不能让cmake在任何实例中运行这个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)
Run Code Online (Sandbox Code Playgroud)

irf*_*fna 7

好吧,我有一个万无一失的,非丑陋的方式让cmake在构建构建依赖项之前运行任何类型的命令,等待命令在构建之前完成.

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)
Run Code Online (Sandbox Code Playgroud)

两个关键部分是add_custom_targetadd_dependencies,两者都需要使这项工作.在之后进行都add_executableCMakeLists.txt. enum_test指的是由add_executable(列表中的第一个名称)创建的目标,因此您将其设置为项目的名称.

您可以命名自定目标,以任何你喜欢(我用run改变这里)run在两个add_custom_targetadd_dependencies别的东西.

有一个额外的捕获add_custom_target... WORKING_DIRECTORY在我的python脚本没有做任何事情.即使我尝试设置为WORKING_DIRECTORYto ${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}
Run Code Online (Sandbox Code Playgroud)

这里有完整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)
Run Code Online (Sandbox Code Playgroud)