我有一个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)
答案 0 :(得分:6)
好吧,我有一个万无一失的,非丑陋的方法让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)
两个关键部分是add_custom_target
和add_dependencies
,两者都是完成此项工作所必需的。将add_executable
放在CMakeLists.txt
之后。 enum_test
是指由add_executable
(列表中的第一个名称)创建的目标,因此您可以将其设置为项目名称。
您可以将自定义目标命名为您喜欢的任何内容(我在此使用run
),将run
和add_custom_target
中的add_dependencies
更改为其他内容。
还有一个额外的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)