1*5c2921b0SApple OSS Distributions#!/bin/sh 2*5c2921b0SApple OSS Distributions 3*5c2921b0SApple OSS Distributions# 4*5c2921b0SApple OSS Distributions# This shell-script is argument-compatible with xcrun(1) as invoked 5*5c2921b0SApple OSS Distributions# by xnu's Makefiles. Additionally, it supports caching tools 6*5c2921b0SApple OSS Distributions# in the local build directory. It is tightly coupled to exactly 7*5c2921b0SApple OSS Distributions# the queries that MakeInc.cmd makes, in exactly the order it makes 8*5c2921b0SApple OSS Distributions# them. ./tools/remote_build.sh invokes this indirectly in caching 9*5c2921b0SApple OSS Distributions# mode, so '$(XCRUN) -sdk foo -find bar' copies 'bar' from wherever 10*5c2921b0SApple OSS Distributions# it is on-disk into ./BUILD/BuildData, and returns that path to the 11*5c2921b0SApple OSS Distributions# caller. In '-u' mode on a remote build server, cache tools 12*5c2921b0SApple OSS Distributions# relative to the current build directory are returned without 13*5c2921b0SApple OSS Distributions# actually calling through to xcrun(1), since the remote build 14*5c2921b0SApple OSS Distributions# server may not even have Xcode installed. 15*5c2921b0SApple OSS Distributions# 16*5c2921b0SApple OSS Distributions 17*5c2921b0SApple OSS DistributionsSDKROOT="" 18*5c2921b0SApple OSS DistributionsFINDTOOL="" 19*5c2921b0SApple OSS DistributionsSDKQUERY="" 20*5c2921b0SApple OSS DistributionsVERBOSE="" 21*5c2921b0SApple OSS DistributionsOBJROOT="" 22*5c2921b0SApple OSS DistributionsCACHE=0 23*5c2921b0SApple OSS Distributions 24*5c2921b0SApple OSS Distributions# echo "Calling $0 $@" 1>&2 25*5c2921b0SApple OSS Distributions 26*5c2921b0SApple OSS Distributionswhile [ $# -gt 0 ]; do 27*5c2921b0SApple OSS Distributions case "$1" in 28*5c2921b0SApple OSS Distributions -c) 29*5c2921b0SApple OSS Distributions CACHE=1 30*5c2921b0SApple OSS Distributions shift 31*5c2921b0SApple OSS Distributions OBJROOT="$1" 32*5c2921b0SApple OSS Distributions shift 33*5c2921b0SApple OSS Distributions ;; 34*5c2921b0SApple OSS Distributions -u) 35*5c2921b0SApple OSS Distributions CACHE=0 36*5c2921b0SApple OSS Distributions shift 37*5c2921b0SApple OSS Distributions OBJROOT="$1" 38*5c2921b0SApple OSS Distributions shift 39*5c2921b0SApple OSS Distributions ;; 40*5c2921b0SApple OSS Distributions -sdk) 41*5c2921b0SApple OSS Distributions shift 42*5c2921b0SApple OSS Distributions SDKROOT="$1" 43*5c2921b0SApple OSS Distributions shift 44*5c2921b0SApple OSS Distributions ;; 45*5c2921b0SApple OSS Distributions -verbose) 46*5c2921b0SApple OSS Distributions VERBOSE="$1" 47*5c2921b0SApple OSS Distributions shift 48*5c2921b0SApple OSS Distributions set -x 49*5c2921b0SApple OSS Distributions ;; 50*5c2921b0SApple OSS Distributions -find) 51*5c2921b0SApple OSS Distributions shift 52*5c2921b0SApple OSS Distributions FINDTOOL="$1" 53*5c2921b0SApple OSS Distributions shift 54*5c2921b0SApple OSS Distributions ;; 55*5c2921b0SApple OSS Distributions -show-sdk-path) 56*5c2921b0SApple OSS Distributions SDKQUERY="$1" 57*5c2921b0SApple OSS Distributions shift 58*5c2921b0SApple OSS Distributions ;; 59*5c2921b0SApple OSS Distributions -show-sdk-platform-path) 60*5c2921b0SApple OSS Distributions SDKQUERY="$1" 61*5c2921b0SApple OSS Distributions shift 62*5c2921b0SApple OSS Distributions ;; 63*5c2921b0SApple OSS Distributions -show-sdk-version) 64*5c2921b0SApple OSS Distributions SDKQUERY="$1" 65*5c2921b0SApple OSS Distributions shift 66*5c2921b0SApple OSS Distributions ;; 67*5c2921b0SApple OSS Distributions *) 68*5c2921b0SApple OSS Distributions echo "Unrecognized argument $1" 1>&2 69*5c2921b0SApple OSS Distributions exit 1 70*5c2921b0SApple OSS Distributions esac 71*5c2921b0SApple OSS Distributionsdone 72*5c2921b0SApple OSS Distributions 73*5c2921b0SApple OSS DistributionsCreateFile() { 74*5c2921b0SApple OSS Distributions local string="$1" 75*5c2921b0SApple OSS Distributions local filepath="$2" 76*5c2921b0SApple OSS Distributions echo "${string}" > "${filepath}.new" 77*5c2921b0SApple OSS Distributions cmp -s "${filepath}" "${filepath}.new" 78*5c2921b0SApple OSS Distributions if [ $? -eq 0 ]; then 79*5c2921b0SApple OSS Distributions rm "${filepath}.new" 80*5c2921b0SApple OSS Distributions else 81*5c2921b0SApple OSS Distributions mv "${filepath}.new" "${filepath}" 82*5c2921b0SApple OSS Distributions fi 83*5c2921b0SApple OSS Distributions} 84*5c2921b0SApple OSS Distributions 85*5c2921b0SApple OSS Distributionsif [ $CACHE -eq 1 ]; then 86*5c2921b0SApple OSS Distributions 87*5c2921b0SApple OSS Distributions if [ -n "$SDKQUERY" ]; then 88*5c2921b0SApple OSS Distributions # MakeInc.cmd makes SDK queries up-front first. Generally the 89*5c2921b0SApple OSS Distributions # SDKROOT that is an input to these are one of: 90*5c2921b0SApple OSS Distributions # "macosx" => Host SDK 91*5c2921b0SApple OSS Distributions # "iphonehostXXX" => iPhone Host SDK 92*5c2921b0SApple OSS Distributions # other shortcut or full path => Target SDK 93*5c2921b0SApple OSS Distributions # 94*5c2921b0SApple OSS Distributions # Once an initial lookup is made, subsequent SDKROOTs for 95*5c2921b0SApple OSS Distributions # that same SDK may use a full path or cached path 96*5c2921b0SApple OSS Distributions SDKTYPE="" 97*5c2921b0SApple OSS Distributions case "$SDKROOT" in 98*5c2921b0SApple OSS Distributions macosx) 99*5c2921b0SApple OSS Distributions SDKTYPE="host" 100*5c2921b0SApple OSS Distributions ;; 101*5c2921b0SApple OSS Distributions iphonehost*) 102*5c2921b0SApple OSS Distributions SDKTYPE="iphonehost" 103*5c2921b0SApple OSS Distributions ;; 104*5c2921b0SApple OSS Distributions *) 105*5c2921b0SApple OSS Distributions if [ -f "$SDKROOT/.sdktype" ]; then 106*5c2921b0SApple OSS Distributions SDKTYPE=`cat "$SDKROOT/.sdktype"` 107*5c2921b0SApple OSS Distributions else 108*5c2921b0SApple OSS Distributions SDKTYPE="target" 109*5c2921b0SApple OSS Distributions fi 110*5c2921b0SApple OSS Distributions ;; 111*5c2921b0SApple OSS Distributions esac 112*5c2921b0SApple OSS Distributions 113*5c2921b0SApple OSS Distributions # A cached SDK path can be passed to xcrun, so 114*5c2921b0SApple OSS Distributions # we need the original on-disk path 115*5c2921b0SApple OSS Distributions if [ -f "$SDKROOT/.realsdkpath" ]; then 116*5c2921b0SApple OSS Distributions REALSDKROOT=`cat "$SDKROOT/.realsdkpath"` 117*5c2921b0SApple OSS Distributions else 118*5c2921b0SApple OSS Distributions REALSDKROOT="$SDKROOT" 119*5c2921b0SApple OSS Distributions fi 120*5c2921b0SApple OSS Distributions 121*5c2921b0SApple OSS Distributions SDKPROPERTY=`/usr/bin/xcrun $VERBOSE -sdk "$REALSDKROOT" "$SDKQUERY"` 122*5c2921b0SApple OSS Distributions if [ $? -ne 0 ]; then 123*5c2921b0SApple OSS Distributions exit $? 124*5c2921b0SApple OSS Distributions fi 125*5c2921b0SApple OSS Distributions 126*5c2921b0SApple OSS Distributions case $SDKQUERY in 127*5c2921b0SApple OSS Distributions -show-sdk-path) 128*5c2921b0SApple OSS Distributions # Cache the SDK locally, and transform the resulting SDKPROPERTY 129*5c2921b0SApple OSS Distributions if [ -z "$SDKPROPERTY" ]; then 130*5c2921b0SApple OSS Distributions SDKPROPERTY="/" 131*5c2921b0SApple OSS Distributions SDKNAME="Slash.sdk" 132*5c2921b0SApple OSS Distributions else 133*5c2921b0SApple OSS Distributions SDKNAME=$(basename "${SDKPROPERTY}") 134*5c2921b0SApple OSS Distributions fi 135*5c2921b0SApple OSS Distributions mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}" 136*5c2921b0SApple OSS Distributions mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}/usr/include" 137*5c2921b0SApple OSS Distributions rsync -aq --exclude=c++ --exclude=php --exclude=soc "${SDKPROPERTY}/usr/include/" "${OBJROOT}/BuildTools/${SDKNAME}/usr/include/" 138*5c2921b0SApple OSS Distributions if [ "$SDKTYPE" = "iphonehost" ]; then 139*5c2921b0SApple OSS Distributions mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}/usr/local/lib/system" 140*5c2921b0SApple OSS Distributions rsync -aq "${SDKPROPERTY}/usr/local/lib/system/" "${OBJROOT}/BuildTools/${SDKNAME}/usr/local/lib/system/" 141*5c2921b0SApple OSS Distributions else 142*5c2921b0SApple OSS Distributions mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib" 143*5c2921b0SApple OSS Distributions rsync -aq "${SDKPROPERTY}/usr/lib/libSystem"* "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib/" 144*5c2921b0SApple OSS Distributions rsync -aq "${SDKPROPERTY}/usr/lib/libc++"* "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib/" 145*5c2921b0SApple OSS Distributions rsync -aq "${SDKPROPERTY}/usr/lib/libstdc++"* "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib/" 146*5c2921b0SApple OSS Distributions mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib/system" 147*5c2921b0SApple OSS Distributions rsync -aq --exclude=\*_debug.dylib --exclude=\*_profile.dylib "${SDKPROPERTY}/usr/lib/system/" "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib/system/" 148*5c2921b0SApple OSS Distributions fi 149*5c2921b0SApple OSS Distributions if [ -f "${SDKPROPERTY}/usr/local/libexec/availability.pl" ]; then 150*5c2921b0SApple OSS Distributions mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}/usr/local/libexec" 151*5c2921b0SApple OSS Distributions rsync -aq "${SDKPROPERTY}/usr/local/libexec/availability.pl" "${OBJROOT}/BuildTools/${SDKNAME}/usr/local/libexec/" 152*5c2921b0SApple OSS Distributions fi 153*5c2921b0SApple OSS Distributions CreateFile "${SDKPROPERTY}" "${OBJROOT}/BuildTools/${SDKNAME}/.realsdkpath" 154*5c2921b0SApple OSS Distributions CreateFile "${SDKTYPE}" "${OBJROOT}/BuildTools/${SDKNAME}/.sdktype" 155*5c2921b0SApple OSS Distributions CreateFile "BuildTools/${SDKNAME}" "${OBJROOT}/BuildTools/.${SDKTYPE}sdk" 156*5c2921b0SApple OSS Distributions echo "${OBJROOT}/BuildTools/${SDKNAME}" 157*5c2921b0SApple OSS Distributions exit 0 158*5c2921b0SApple OSS Distributions ;; 159*5c2921b0SApple OSS Distributions -show-sdk-platform-path) 160*5c2921b0SApple OSS Distributions PLATFORMNAME=$(basename "${SDKPROPERTY}") 161*5c2921b0SApple OSS Distributions mkdir -p "${OBJROOT}/BuildTools/${PLATFORMNAME}" 162*5c2921b0SApple OSS Distributions if [ -f "${SDKPROPERTY}/usr/local/standalone/firmware/device_map.db" ]; then 163*5c2921b0SApple OSS Distributions mkdir -p "${OBJROOT}/BuildTools/${PLATFORMNAME}/usr/local/standalone/firmware" 164*5c2921b0SApple OSS Distributions rsync -aq "${SDKPROPERTY}/usr/local/standalone/firmware/device_map.db" \ 165*5c2921b0SApple OSS Distributions "${OBJROOT}/BuildTools/${PLATFORMNAME}/usr/local/standalone/firmware/" 166*5c2921b0SApple OSS Distributions fi 167*5c2921b0SApple OSS Distributions CreateFile "BuildTools/${PLATFORMNAME}" "${OBJROOT}/BuildTools/.targetplatform" 168*5c2921b0SApple OSS Distributions echo "${OBJROOT}/BuildTools/${PLATFORMNAME}" 169*5c2921b0SApple OSS Distributions exit 0 170*5c2921b0SApple OSS Distributions ;; 171*5c2921b0SApple OSS Distributions -show-sdk-version) 172*5c2921b0SApple OSS Distributions CreateFile "${SDKPROPERTY}" "${OBJROOT}/BuildTools/.targetsdkversion" 173*5c2921b0SApple OSS Distributions echo "${SDKPROPERTY}" 174*5c2921b0SApple OSS Distributions exit 0 175*5c2921b0SApple OSS Distributions ;; 176*5c2921b0SApple OSS Distributions esac 177*5c2921b0SApple OSS Distributions 178*5c2921b0SApple OSS Distributions elif [ -n "$FINDTOOL" ]; then 179*5c2921b0SApple OSS Distributions 180*5c2921b0SApple OSS Distributions # We assume SDK Queries have been performed first and subsequent 181*5c2921b0SApple OSS Distributions # SDKROOTs used to find tools are all using cached SDKs in 182*5c2921b0SApple OSS Distributions # the build directory, in which case metadata is present 183*5c2921b0SApple OSS Distributions 184*5c2921b0SApple OSS Distributions if [ ! -f "$SDKROOT/.realsdkpath" ]; then 185*5c2921b0SApple OSS Distributions exit 1 186*5c2921b0SApple OSS Distributions fi 187*5c2921b0SApple OSS Distributions REALSDKROOT=`cat "$SDKROOT/.realsdkpath"` 188*5c2921b0SApple OSS Distributions 189*5c2921b0SApple OSS Distributions if [ ! -f "$SDKROOT/.sdktype" ]; then 190*5c2921b0SApple OSS Distributions exit 1 191*5c2921b0SApple OSS Distributions fi 192*5c2921b0SApple OSS Distributions SDKTYPE=`cat "$SDKROOT/.sdktype"` 193*5c2921b0SApple OSS Distributions 194*5c2921b0SApple OSS Distributions TOOLPATH=`/usr/bin/xcrun $VERBOSE -sdk "$REALSDKROOT" -find "$FINDTOOL"` 195*5c2921b0SApple OSS Distributions if [ $? -ne 0 ]; then 196*5c2921b0SApple OSS Distributions exit $? 197*5c2921b0SApple OSS Distributions fi 198*5c2921b0SApple OSS Distributions 199*5c2921b0SApple OSS Distributions # Keep the parent directory when caching tools, along with Host vs. Target 200*5c2921b0SApple OSS Distributions TOOLNAME=$(basename "${TOOLPATH}") 201*5c2921b0SApple OSS Distributions TOOLDIR=$(basename $(dirname "${TOOLPATH}")) 202*5c2921b0SApple OSS Distributions if [ "$SDKTYPE" = "host" ]; then 203*5c2921b0SApple OSS Distributions NEWTOOLPATH="${OBJROOT}/BuildTools/Host/${TOOLDIR}/${TOOLNAME}" 204*5c2921b0SApple OSS Distributions mkdir -p "${OBJROOT}/BuildTools/Host" 205*5c2921b0SApple OSS Distributions CreateFile "BuildTools/Host/${TOOLDIR}/${TOOLNAME}" "${OBJROOT}/BuildTools/Host/.${TOOLNAME}" 206*5c2921b0SApple OSS Distributions else 207*5c2921b0SApple OSS Distributions NEWTOOLPATH="${OBJROOT}/BuildTools/Target/${TOOLDIR}/${TOOLNAME}" 208*5c2921b0SApple OSS Distributions mkdir -p "${OBJROOT}/BuildTools/Target" 209*5c2921b0SApple OSS Distributions CreateFile "BuildTools/Target/${TOOLDIR}/${TOOLNAME}" "${OBJROOT}/BuildTools/Target/.${TOOLNAME}" 210*5c2921b0SApple OSS Distributions fi 211*5c2921b0SApple OSS Distributions mkdir -p $(dirname "${NEWTOOLPATH}") 212*5c2921b0SApple OSS Distributions rsync -aq "${TOOLPATH}" "${NEWTOOLPATH}" 213*5c2921b0SApple OSS Distributions case "${TOOLNAME}" in 214*5c2921b0SApple OSS Distributions clang) 215*5c2921b0SApple OSS Distributions mkdir -p $(dirname $(dirname "${NEWTOOLPATH}"))/lib/clang 216*5c2921b0SApple OSS Distributions rsync -aq $(dirname "${TOOLPATH}")/ld $(dirname "${NEWTOOLPATH}")/ld 217*5c2921b0SApple OSS Distributions rsync -aq $(dirname $(dirname "${TOOLPATH}"))/lib/clang/ $(dirname $(dirname "${NEWTOOLPATH}"))/lib/clang/ 218*5c2921b0SApple OSS Distributions rsync -aq $(dirname $(dirname "${TOOLPATH}"))/lib/libLTO.dylib $(dirname $(dirname "${NEWTOOLPATH}"))/lib/libLTO.dylib 219*5c2921b0SApple OSS Distributions ;; 220*5c2921b0SApple OSS Distributions bison) 221*5c2921b0SApple OSS Distributions mkdir -p $(dirname $(dirname "${NEWTOOLPATH}"))/share/bison 222*5c2921b0SApple OSS Distributions rsync -aq $(dirname $(dirname "${TOOLPATH}"))/share/bison/ $(dirname $(dirname "${NEWTOOLPATH}"))/share/bison/ 223*5c2921b0SApple OSS Distributions ;; 224*5c2921b0SApple OSS Distributions esac 225*5c2921b0SApple OSS Distributions 226*5c2921b0SApple OSS Distributions echo "${NEWTOOLPATH}" 227*5c2921b0SApple OSS Distributions exit 0 228*5c2921b0SApple OSS Distributions else 229*5c2921b0SApple OSS Distributions echo "Unrecognized option" 1>&2 230*5c2921b0SApple OSS Distributions exit 1 231*5c2921b0SApple OSS Distributions fi 232*5c2921b0SApple OSS Distributionsfi 233*5c2921b0SApple OSS Distributions 234*5c2921b0SApple OSS Distributions# When using cached SDK information, first try to do 235*5c2921b0SApple OSS Distributions# an initial classification, and then read properties from 236*5c2921b0SApple OSS Distributions# cached locations 237*5c2921b0SApple OSS DistributionsSDKTYPE="" 238*5c2921b0SApple OSS Distributionscase "$SDKROOT" in 239*5c2921b0SApple OSS Distributions macosx) 240*5c2921b0SApple OSS Distributions SDKTYPE="host" 241*5c2921b0SApple OSS Distributions ;; 242*5c2921b0SApple OSS Distributions iphonehost*) 243*5c2921b0SApple OSS Distributions SDKTYPE="iphonehost" 244*5c2921b0SApple OSS Distributions ;; 245*5c2921b0SApple OSS Distributions *) 246*5c2921b0SApple OSS Distributions if [ -f "$SDKROOT/.sdktype" ]; then 247*5c2921b0SApple OSS Distributions SDKTYPE=`cat "$SDKROOT/.sdktype"` 248*5c2921b0SApple OSS Distributions else 249*5c2921b0SApple OSS Distributions SDKTYPE="target" 250*5c2921b0SApple OSS Distributions fi 251*5c2921b0SApple OSS Distributions ;; 252*5c2921b0SApple OSS Distributionsesac 253*5c2921b0SApple OSS Distributions 254*5c2921b0SApple OSS Distributionsif [ -n "$FINDTOOL" ]; then 255*5c2921b0SApple OSS Distributions TOOLNAME=$(basename "${FINDTOOL}") 256*5c2921b0SApple OSS Distributions if [ "${SDKTYPE}" = "host" ]; then 257*5c2921b0SApple OSS Distributions RELPATH=`cat ${OBJROOT}/BuildTools/Host/.${TOOLNAME}` 258*5c2921b0SApple OSS Distributions else 259*5c2921b0SApple OSS Distributions RELPATH=`cat ${OBJROOT}/BuildTools/Target/.${TOOLNAME}` 260*5c2921b0SApple OSS Distributions fi 261*5c2921b0SApple OSS Distributions echo "${OBJROOT}/${RELPATH}" 262*5c2921b0SApple OSS Distributionselse 263*5c2921b0SApple OSS Distributions case $SDKQUERY in 264*5c2921b0SApple OSS Distributions -show-sdk-path) 265*5c2921b0SApple OSS Distributions RELPATH=`cat ${OBJROOT}/BuildTools/.${SDKTYPE}sdk` 266*5c2921b0SApple OSS Distributions echo "${OBJROOT}/${RELPATH}" 267*5c2921b0SApple OSS Distributions ;; 268*5c2921b0SApple OSS Distributions -show-sdk-platform-path) 269*5c2921b0SApple OSS Distributions RELPATH=`cat ${OBJROOT}/BuildTools/.targetplatform` 270*5c2921b0SApple OSS Distributions echo "${OBJROOT}/${RELPATH}" 271*5c2921b0SApple OSS Distributions ;; 272*5c2921b0SApple OSS Distributions -show-sdk-version) 273*5c2921b0SApple OSS Distributions echo `cat ${OBJROOT}/BuildTools/.targetsdkversion` 274*5c2921b0SApple OSS Distributions ;; 275*5c2921b0SApple OSS Distributions esac 276*5c2921b0SApple OSS Distributionsfi 277