2013-01-20 42 views
0

我有rc目录我想在该目录中递归运行xxd -i filename并将生成的文件添加到我的项目中。cmake运行xxd作为自定义命令

我正在检查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() 

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

回答

1

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

我想你的代码段更改为类似:

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}■当这个目标正在兴建的指令被执行:

ADD_EXECUTABLE(MY_EXE main.cc ${COMPILED_RESOURCES}) 
+0

我在循环中放置了一个MESSAGE。我观察到没有空间。但即使我用'$ {RESOURCE_COMPILER}“-i”$ {INPUT_FILE}'修复了这个问题,也没有生成任何文件。 –

+0

在循环内部放置一个'message'将不会给出由'add_custom_command'执行的命令的正确印象。参数全部单独传递给xxd,并且适当添加空格。应该不需要''-i“''。如果你想检查你的命令是否正确,你可以暂时添加'execute_process(COMMAND $ {RESOURCE_COMPILER} -i $ {CMAKE_SOURCE_DIR} /rc/base.css $ {CMAKE_SOURCE_DIR} /rc/base.css.hex)'到你的CMakeLists.txt。这将在每次调用cmake时运行,并让你看看命令是否在做你想做的。 – Fraser

+0

那么我应该用'execute_process'替换ADD_CUSTOM_COMMAND吗? –