@@ -25,30 +25,45 @@ Notes:
2525EOF
2626}
2727
28+ require_arg_value () {
29+ local flag_name=" $1 "
30+ local value=" ${2:- } "
31+ if [[ -z " $value " || " $value " == -* ]]; then
32+ echo " Missing value for $flag_name "
33+ usage
34+ exit 1
35+ fi
36+ }
37+
2838while [[ $# -gt 0 ]]; do
2939 case " $1 " in
3040 --arch)
31- ARCH=" ${2:- } "
41+ require_arg_value " --arch" " ${2:- } "
42+ ARCH=" $2 "
3243 shift 2
3344 ;;
3445 --universal)
3546 UNIVERSAL=true
3647 shift
3748 ;;
3849 --arm64-root)
39- ARM64_ROOT=" ${2:- } "
50+ require_arg_value " --arm64-root" " ${2:- } "
51+ ARM64_ROOT=" $2 "
4052 shift 2
4153 ;;
4254 --x64-root)
43- X64_ROOT=" ${2:- } "
55+ require_arg_value " --x64-root" " ${2:- } "
56+ X64_ROOT=" $2 "
4457 shift 2
4558 ;;
4659 --dist-dir)
47- DIST_DIR=" ${2:- } "
60+ require_arg_value " --dist-dir" " ${2:- } "
61+ DIST_DIR=" $2 "
4862 shift 2
4963 ;;
5064 --version)
51- VERSION=" ${2:- } "
65+ require_arg_value " --version" " ${2:- } "
66+ VERSION=" $2 "
5267 shift 2
5368 ;;
5469 -h|--help)
@@ -153,38 +168,55 @@ install_node_runtime_for_arch() {
153168 esac
154169
155170 local archive_name=" node-v${node_version} -darwin-${node_arch} .tar.gz"
171+ local checksums_name=" SHASUMS256.txt"
156172 local download_url=" https://nodejs.org/dist/v${node_version} /${archive_name} "
173+ local checksums_url=" https://nodejs.org/dist/v${node_version} /${checksums_name} "
157174 local temp_dir
158175 temp_dir=" $( mktemp -d) "
176+ cleanup_temp_dir () {
177+ if [[ -d " $temp_dir " ]]; then
178+ rm -r " $temp_dir "
179+ fi
180+ }
181+ trap cleanup_temp_dir RETURN
159182
160183 curl -fLsS " $download_url " -o " $temp_dir /$archive_name "
184+ curl -fLsS " $checksums_url " -o " $temp_dir /$checksums_name "
185+
186+ local expected_sha
187+ expected_sha=" $( awk -v target=" $archive_name " ' $2 == target {print $1}' " $temp_dir /$checksums_name " ) "
188+ if [[ -z " $expected_sha " ]]; then
189+ echo " Unable to find checksum for $archive_name in ${checksums_name} "
190+ exit 1
191+ fi
192+
193+ local actual_sha
194+ actual_sha=" $( shasum -a 256 " $temp_dir /$archive_name " | awk ' {print $1}' ) "
195+ if [[ " $actual_sha " != " $expected_sha " ]]; then
196+ echo " Node runtime checksum mismatch for $archive_name "
197+ echo " Expected: $expected_sha "
198+ echo " Actual: $actual_sha "
199+ exit 1
200+ fi
201+
161202 tar -xzf " $temp_dir /$archive_name " -C " $temp_dir "
162203
163204 local extracted_node=" $temp_dir /node-v${node_version} -darwin-${node_arch} /bin/node"
164205 if [[ ! -x " $extracted_node " ]]; then
165206 echo " Failed to locate extracted Node runtime at $extracted_node "
166- rm -r " $temp_dir "
167207 exit 1
168208 fi
169209
170210 cp " $extracted_node " " $output_path "
171211 chmod +x " $output_path "
172- rm -r " $temp_dir "
173212}
174213
175214write_wrapper_scripts () {
176215 local root=" $1 "
177216 local bin_dir=" $root /bin"
178217 local libexec_dir=" $root /libexec"
179218
180- cat > " $libexec_dir /xcodebuildmcp" << 'EOF '
181- #!/usr/bin/env bash
182- set -euo pipefail
183- ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
184- exec "$ROOT/node-runtime" "$ROOT/build/cli.js" "$@"
185- EOF
186-
187- cat > " $bin_dir /xcodebuildmcp" << 'EOF '
219+ cat > " $libexec_dir /_resolve-resource-root.sh" << 'EOF '
188220#!/usr/bin/env bash
189221set -euo pipefail
190222SOURCE="${BASH_SOURCE[0]}"
@@ -194,29 +226,39 @@ while [[ -L "$SOURCE" ]]; do
194226 [[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE"
195227done
196228SCRIPT_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
197- RESOURCE_ROOT="$(cd "$SCRIPT_DIR/../libexec " && pwd)"
229+ RESOURCE_ROOT="$(cd "$SCRIPT_DIR" && pwd)"
198230export XCODEBUILDMCP_RESOURCE_ROOT="$RESOURCE_ROOT"
199231export DYLD_FRAMEWORK_PATH="$RESOURCE_ROOT/bundled/Frameworks${DYLD_FRAMEWORK_PATH:+:$DYLD_FRAMEWORK_PATH}"
232+ EOF
233+
234+ cat > " $libexec_dir /xcodebuildmcp" << 'EOF '
235+ #!/usr/bin/env bash
236+ set -euo pipefail
237+ ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
238+ exec "$ROOT/node-runtime" "$ROOT/build/cli.js" "$@"
239+ EOF
240+
241+ cat > " $bin_dir /xcodebuildmcp" << 'EOF '
242+ #!/usr/bin/env bash
243+ set -euo pipefail
244+ SCRIPT_DIR="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
245+ source "$SCRIPT_DIR/../libexec/_resolve-resource-root.sh"
200246exec "$RESOURCE_ROOT/xcodebuildmcp" "$@"
201247EOF
202248
203249 cat > " $bin_dir /xcodebuildmcp-doctor" << 'EOF '
204250#!/usr/bin/env bash
205251set -euo pipefail
206- SOURCE="${BASH_SOURCE[0]}"
207- while [[ -L "$SOURCE" ]]; do
208- DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
209- SOURCE="$(readlink "$SOURCE")"
210- [[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE"
211- done
212- SCRIPT_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
213- RESOURCE_ROOT="$(cd "$SCRIPT_DIR/../libexec" && pwd)"
214- export XCODEBUILDMCP_RESOURCE_ROOT="$RESOURCE_ROOT"
215- export DYLD_FRAMEWORK_PATH="$RESOURCE_ROOT/bundled/Frameworks${DYLD_FRAMEWORK_PATH:+:$DYLD_FRAMEWORK_PATH}"
252+ SCRIPT_DIR="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
253+ source "$SCRIPT_DIR/../libexec/_resolve-resource-root.sh"
216254exec "$RESOURCE_ROOT/xcodebuildmcp" doctor "$@"
217255EOF
218256
219- chmod +x " $libexec_dir /xcodebuildmcp" " $bin_dir /xcodebuildmcp" " $bin_dir /xcodebuildmcp-doctor"
257+ chmod +x \
258+ " $libexec_dir /_resolve-resource-root.sh" \
259+ " $libexec_dir /xcodebuildmcp" \
260+ " $bin_dir /xcodebuildmcp" \
261+ " $bin_dir /xcodebuildmcp-doctor"
220262}
221263
222264create_tarball_and_checksum () {
@@ -229,7 +271,7 @@ create_tarball_and_checksum() {
229271 cd " $( dirname " $portable_root " ) "
230272 tar -czf " $tarball_path " " $( basename " $portable_root " ) "
231273 )
232- shasum -a 256 " $tarball_path " > " $checksum_path "
274+ shasum -a 256 " $tarball_path " | awk ' {print $1} ' > " $checksum_path "
233275 echo " Created artifact: $tarball_path "
234276 echo " Created checksum: $checksum_path "
235277}
0 commit comments