gpt4 book ai didi

c++ - 带有 Xcode 生成器的特定于配置的 add_custom_command

转载 作者:行者123 更新时间:2023-12-03 10:04:39 25 4
gpt4 key购买 nike

我想创建一个自定义命令,使用 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 中。和 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 生成器中的错误还是我做错了什么?
我还尝试使用不支持现代 Apple Build System 的旧版本 CMake (3.18.4),但无济于事。
CMake documentation声明 COMMAND add_custom_command 的一部分应该能够使用生成器表达式。

最佳答案

实际上,诀窍在于使用 COMMAND_EXPAND_LISTS .
this CMake gitlab issue 中所述,正确的 CMake 脚本是:

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"
VERBATIM
COMMAND_EXPAND_LISTS
)
add_custom_target( ${TARGET_NAME} DEPENDS ${TARGET_OUTPUT_NAME} )
首先,所有参数必须用双引号括起来,以保证空格和 ;列表中的分隔符被传递到 add_custom_command .
接下来, COMMAND_EXPAND_LISTSmake sure通过生成器表达式(即 "$<$<CONFIG:Debug>:${all_dependencies_debug}>" )给出的列表将被正确扩展 - 如果没有这个,分号将最终出现在最终的 Xcode 构建阶段脚本中。
最后, VERBATIM需要正确转义可能会混淆 Xcode 阶段构建脚本的所有其他字符。
感谢 Brad King 在 gitlab issues 提供的快速帮助和回复.

关于c++ - 带有 Xcode 生成器的特定于配置的 add_custom_command,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65222331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com