|
| 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