CMake COMMAND shell参数替换失败

时间:2017-11-10 09:21:57

标签: shell cmake

我尝试创建一个cmake自定义目标,将几个.a文件合并为一个。请注意,我不能使用OBJECTS lib模式,因为我有很多第三方库(我在复杂的环境中使用,conan,cmake等...)。

所以我写了以下内容

add_custom_target(combineall
    COMMAND echo "extract all .o files from all lib*.a file in the static folder"
    COMMAND for f in *.a ; do ar -x $f ; done
    COMMAND echo "merge all .o files in the static folder"
    COMMAND for f in *.o ; do ar -rs ${CMAKE_BINARY_DIR}/libmerged.a $f ; done
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/static
    DEPENDS MyLib
    )

但是当cmake运行combineall自定义目标时,我收到以下错误消息:

  

从静态文件夹中的所有lib * .a文件中提取所有.o文件   / bin / sh:-c:第1行:语法错误:意外的文件结尾

我想它来自$f。我知道我可以编写一个完全不同的cmake脚本,使用cmake for_each语法迭代其他.a文件,但这不是我的目标!

此致 亚历

1 个答案:

答案 0 :(得分:3)

你必须反斜杠 - 转义你的分号,并且$ -escape你的$。 CMake正在从命令中删除它们,因此bash看到for f in *.a do ar -x done,它会因您看到的错误而失败。

所以你的目标应该是:

add_custom_target(combineall
    COMMAND echo "extract all .o files from all lib*.a file in the static folder"
    COMMAND for f in *.a \; do ar -x $$f \; done
    COMMAND echo "merge all .o files in the static folder"
    COMMAND for f in *.o \; do ar -rs ${CMAKE_BINARY_DIR}/libmerged.a $$f \; done
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/static
    DEPENDS MyLib
    )