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