Skip to content

Commit 68e62b6

Browse files
committed
build: add linux->mac cross script and SDK safety guards
1 parent ea669b1 commit 68e62b6

2 files changed

Lines changed: 108 additions & 0 deletions

File tree

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424
.vscode/
2525
.playwright-mcp/
2626

27+
# Local macOS SDK / osxcross safety guards
28+
/sdk*/
29+
/osxcross*/
30+
/*.sdk
31+
2732
# Visual Studio
2833
out/
2934
.vs/

asyn0c/,test,tooltime,x,ubuntu,mac

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
# Cross-compile ToolTime on Linux for macOS using osxcross.
5+
#
6+
# Usage examples:
7+
# ./asyn0c/,test,tooltime,x,ubuntu,mac
8+
# MAC_ARCH=arm64 ./asyn0c/,test,tooltime,x,ubuntu,mac
9+
# MAC_ARCH=x86_64 MACOSX_DEPLOYMENT_TARGET=11.0 ./asyn0c/,test,tooltime,x,ubuntu,mac
10+
11+
build_dir="ToolTine_mac"
12+
build_type="Release"
13+
repo_root="$(cd "$(dirname "$0")/../.." && pwd)"
14+
15+
MAC_ARCH="${MAC_ARCH:-x86_64}" # x86_64 or arm64
16+
DARWIN_MAJOR="${DARWIN_MAJOR:-24}" # macOS 15 ~= Darwin 24
17+
MACOSX_DEPLOYMENT_TARGET="${MACOSX_DEPLOYMENT_TARGET:-12.0}"
18+
19+
OSXCROSS_ROOT="${OSXCROSS_ROOT:-}"
20+
if [ -z "${OSXCROSS_ROOT}" ]; then
21+
echo "Set OSXCROSS_ROOT to your osxcross install path." >&2
22+
echo "Example: export OSXCROSS_ROOT=/opt/osxcross" >&2
23+
exit 1
24+
fi
25+
26+
case "${MAC_ARCH}" in
27+
x86_64)
28+
TARGET_PREFIX="x86_64-apple-darwin${DARWIN_MAJOR}"
29+
;;
30+
arm64)
31+
TARGET_PREFIX="aarch64-apple-darwin${DARWIN_MAJOR}"
32+
;;
33+
*)
34+
echo "Unsupported MAC_ARCH='${MAC_ARCH}'. Use x86_64 or arm64." >&2
35+
exit 1
36+
;;
37+
esac
38+
39+
CC="${OSXCROSS_ROOT}/target/bin/${TARGET_PREFIX}-clang"
40+
CXX="${OSXCROSS_ROOT}/target/bin/${TARGET_PREFIX}-clang++"
41+
AR="${OSXCROSS_ROOT}/target/bin/${TARGET_PREFIX}-ar"
42+
RANLIB="${OSXCROSS_ROOT}/target/bin/${TARGET_PREFIX}-ranlib"
43+
STRIP="${OSXCROSS_ROOT}/target/bin/${TARGET_PREFIX}-strip"
44+
45+
for tool in "${CC}" "${CXX}" "${AR}" "${RANLIB}" "${STRIP}"; do
46+
if [ ! -x "${tool}" ]; then
47+
echo "Missing tool: ${tool}" >&2
48+
echo "Check OSXCROSS_ROOT, DARWIN_MAJOR, and your osxcross build." >&2
49+
exit 1
50+
fi
51+
done
52+
53+
SDK_PATH="${OSX_SDK_PATH:-}"
54+
if [ -z "${SDK_PATH}" ]; then
55+
SDK_PATH="$(ls -d "${OSXCROSS_ROOT}"/target/SDK/MacOSX*.sdk 2>/dev/null | sort -V | tail -n1 || true)"
56+
fi
57+
58+
if [ -z "${SDK_PATH}" ] || [ ! -d "${SDK_PATH}" ]; then
59+
echo "Could not locate a macOS SDK under ${OSXCROSS_ROOT}/target/SDK." >&2
60+
echo "Set OSX_SDK_PATH explicitly if needed." >&2
61+
exit 1
62+
fi
63+
64+
sdk_real="$(realpath "${SDK_PATH}")"
65+
if [[ "${sdk_real}" == "${repo_root}"/* ]]; then
66+
echo "Refusing SDK path inside repository: ${sdk_real}" >&2
67+
echo "Use an SDK path outside ${repo_root}." >&2
68+
exit 1
69+
fi
70+
71+
mkdir -p "${build_dir}"
72+
cd "${build_dir}"
73+
74+
cat > toolchain-osxcross.cmake <<EOF
75+
set(CMAKE_SYSTEM_NAME Darwin)
76+
set(CMAKE_SYSTEM_PROCESSOR ${MAC_ARCH})
77+
78+
set(CMAKE_C_COMPILER ${CC})
79+
set(CMAKE_CXX_COMPILER ${CXX})
80+
set(CMAKE_AR ${AR})
81+
set(CMAKE_RANLIB ${RANLIB})
82+
set(CMAKE_STRIP ${STRIP})
83+
84+
set(CMAKE_OSX_SYSROOT ${SDK_PATH})
85+
set(CMAKE_OSX_ARCHITECTURES ${MAC_ARCH})
86+
set(CMAKE_OSX_DEPLOYMENT_TARGET ${MACOSX_DEPLOYMENT_TARGET})
87+
88+
set(CMAKE_FIND_ROOT_PATH ${SDK_PATH})
89+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
90+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
91+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
92+
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
93+
EOF
94+
95+
cmake \
96+
.. \
97+
-DCMAKE_TOOLCHAIN_FILE="$(pwd)/toolchain-osxcross.cmake" \
98+
-DCMAKE_BUILD_TYPE="${build_type}" \
99+
-DENABLE_OPENMP=OFF
100+
101+
cmake --build . -j"$(nproc)"
102+
103+
echo "Cross build complete: ${build_dir}/bin"

0 commit comments

Comments
 (0)