目前我需要每次在 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 中运行呢?
编辑:这里的答案不起作用。 如何在构建时始终运行命令而不考虑任何依赖项?
由于多种原因,我必须通过自定义命令手动生成静态库。
但是,似乎只有当目标明确请求其输出文件时才会执行自定义命令。
如果我尝试将生成的静态库与 链接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调用之间以某种方式插入目标或依赖项,但我无法理解如何正确执行此操作。
查看上次状态更新
初始条件
已经解决了获取输出文件列表、解析输入代码生成文件以获取代码生成输入的完整列表的任务。即 add_custom_command 第一次提供了正确的依赖项集:
add_custom_command(OUTPUT ${generatedSources}
COMMAND ${codegenCommand} ARGS ${codegenArgs}
DEPENDS ${codegenInputFiles})
Run Code Online (Sandbox Code Playgroud)问题场景
缺什么
有没有办法在不重建整个项目的情况下解决这个问题?
更新 - 替代(更好?)问题描述
我在 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 语言扫描程序。必须为 …
我想通过 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?非常感谢您的帮助!