将文件依赖项添加到自定义目标

时间:2013-09-12 02:29:37

标签: cmake

当.qrc文件中引用的文件内容发生变化时,我想设置CMake来构建qresource文件。例如,我有一些打包到qrc文件中的qml文件,如果qml文件被更改,则需要重新编译qrc。

我有以下宏来运行资源编译器,但只有在资源文件本身发生更改时才会重建它。

MACRO(PYQT5_WRAP_RC outfiles)
  FOREACH(it ${ARGN})
    GET_FILENAME_COMPONENT(outfile ${it} NAME_WE)
    GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
    SET(outfile ${CMAKE_CURRENT_SOURCE_DIR}/${outfile}_rc.py)
    ADD_CUSTOM_TARGET(${it} ALL
      DEPENDS ${outfile}
    )
    ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
      COMMAND ${PYRCC5BINARY} ${infile} -o ${outfile}
      MAIN_DEPENDENCY ${infile}
    )
    SET(${outfiles} ${${outfiles}} ${outfile})
  ENDFOREACH(it)
ENDMACRO (PYQT5_WRAP_RC)

宏的使用方式如下:

PYQT5_WRAP_RC(rc_gen file1.qrc file2.qrc ...)

如果qrc文件中引用的文件之一发生变化,我该怎么做才能重新编译qrc文件?

我需要做一些事情convoluted like this吗?

2 个答案:

答案 0 :(得分:0)

在我看来,您正在寻找的命令是add_custom_command

  

这定义了一个生成指定OUTPUT文件的命令。目标   在指定any的同一目录(CMakeLists.txt文件)中创建   自定义命令的输出作为源文件被赋予规则   在构建时使用命令生成文件。

正确配置依赖项,只有在真正需要时才能重新编译文件。

答案 1 :(得分:0)

如果我理解你的情况,问题是CMake不知道qrc文件是什么,也不知道,qrc文件引用了其他一些文件。这种依赖关系是CMake隐含的(与C ++包含比较;但对于那些cmake有特殊机制来检测依赖关系)。

所以,据我所知,你可以做的是使用add_custom_target(执行始终),但不仅要将qrc文件添加到其依赖,还要编写一些脚本,哪个检查qrc中引用的文件也是最新的,如果不是,则触摸qrc文件。)

当然,您可以使用上面引用的其他答案中的方法来触摸qrc文件,但是您必须开发自己的脚本来提取qrc文件中引用的文件路径。然后,您可以使用CMake脚本设施检查它们是否是最新的并触摸qrc文件。