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

eke*_*ren 8 xcode xcodebuild xctool

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

我正在考虑xcodebuild -dry-run作为一种选择,但后来我需要了解我提供它的论据应该是什么.

想要一个强大的解决方案吗?

编辑:

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

有什么想法吗?

小智 5

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

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

这是你如何做到这一点:

为目标创建.xcconfig.

它应该如下所示:

LD = $(SRCROOT)/ld-wrapper/clang
LDPLUSPLUS = $(SRCROOT)/ld-wrapper/clang++
Run Code Online (Sandbox Code Playgroud)

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."
Run Code Online (Sandbox Code Playgroud)

为clang和clang ++创建包装脚本的符号链接:

cd <project root>/ld-wrapper
ln -s wrapper.sh clang
ln -s wrapper.sh clang++
Run Code Online (Sandbox Code Playgroud)

而已.这很难看,但它确实有效.