gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:37 25 4
gpt4 key购买 nike

我有一个 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)

最佳答案

好吧,我有一个万无一失的方法,让 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_targetadd_dependencies,两者都是完成这项工作所必需的。将两者放在 CMakeLists.txt 中的 add_executable 之后。 enum_test 指的是由 add_executable 创建的目标(其列表中的第一个名称),因此您可以将其设置为您的项目名称。

您可以通过更改 add_custom_target 中的 run 将自定义目标命名为任何您喜欢的名称(我在这里使用 run) >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)

关于c++ - 如何让 CMake 在构建之前运行 python 脚本,以便为我的项目生成要在构建中使用的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49018868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com