]> git.saurik.com Git - apple/libsystem.git/blob - xcodescripts/linker_arguments.sh
Libsystem-1197.1.1.tar.gz
[apple/libsystem.git] / xcodescripts / linker_arguments.sh
1 #!/bin/sh -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 TEMPDIR="${OUTPUTDIR}/linker_arguments_tmp"
23
24 mkdir -p "${TEMPDIR}"
25
26 ACTUALLIBS="${TEMPDIR}/${arch}.${variant}.actuallibs"
27 ALLLIBS="${TEMPDIR}/${arch}.${variant}.alllibs"
28 FROMUSRLIBSYSTEM="${TEMPDIR}/${arch}.${variant}.fromusrlibsystem"
29 FROMUSRLOCALLIBSYSTEM="${TEMPDIR}/${arch}.${variant}.fromusrlocallibsystem"
30 INUSRLIBSYSTEM="${TEMPDIR}/${arch}.${variant}.inusrlibsystem"
31 INUSRLOCALLIBSYSTEM="${TEMPDIR}/${arch}.${variant}.inusrlocallibsystem"
32 MISSINGLIBS="${TEMPDIR}/${arch}.${variant}.missinglibs"
33 POSSIBLEUSRLOCALLIBSYSTEM="${TEMPDIR}/${arch}.${variant}.possibleusrlocallibsystem"
34 OPTIONALLIBS="${SRCROOT}/optionallibs"
35 REQUIREDLIBS="${SRCROOT}/requiredlibs"
36
37 if [ ${variant} = "normal" ]; then
38 SUFFIX=""
39 else
40 SUFFIX="_${variant}"
41 fi
42
43 rm -f "${OUTPUTFILE}"
44
45 cat ${REQUIREDLIBS} ${OPTIONALLIBS} | sort > ${ALLLIBS}
46
47 # Strip away variant information to do presence checks
48 # non-normal variants can always link against normal clients
49 cd ${LSYS} && ls lib*.dylib | sed -E -e 's/_(debug|profile|static)\././' | while read l; do
50 xcrun -sdk "${SDKROOT}" lipo "${LSYS}/${l}" -verify_arch "${arch}" 2>/dev/null
51 if [ $? -eq 0 ]; then
52 echo "${l}"
53 fi
54 done | sed -E -e 's/^lib//' -e 's/\..*$$//' | sort -u > ${INUSRLIBSYSTEM}
55 cd ${LIBSYS} && ls lib*.a | sed -E -e 's/_(debug|profile|static)\././' | while read l; do
56 xcrun -sdk "${SDKROOT}" lipo "${LIBSYS}/${l}" -verify_arch "${arch}" 2>/dev/null
57 if [ $? -eq 0 ]; then
58 echo "${l}"
59 fi
60 done | sed -E -e 's/^lib//' -e 's/\..*$$//' | sort -u > ${INUSRLOCALLIBSYSTEM}
61 comm -12 ${ALLLIBS} ${INUSRLIBSYSTEM} > ${FROMUSRLIBSYSTEM}
62 comm -12 ${ALLLIBS} ${INUSRLOCALLIBSYSTEM} > ${POSSIBLEUSRLOCALLIBSYSTEM}
63 comm -13 ${FROMUSRLIBSYSTEM} ${POSSIBLEUSRLOCALLIBSYSTEM} > ${FROMUSRLOCALLIBSYSTEM}
64 cat ${FROMUSRLIBSYSTEM} ${FROMUSRLOCALLIBSYSTEM} | sort > ${ACTUALLIBS}
65 comm -23 ${REQUIREDLIBS} ${ACTUALLIBS} > ${MISSINGLIBS}
66
67 if [ -s ${MISSINGLIBS} ]; then
68 echo '*** missing required libs ***'
69 cat ${MISSINGLIBS}
70 exit 1
71 fi
72
73 cat ${FROMUSRLIBSYSTEM} | while read lib; do
74 echo "-Wl,-reexport-l${lib}"
75 done >> "${OUTPUTFILE}"
76
77 # Allow static archives to degrade to their non-variant versions
78 cat ${FROMUSRLOCALLIBSYSTEM} | while read lib; do
79 LPATH="${LIBSYS}/lib${lib}${SUFFIX}.a"
80 xcrun -sdk "${SDKROOT}" lipo "${LPATH}" -verify_arch "${arch}" 2>/dev/null
81 if [ $? -ne 0 ]; then
82 LPATH="${LIBSYS}/lib${lib}.a"
83 fi
84 echo "-Wl,-force_load,${LPATH}"
85 done >> "${OUTPUTFILE}"
86
87 echo "Final contents of ${OUTPUTFILE}:"
88 cat "${OUTPUTFILE}"
89 done
90 done
91
92 MARKERFILE="${OUTPUTDIR}/linker_arguments_changed.c"
93
94 for arch in ${ARCHS}; do
95 for variant in ${VARIANTS}; do
96 OUTPUTFILE="${OUTPUTDIR}/linker_arguments.${arch}.${variant}.txt"
97 cat "${OUTPUTFILE}"
98 done
99 done | shasum | sed 's,^,// ,' > "${MARKERFILE}"
100
101 exit 0