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