在构建之前,如何使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脚本,该脚本在项目目录中解析了所有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_target
和add_dependencies
,都需要进行此工作。将两个在add_executable
之后放置在CMakeLists.txt
中。enum_test
是指add_executable
创建的目标(其列表中的名字(,因此您将其设置为项目的名称。
您可以通过更改add_custom_target
和add_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)
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- meson-build:wxWidgets 资源文件,用于 Windows 未构建
- 用于构建 cuda .so 文件(共享库)的生成文件
- 用于自定义调试构建的 CMake qt 输入库后缀
- C++查找用于构建单行计算器
- 使用VS2017构建用于Linux的Protobuf
- 构建共享对象 - 使用 Ninja 编译适用于 OSX 和 Windows 上的 Ubuntu Crush
- MoltenVK(适用于 Vulkan)构建在 OS X v. 10.13.3 (17D102) 上失败 |Xcode
- 在构建之前,如何使Cmake在构建之前运行Python脚本,以生成用于构建中的项目的文件
- 用于构建 POCO 库的 mysql 连接器
- 构建适用于 iOS 的 ICU
- Cmake:如何构建自定义编译器二进制文件,然后将其用于某些目标?
- mac构建有一个未定义的符号,而linux构建并没有用于相同的代码
- 在霍夫曼压缩后将代码表存储在压缩文件中,并从此表构建用于解压缩的树
- 同时构建用于提升的32位和64位库
- 用g++构建用于MSVC应用程序的dll
- 正在构建用于Oracle jvm的avahi(错误:jni.h未找到)
- 在Xcode 4中构建用于Objective-c应用程序的静态c++库
- 正在构建用于编译boost的Openssl源代码