我想创建一个自定义命令,使用 Apple 的将所有静态库合并到一个胖静态库中libtool
构建期间的命令。我正在使用 Xcode 生成器和 CMake 3.19.1。我的脚本是这样的:
set( TARGET_OUTPUT_NAME ${CMAKE_BINARY_DIR}/fat-libs/${CMAKE_CFG_INTDIR}/lib${libname}.a )
add_custom_command(
OUTPUT
${TARGET_OUTPUT_NAME}
COMMAND
/usr/bin/libtool -static -o ${TARGET_OUTPUT_NAME} $<TARGET_FILE:${libname}>
$<$<CONFIG:Debug>:${all_dependencies_debug}>
$<$<CONFIG:Release>:${all_dependencies_release}>
DEPENDS
${libname}
COMMENT
"Building merged static library"
)
add_custom_target( ${TARGET_NAME} DEPENDS ${TARGET_OUTPUT_NAME} )
libname
是目标的名称,其调试和发布的依赖项被收集到all_dependencies_debug
and all_dependencies_release
列出并应合并。这些列表的内容可能包含静态库或生成器表达式的实际路径(如果依赖项是另一个目标,无论是真实的还是导入的)。
但是,这会在 Xcode 中生成以下脚本:
#!/bin/sh
set -e
if test "$CONFIGURATION" = "Debug"; then :
cd /path/to/build/folder
/usr/bin/libtool -static -o /path/to/build/folder/fat-libs/$CONFIGURATION$EFFECTIVE_PLATFORM_NAME/libMyLib.a /path/to/build/folder/Debug/libMyLib.a $<1:/path/to/first/debug/libSomething.a /path/to/second/debug/libSomething.a> $<0:/path/to/first/release/libSomething.a /path/to/second/release/libSomething.a>
fi
if test "$CONFIGURATION" = "Release"; then :
cd /path/to/build/folder
/usr/bin/libtool -static -o /path/to/build/folder/fat-libs/$CONFIGURATION$EFFECTIVE_PLATFORM_NAME/libMyLib.a /path/to/build/folder/Release/libMyLib.a $<0:/path/to/first/debug/libSomething.a /path/to/second/debug/libSomething.a> $<1:/path/to/first/release/libSomething.a /path/to/second/release/libSomething.a>
fi
当然,这在构建过程中会失败,因为 xcode 会抛出异常syntax error
解析时$<1:
.
我也尝试过添加VERBATIM
,但这只会导致$
被逃脱。
这是 CMake Xcode 生成器中的错误还是我做错了什么?
我还尝试使用旧版本的 CMake (3.18.4),它不支持现代 Apple 构建系统,但无济于事。
CMake 文档 https://cmake.org/cmake/help/v3.19/command/add_custom_command.html指出COMMAND
部分add_custom_command
应该能够使用生成器表达式。