如何在CMake构建中每次运行python脚本?

时间:2018-03-01 15:51:00

标签: cmake add-custom-command

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

1 个答案:

答案 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)