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