5

目前我需要每次在 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 中每次都运行呢?

编辑:这里的答案不起作用。 无论任何依赖关系如何在构建时始终运行命令?

4

1 回答 1

4

您需要向自定义命令添加依赖项以检查 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} 。每次在 OriginalHeader.h 或 __header.h/header.h 中检测到更改时,我都能够运行此打印、创建目录并生成两个文件 __header.h 和 header.h 的 python 脚本(如下)还存在。

import os

print("TEST")

if not os.path.exists("TESTDIR"):
    os.makedirs("TESTDIR")
with open("header.h", 'w+'):
    os.utime("header.h", None)
于 2018-03-02T09:31:17.100 回答