8

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

我曾xcodebuild -dry-run将其视为一种选择,但随后我需要了解我提供的论点应该是什么。

任何想法的强大解决方案?

编辑

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

有什么想法吗?

4

1 回答 1

5

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

如果你真的需要整个参数列表ld,你可以使用 hack。使用LDLDPLUSPLUS构建设置,您可以让 Xcode 调用您自己的脚本,而不是真正的ld. 从该脚本中,您可以捕获参数,调用真正的链接器,然后在那里进行您喜欢的任何后期处理,而不是在运行脚本构建阶段。

您可以这样做:

为您的目标创建一个 .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++

而已。这很丑陋,但它有效。

于 2015-02-02T18:58:49.540 回答