4

当 .qrc 文件中引用的文件内容发生更改时,我想设置 CMake 来构建 qresource 文件。例如,我有一些 qml 文件被打包成一个 qrc 文件,如果 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 文件?

我需要做这样复杂的事情吗?

4

2 回答 2

0

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

因此,据我了解,您可以做的是使用add_custom_target始终执行)但不仅将 qrc 文件添加到其依赖项中,还要编写一些脚本,该脚本会检查 qrc 中引用的文件是否也是最新的,如果他们不是,然后触摸 qrc 文件)。

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

于 2014-02-10T07:18:41.530 回答
0

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

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

正确配置依赖项,您应该能够仅在真正需要时重新编译文件。

于 2013-09-12T10:49:08.223 回答