如何从运行为“运行脚本构建阶段”的脚本内部确定构建过程中ld命令的参数是什么?
我看xcodebuild -dry-run
作为选项,但后来我需要了解我提供的论据应该是什么。
有任何想法可以提供强大的解决方案吗?
修改:
当项目包含swift源代码时,xcodebuild似乎不支持LD和LDPLUSPLUS。所以@fpotter提供的解决方案不适用于swift项目。
有什么想法?
答案 0 :(得分:5)
Xcode没有公开一种很好的方法来做到这一点。在运行脚本构建阶段,您需要使用的只是在环境中提供给您的Xcode构建设置。
如果您确实需要将整个参数列表发送到ld
,那么您可以使用黑客攻击。使用LD
和LDPLUSPLUS
构建设置,您可以让Xcode调用您自己的脚本而不是真实的ld
。从该脚本中,您可以捕获args,调用真实的链接器,然后执行您喜欢的任何后处理,而不是在Run Script构建阶段。
以下是如何做到的:
为目标创建.xcconfig。
它应该是这样的:
LD = $(SRCROOT)/ld-wrapper/clang
LDPLUSPLUS = $(SRCROOT)/ld-wrapper/clang++
SRCROOT指向您项目的目录。只有当您的应用程序具有C ++或ObjC ++代码时,才需要LDPLUSPLUS行。如果您不想创建xcconfig,还可以通过Xcode UI将这些添加为用户定义的构建设置。
为Xcode创建包装脚本以进行调用。
在<your project root>/ld-wrapper/wrapper.sh
:
#!/bin/bash
set -o errexit
# Choose which clang to run (clang or clang++) depending on how we're invoked.
# If we're invoked via the 'clang' link, we'll run 'clang'. If we're invoked
# via the 'clang++' link, we'll run 'clang++'.
CLANG_PATH="$DEVELOPER_DIR"/Toolchains/XcodeDefault.xctoolchain/usr/bin/$(basename "$0")
"$CLANG_PATH" "$@"
echo "clang args: $@"
echo "do any post processing here."
为clang和clang ++的包装脚本创建符号链接:
cd <project root>/ld-wrapper
ln -s wrapper.sh clang
ln -s wrapper.sh clang++
那就是它。这很难看,但它确实有效。