如何在CMake构建中每次运行python脚本?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在CMake构建中每次运行python脚本?相关的知识,希望对你有一定的参考价值。
目前,我每次都需要在CMake中运行Python脚本,生成.qrc文件。我不能使用Qt Designer,我必须使用CMake。 set(CMAKE_AUTORCC ON)正在使用,并且无论何时添加资源或更改名称都会失败,因此是python脚本的原因。脚本本身已经生成输出,之后一切正常,所以我不需要CMake本身的输出。我目前尝试过以下方法:
include(FindPythonInterp)
set (py_cmd "QRC_Updater.py")
execute_process(
COMMAND ${PYTHON_EXECUTABLE} ${py_cmd}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
RESULT_VARIABLE py_result
)
message(STATUS "Python result: ${py_result})
它工作,但它不会每次都执行。它仅在修改CMakeLists.txt时执行。
经过一番搜索,人们建议使用
add_custom_target(...)
和
add_custom_command(...)
我也试过这个:
add_custom_target(
always_run_target ALL
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/__header.h
)
add_custom_command(
OUTPUT
${CMAKE_CURRENT_BINARY_DIR}/__header.h
${CMAKE_CURRENT_BINARY_DIR}/header.h
COMMAND ${PYTHON_EXECUTABLE} ${py_cmd}
)
根本不运行脚本。我知道它没有运行脚本,因为我在Notepad ++中打开了文件,并且它不会询问我是否要像在execute_process()运行后那样切换到文件的较新版本。 add_custom_command()的其他变体也不会运行该脚本。没有与此运行相关的错误,除非我不包含$ {PYTHON_EXECUTABLE},这导致“%1不是有效的Win32命令”。那么如何才能有效地让Python脚本在CMake中每次运行?
编辑:这里的答案不起作用。 How to always run command when building regardless of any dependency?
您需要在自定义命令中添加依赖项以检查OriginalHeader.h上的更改,并在其发生更改时重新生成__header.h和header.h。
add_executable(MyExe main.cpp ${CMAKE_CURRENT_BINARY_DIR}/__header.h)
add_custom_target(
always_run_target ALL
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/__header.h
)
add_custom_command(
OUTPUT
${CMAKE_CURRENT_BINARY_DIR}/__header.h
${CMAKE_CURRENT_BINARY_DIR}/header.h
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/OriginalHeader.h
COMMAND python ${py_cmd}
)
我只用python改变了$ {PYTHON_EXECUTABLE}。我能够运行这个python脚本(下面)打印,创建一个目录并在每次在OriginalHeader.h中检测到更改时生成两个文件__header.h和header.h,或者__header.h / header.h不还存在。
import os
print("TEST")
if not os.path.exists("TESTDIR"):
os.makedirs("TESTDIR")
with open("header.h", 'w+'):
os.utime("header.h", None)
以上是关于如何在CMake构建中每次运行python脚本?的主要内容,如果未能解决你的问题,请参考以下文章
在 CMake 中构建时运行 python 脚本,不需要依赖项
如何在CMAKE和CLION中的每次构建后运行复制脚本? [重复]
如何使用 Visual Studio Code 为 cmake 添加预构建步骤?
与 Java 和 Python 相比,为啥每次使用 Cmake 运行 C++ 程序都需要这么长时间?