从xcode运行脚本构建阶段找出ld命令参数

时间:2015-02-02 17:38:47

标签: xcode xcodebuild xctool

如何从运行为“运行脚本构建阶段”的脚本内部确定构建过程中ld命令的参数是什么?

我看xcodebuild -dry-run作为选项,但后来我需要了解我提供的论据应该是什么。

有任何想法可以提供强大的解决方案吗?

修改

当项目包含swift源代码时,xcodebuild似乎不支持LD和LDPLUSPLUS。所以@fpotter提供的解决方案不适用于swift项目。

有什么想法?

1 个答案:

答案 0 :(得分:5)

Xcode没有公开一种很好的方法来做到这一点。在运行脚本构建阶段,您需要使用的只是在环境中提供给您的Xcode构建设置。

如果您确实需要将整个参数列表发送到ld,那么您可以使用黑客攻击。使用LDLDPLUSPLUS构建设置,您可以让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++

那就是它。这很难看,但它确实有效。