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