]> git.saurik.com Git - apple/libsystem.git/blob - xcodescripts/linker_arguments.sh
Libsystem-1252.200.5.tar.gz
[apple/libsystem.git] / xcodescripts / linker_arguments.sh
1 #!/bin/bash -x
2
3 if [ $# -ne 5 ]; then
4 echo "Usage: $0 <archs> <variants> <outputdir> <sdkroot> <srcroot>" 1>&2
5 exit 1
6 fi
7
8 ARCHS="$1"
9 VARIANTS="$2"
10 OUTPUTDIR="$3"
11 SDKROOT="$4"
12 SRCROOT="$5"
13
14 LIBSYS="${SDKROOT}/usr/local/lib/system"
15 LSYS="${SDKROOT}/usr/lib/system"
16
17 mkdir -p "${OUTPUTDIR}"
18
19 for arch in ${ARCHS}; do
20 for variant in ${VARIANTS}; do
21 OUTPUTFILE="${OUTPUTDIR}/linker_arguments.${arch}.${variant}.txt"
22 OUTPUTCONFIG="${OUTPUTDIR}/config.${arch}.${variant}.h"
23 TEMPDIR="${OUTPUTDIR}/linker_arguments_tmp"
24
25 mkdir -p "${TEMPDIR}"
26
27 ACTUALLIBS="${TEMPDIR}/${arch}.${variant}.actuallibs"
28 ALLLIBS="${TEMPDIR}/${arch}.${variant}.alllibs"
29 FROMUSRLIBSYSTEM="${TEMPDIR}/${arch}.${variant}.fromusrlibsystem"
30 FROMUSRLOCALLIBSYSTEM="${TEMPDIR}/${arch}.${variant}.fromusrlocallibsystem"
31 INUSRLIBSYSTEM="${TEMPDIR}/${arch}.${variant}.inusrlibsystem"
32 INUSRLOCALLIBSYSTEM="${TEMPDIR}/${arch}.${variant}.inusrlocallibsystem"
33 MISSINGLIBS="${TEMPDIR}/${arch}.${variant}.missinglibs"
34 POSSIBLEUSRLOCALLIBSYSTEM="${TEMPDIR}/${arch}.${variant}.possibleusrlocallibsystem"
35 OPTIONALLIBS="${SRCROOT}/optionallibs"
36 REQUIREDLIBS="${SRCROOT}/requiredlibs"
37
38 if [ ${variant} = "normal" ]; then
39 SUFFIX=""
40 else
41 SUFFIX="_${variant}"
42 fi
43
44 rm -f "${OUTPUTFILE}"
45
46 cat ${REQUIREDLIBS} ${OPTIONALLIBS} | sort > ${ALLLIBS}
47
48 # Strip away variant information to do presence checks
49 # non-normal variants can always link against normal clients
50 cd ${LSYS} && ls lib*.{dylib,tbd,api,spi} | sed -E -e 's/_(debug|profile|static)\././' | while read l; do
51 if [ "${l: -6}" == ".dylib" ]; then
52 xcrun -sdk "${SDKROOT}" lipo "${LSYS}/${l}" -verify_arch "${arch}" 2>/dev/null
53 else
54 xcrun -sdk "${SDKROOT}" tapi archive "${LSYS}/${l}" --verify-arch "${arch}" 2>/dev/null
55 fi
56 if [ $? -eq 0 ]; then
57 echo "${l}"
58 fi
59 done | sed -E -e 's/^lib//' -e 's/\..*$$//' | sort -u > ${INUSRLIBSYSTEM}
60 cd ${LIBSYS} && ls lib*.a | sed -E -e 's/_(debug|profile|static)\././' | while read l; do
61 xcrun -sdk "${SDKROOT}" lipo "${LIBSYS}/${l}" -verify_arch "${arch}" 2>/dev/null
62 if [ $? -eq 0 ]; then
63 echo "${l}"
64 fi
65 done | sed -E -e 's/^lib//' -e 's/\..*$$//' | sort -u > ${INUSRLOCALLIBSYSTEM}
66
67 while read line ; do
68 for lib in ${line} ; do
69 egrep "^${lib}$" ${INUSRLIBSYSTEM} && break
70 done
71 done < ${ALLLIBS} > ${FROMUSRLIBSYSTEM}
72
73 while read line ; do
74 for lib in ${line} ; do
75 egrep -q "^${lib}$" ${INUSRLIBSYSTEM} && break
76 egrep "^${lib}$" ${INUSRLOCALLIBSYSTEM} && break
77 done
78 done < ${ALLLIBS} > ${POSSIBLEUSRLOCALLIBSYSTEM}
79
80 comm -13 ${FROMUSRLIBSYSTEM} ${POSSIBLEUSRLOCALLIBSYSTEM} > ${FROMUSRLOCALLIBSYSTEM}
81 cat ${FROMUSRLIBSYSTEM} ${FROMUSRLOCALLIBSYSTEM} | sort > ${ACTUALLIBS}
82
83 while read line ; do
84 found=0
85 for lib in ${line} ; do
86 egrep -q "^${lib}$" ${ACTUALLIBS} && found=1
87 done
88 [[ $found == 0 ]] && echo ${line}
89 done < ${REQUIREDLIBS} > ${MISSINGLIBS}
90
91 if [ -s ${MISSINGLIBS} ]; then
92 echo '*** missing required libs ***'
93 cat ${MISSINGLIBS}
94 exit 1
95 fi
96
97 cat ${FROMUSRLIBSYSTEM} | while read lib; do
98 echo "#define HAVE_"$(echo "${lib/_sim/}" | tr 'a-z' 'A-Z')" 1"
99 done >> "${OUTPUTCONFIG}"
100
101 cat ${FROMUSRLIBSYSTEM} | while read lib; do
102 echo "-Wl,-reexport-l${lib}"
103 done >> "${OUTPUTFILE}"
104
105 # Allow static archives to degrade to their non-variant versions
106 cat ${FROMUSRLOCALLIBSYSTEM} | while read lib; do
107 LPATH="${LIBSYS}/lib${lib}${SUFFIX}.a"
108 xcrun -sdk "${SDKROOT}" lipo "${LPATH}" -verify_arch "${arch}" 2>/dev/null
109 if [ $? -ne 0 ]; then
110 LPATH="${LIBSYS}/lib${lib}.a"
111 fi
112 echo "-Wl,-force_load,${LPATH}"
113 done >> "${OUTPUTFILE}"
114
115 echo "Final contents of ${OUTPUTFILE}:"
116 cat "${OUTPUTFILE}"
117 done
118 done
119
120 MARKERFILE="${OUTPUTDIR}/linker_arguments_changed.c"
121
122 for arch in ${ARCHS}; do
123 for variant in ${VARIANTS}; do
124 OUTPUTFILE="${OUTPUTDIR}/linker_arguments.${arch}.${variant}.txt"
125 cat "${OUTPUTFILE}"
126 done
127 done | shasum | sed 's,^,// ,' > "${MARKERFILE}"
128
129 exit 0