目前我每次都需要在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命令”。那么如何在CMake中每次都能有效地运行Python脚本?
编辑: 这里的答案不起作用。 How to always run command when building regardless of any dependency?
答案 0 :(得分:0)
您需要向自定义命令添加依赖项以检查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)