标签: cmake-custom-command

如何每次在 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})
Run Code Online (Sandbox Code Playgroud)

它可以工作,但并不是每次都执行。它仅在修改 CMakeLists.txt 时执行。

因此,经过一番搜索后,人们建议使用

add_custom_target(...)
Run Code Online (Sandbox Code Playgroud)

add_custom_command(...)
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

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}
    )
Run Code Online (Sandbox Code Playgroud)

它根本不运行脚本。我知道它没有运行该脚本,因为我在 Notepad++ 中打开了该文件,并且它不会询问我是否要像execute_process() 运行后那样切换到该文件的较新版本。add_custom_command() 的其他变体也不会运行该脚本。没有与此运行相关的错误,除非我不包含 ${PYTHON_EXECUTABLE} ,这会导致“%1 不是有效的 Win32 命令”。那么如何才能有效地让 Python 脚本每次都在 CMake 中运行呢?

编辑:这里的答案不起作用。 如何在构建时始终运行命令而不考虑任何依赖项?

cmake cmake-custom-command

7
推荐指数
1
解决办法
3万
查看次数

CMake add_custom_command 与 target_link_libraries

由于多种原因,我必须通过自定义命令手动生成静态库。

但是,似乎只有当目标明确请求其输出文件时才会执行自定义命令。

如果我尝试将生成的静态库与 链接target_link_libraries,CMake 会抱怨它找不到生成它的规则。

# Building library on the fly
add_custom_command(OUTPUT mylib.a
    COMMAND ...
)
add_executable(myexe main.cpp)                                                                                                                                                     
target_link_libraries(myexe mylib.a) # Fails miserably
Run Code Online (Sandbox Code Playgroud)

我想我必须在add_custom_command调用和target_link_libraries调用之间以某种方式插入目标或依赖项,但我无法理解如何正确执行此操作。

dependencies cmake static-libraries cmake-custom-command

6
推荐指数
1
解决办法
3965
查看次数

add_custom_command -- 在重建时更新依赖项列表

查看上次状态更新

初始条件

  • 代码生成器,生成一组 C++ 源代码,以一个输入文件作为参数
  • 输入文件可能包含其他输入文件
  • 已经解决了获取输出文件列表、解析输入代码生成文件以获取代码生成输入的完整列表的任务。即 add_custom_command 第一次提供了正确的依赖项集:

    add_custom_command(OUTPUT ${generatedSources}
                       COMMAND ${codegenCommand} ARGS ${codegenArgs}
                       DEPENDS ${codegenInputFiles})
    
    Run Code Online (Sandbox Code Playgroud)

问题场景

  • 当前系统运行良好,直到有人修改 codegen 输入文件之一以包含新的输入文件或删除现有输入文件的包含内容。在这种情况下,需要更新提供给 add_custom_command 作为依赖项的 codegen 输入文件列表,但我不知道如何

缺什么

  • 能够在项目重建时更新 add_custom_command 依赖项

有没有办法在不重建整个项目的情况下解决这个问题?

更新 - 替代(更好?)问题描述

我在 cmake 邮件列表上发现了类似的未回答的问题,为了更清楚起见,将其发布在这里: http: //article.gmane.org/gmane.comp.programming.tools.cmake.user/52279

我正在尝试让代码生成工具在依赖关系方面与 C 源文件“相同”。我的意思是,假设您有一个 C 文件“ac”。因为它可以#include文件,所以每次内容发生a.c变化,它的依赖关系也可能发生变化。使用 -MMD 重新扫描依赖项。我想要某种方法来为我的代码生成器模拟这一点。首先,我尝试了 add_custom_command,它采用固定的 DEPENDS 列表,在定义自定义命令时确定。具体来说,我的意思是这样的:

function(add_generated_library)
   figure_out_dependencies(deps ${ARGN})
   add_custom_command(... DEPENDS ${deps})
endfunction()
Run Code Online (Sandbox Code Playgroud)

但这仅捕获构建系统生成时的依赖关系。每次运行自定义命令时,DEPENDS 列表可能需要更改,因为更改可能意味着新的依赖项。我应该如何执行此操作?

更新 2 - 可能的解决方案

以下是我认为的事实 - 网络上有关于 cmake 支持动态依赖关系的声音,这是平滑集成许多重要的代码生成工具所必需的 - 没有现成的最佳解决方案可用,正如我们所见实际上需要的是钩子来添加对自定义 DSL 的支持到 IMPLICIT_DEPENDS

来自cmake手册:

IMPLICIT_DEPENDS 选项请求扫描输入文件的隐式依赖关系。给定的语言指定应使用其相应依赖关系扫描器的编程语言。目前仅支持 C 和 CXX 语言扫描程序。必须为 …

cmake cmake-custom-command

5
推荐指数
1
解决办法
2360
查看次数

CMake:如何在 add_custom_command(...) 中使用 if 条件

我想通过 add_custom_command(...) 在 CMakeLists.txt 中使用 Linux if 条件,因为我需要运行这些 if 条件并在 makefile 中做一些判断。像这样:

cmake_minimum_required(VERSION 2.8)
add_custom_target(temp_target ALL)
add_custom_command(TARGET temp_target
                   PRE_BUILD
                   COMMAND if ["a" != "b"]; then echo 1; fi;
                   VERBATIM )
Run Code Online (Sandbox Code Playgroud)

如果我想使用我该怎么办

if ["a" != "b"]; then echo 1; fi;
Run Code Online (Sandbox Code Playgroud)

什么时候制作makefile?非常感谢您的帮助!

linux bash makefile cmake cmake-custom-command

5
推荐指数
1
解决办法
5397
查看次数