Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在CMake构建中每次运行python脚本?_Cmake_Add Custom Command - Fatal编程技术网

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

如何在CMake构建中每次运行python脚本?,cmake,add-custom-command,Cmake,Add Custom Command,目前,我需要在CMake中每次运行一个Python脚本,该脚本生成一个.qrc文件。我不能使用Qt设计器,我必须使用CMake。 set(CMAKE_AUTORCC ON)正在使用中,每当添加资源或更改名称时都会失败,这就是python脚本的原因。脚本本身已经生成了输出,之后一切正常,所以我不需要CMake本身的输出。我目前尝试了以下方法: include(FindPythonInterp) set (py_cmd "QRC_Updater.py") execute_process(

目前,我需要在CMake中每次运行一个Python脚本,该脚本生成一个.qrc文件。我不能使用Qt设计器,我必须使用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_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\u EXECUTABLE},这会导致“%1”不是有效的Win32命令。那么,如何有效地让Python脚本在CMake中每次都运行呢

编辑: 这里的答案不起作用。

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

导入操作系统
打印(“测试”)
如果不存在os.path.exists(“TESTDIR”):
os.makedirs(“TESTDIR”)
打开时(“header.h”,“w+”):
os.utime(“header.h”,无)

也许您也需要在
添加自定义\u命令中使用
工作目录
?我实际上在添加自定义\u命令中使用了工作目录,并以相同的结果结束。脚本从未运行过。这个答案可能是重复的——似乎是达到目的的最优雅的方式,但不确定为什么它不是得分最好的答案。@Tsyvarev我也试过这个答案。脚本从不运行。如果你看评论,它显示了我已经尝试过的,几乎一字不差。这个问题的OP还说它工作不可靠。我不需要用它创建一个可执行文件,我只需要每次运行我的Python脚本__header.h是一个假文件,它诱使CMake每次都运行,而header.h是一个我不关心的文件,因为Python脚本创建了我需要的所有东西。我很抱歉没有具体说明这一点。我不能依赖检测到的更改,因为人们不应该直接更改.qrc文件。每当构建项目以考虑添加、删除和名称更改时,它都需要由脚本创建?这应该取决于它吗?不,从我现在看到的情况来看,如果_header.h和header.h不存在,并且不会在第一次构建项目时调用python脚本。添加depends in custom_命令应该会触发_header.h和header.h的重新生成,并因此对python脚本进行新调用。这是我用来欺骗CMake每次运行该命令的示例的一部分。如果你看我提供的链接,然后转到ideasman42的答案,它解释了。你认为你的脚本可以吗?因为,对我来说,上面的代码是有效的,每次我重建一个有关键字或没有关键字的项目都取决于自定义命令。我正在使用CMake 3.3.2
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}
)