-
-
Notifications
You must be signed in to change notification settings - Fork 39
Expand file tree
/
Copy pathnsld.sh
More file actions
executable file
·117 lines (100 loc) · 3.3 KB
/
nsld.sh
File metadata and controls
executable file
·117 lines (100 loc) · 3.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/env bash
source ./.build_env_vars.sh
function getArch() {
while [[ $# -gt 0 ]]
do
case $1 in
-arch)
printf $2
return
;;
-target)
printf `echo $2 | cut -f1 -d'-'`
return
;;
esac
shift
done
}
# Workaround for ARCH being set to `undefined_arch` here. Extract it from command line arguments.
TARGET_ARCH=$(getArch "$@")
# Use per-architecture directory to avoid race conditions with parallel linker invocations
MODULES_DIR="$SRCROOT/internal/Swift-Modules-$TARGET_ARCH"
function DELETE_SWIFT_MODULES_DIR() {
rm -rf "$MODULES_DIR"
}
function GEN_MODULEMAP() {
ARCH_ARG=$1
SWIFT_HEADER_DIR=$PER_VARIANT_OBJECT_FILE_DIR/$ARCH_ARG
DELETE_SWIFT_MODULES_DIR
if [ -d "$SWIFT_HEADER_DIR" ]; then
HEADER_PATH=$(find "$SWIFT_HEADER_DIR" -name '*-Swift.h' 2>/dev/null)
if [ -n "$HEADER_PATH" ]; then
mkdir -p "$MODULES_DIR"
CONTENT="module nsswiftsupport { \n header \"$HEADER_PATH\" \n export * \n}"
printf "$CONTENT" > "$MODULES_DIR/module.modulemap"
else
echo "NSLD: Swift bridging header '*-Swift.h' not found under '$SWIFT_HEADER_DIR'"
fi
else
echo "NSLD: Directory for Swift headers ($SWIFT_HEADER_DIR) not found."
fi
}
function GEN_METADATA() {
TARGET_ARCH=$1
set -e
cpu_arch=$(uname -m)
pushd "$SRCROOT/internal/metadata-generator-${cpu_arch}/bin"
./build-step-metadata-generator.py $TARGET_ARCH
popd
}
GEN_MODULEMAP $TARGET_ARCH
export HEADER_SEARCH_PATHS="$HEADER_SEARCH_PATHS $MODULES_DIR"
printf "Generating metadata..."
GEN_METADATA $TARGET_ARCH
DELETE_SWIFT_MODULES_DIR
function resolve_clang() {
# 1) If NS_LD is set and executable, honor it.
if [[ -n "$NS_LD" && -x "$NS_LD" ]]; then
echo "$NS_LD"
return 0
fi
# 2) TOOLCHAIN_DIR (if provided)
if [[ -n "$TOOLCHAIN_DIR" && -x "$TOOLCHAIN_DIR/usr/bin/clang" ]]; then
echo "$TOOLCHAIN_DIR/usr/bin/clang"
return 0
fi
# 3) Xcode's DT_TOOLCHAIN_DIR (provided by xcodebuild)
if [[ -n "$DT_TOOLCHAIN_DIR" && -x "$DT_TOOLCHAIN_DIR/usr/bin/clang" ]]; then
echo "$DT_TOOLCHAIN_DIR/usr/bin/clang"
return 0
fi
# 4) xcrun lookup (most reliable within Xcode build env)
local xcrun_clang
xcrun_clang=$(xcrun --find clang 2>/dev/null) || true
if [[ -n "$xcrun_clang" && -x "$xcrun_clang" ]]; then
echo "$xcrun_clang"
return 0
fi
# 5) Xcode default toolchain from xcode-select
local xcode_path
xcode_path=$(xcode-select -p 2>/dev/null) || true
if [[ -n "$xcode_path" && -x "$xcode_path/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" ]]; then
echo "$xcode_path/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang"
return 0
fi
# 6) System fallback
if [[ -x "/usr/bin/clang" ]]; then
echo "/usr/bin/clang"
return 0
fi
return 1
}
CLANG_PATH=$(resolve_clang)
if [[ -z "$CLANG_PATH" ]]; then
echo "NSLD: ERROR: Could not locate a usable clang. TOOLCHAIN_DIR='${TOOLCHAIN_DIR}' DT_TOOLCHAIN_DIR='${DT_TOOLCHAIN_DIR}'."
exit 1
fi
# For visibility downstream, set NS_LD to the resolved path and invoke.
NS_LD="$CLANG_PATH"
"$NS_LD" "$@"