【问题标题】:cmake run xxd as custom commandcmake 将 xxd 作为自定义命令运行
【发布时间】:2013-01-20 07:19:05
【问题描述】:

我有一个rc 目录,我想在该目录中递归运行xxd -i filename。并将生成的文件添加到我的项目中。

我在 lua 上检查了一些 answer。我也是这样做的。

SET(RESOURCE_COMPILER "xxd")
SET(COMPILED_RESOURCES "rc/base.css rc/common.js")
FOREACH(F ${COMPILED_RESOURCES})
    ADD_CUSTOM_COMMAND(
        OUTPUT "${COMPILED_RESOURCES}/${F}"
        COMMAND ${RESOURCE_COMPILER} -i "${COMPILED_RESOURCES}/${F}"
        COMMENT "Compiling ${F} to binary")
    LIST (APPEND COMPILED_RESOURCES "${COMPILED_RESOURCES}/${F}")
ENDFOREACH()

但我根本没有看到任何文件生成。

【问题讨论】:

    标签: c++ cmake embedded-resource


    【解决方案1】:

    您可能看不到输出文件有几个原因。您的 xxd 命令在 add_custom_command 中的格式不正确,但只有在同一 CMakeLists.txt 中的另一个 CMake 目标(exe 或 lib)中需要输出文件作为源时,才会执行该命令。

    我会将您的 sn-p 更改为:

    SET(RESOURCE_COMPILER xxd)
    FILE(GLOB_RECURSE COMPILED_RESOURCES "rc/*")
    FOREACH(INPUT_FILE ${COMPILED_RESOURCES})
        SET(OUTPUT_FILE ${INPUT_FILE}.hex)
        ADD_CUSTOM_COMMAND(
            OUTPUT ${OUTPUT_FILE}
            COMMAND ${RESOURCE_COMPILER} -i ${INPUT_FILE} ${OUTPUT_FILE}
            COMMENT "Compiling ${INPUT_FILE} to binary")
        LIST(APPEND COMPILED_RESOURCES ${OUTPUT_FILE})
    ENDFOREACH()
    

    然后,如果您有另一个依赖于${OUTPUT_FILE}s 的目标,则该命令将在构建该目标时执行:

    ADD_EXECUTABLE(MY_EXE main.cc ${COMPILED_RESOURCES})
    

    【讨论】:

    • 我在循环中放了一个 MESSAGE。我观察到没有空间。但即使我用${RESOURCE_COMPILER} " -i " ${INPUT_FILE} 修复了这个问题,也没有生成任何文件。
    • 将message 放入循环中不会对add_custom_command 执行的命令产生正确的印象。 args 都是单独传递给 xxd 的,并适当添加了空格。应该没有必要做" -i "。如果你想检查你的命令格式是否正确,你可以暂时将execute_process(COMMAND ${RESOURCE_COMPILER} -i ${CMAKE_SOURCE_DIR}/rc/base.css ${CMAKE_SOURCE_DIR}/rc/base.css.hex) 添加到你的 CMakeLists.txt 中。这将在每次调用 cmake 时运行,并让您查看该命令是否正在执行您想要的操作。
    • 那么我应该用execute_process 替换ADD_CUSTOM_COMMAND 吗?
    • 我只需添加 execute_process 以测试您的 COMMAND 参数是否正常,然后再次删除它。每次运行 CMake 时都会调用 execute_process,而您的 add_custom_command 需要运行 cmake,然后还需要构建一个依赖于自定义命令的 OUTPUT 的目标,然后才能调用实际的自定义命令。这只是检查COMMAND 部分是否格式正确并按预期执行的更快方法。
    • 这对我来说是救命稻草。两件事,您可以使用 find_program(RESOURCE_COMPILER xxd) 而不是 set 并将 cmake 命令的大小写更改为小写
    猜你喜欢
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2018-12-15
    • 2015-04-16
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多