4 echo "Usage: $0 <archs> <variants> <outputdir> <sdkroot> <srcroot>" 1>&2
16 LIBSYS
="${SDKROOT}/${SDK_INSTALL_ROOT}/usr/local/lib/system"
17 LSYS
="${SDKROOT}/${SDK_INSTALL_ROOT}/usr/lib/system"
19 mkdir -p "${OUTPUTDIR}"
21 for arch
in ${ARCHS}; do
22 for variant
in ${VARIANTS}; do
23 OUTPUTFILE
="${OUTPUTDIR}/linker_arguments.${arch}.${variant}.txt"
24 OUTPUTCONFIG
="${OUTPUTDIR}/config.${arch}.${variant}.h"
25 TEMPDIR
="${OUTPUTDIR}/linker_arguments_tmp"
27 SDK_INSTALL_VARIANT
="${DRIVERKIT:+_driverkit}"
29 # Unwinding i386 dependencies.
30 # there are no more "real" uses of i386 Libsystem, only dependency
31 # cycles from within the umbrella (plus libobjc and libc++).
32 # We will remove non-critical dylibs (that have no real dependents
33 # anymore) from the umbrella to decrease the overall size of the
35 # (Note that there is no i386 driverkit so this does not conflict
36 # with the preceding rule)
37 if [ "$arch" = "i386" ]; then
38 SDK_INSTALL_VARIANT
="_i386"
43 ACTUALLIBS
="${TEMPDIR}/${arch}.${variant}.actuallibs"
44 ALLLIBS
="${TEMPDIR}/${arch}.${variant}.alllibs"
45 FROMUSRLIBSYSTEM
="${TEMPDIR}/${arch}.${variant}.fromusrlibsystem"
46 FROMUSRLOCALLIBSYSTEM
="${TEMPDIR}/${arch}.${variant}.fromusrlocallibsystem"
47 INUSRLIBSYSTEM
="${TEMPDIR}/${arch}.${variant}.inusrlibsystem"
48 INUSRLOCALLIBSYSTEM
="${TEMPDIR}/${arch}.${variant}.inusrlocallibsystem"
49 MISSINGLIBS
="${TEMPDIR}/${arch}.${variant}.missinglibs"
50 POSSIBLEUSRLOCALLIBSYSTEM
="${TEMPDIR}/${arch}.${variant}.possibleusrlocallibsystem"
51 OPTIONALLIBS
="${SRCROOT}/optionallibs${SDK_INSTALL_VARIANT}"
52 REQUIREDLIBS
="${SRCROOT}/requiredlibs${SDK_INSTALL_VARIANT}"
54 if [ ${variant} = "normal" ]; then
62 cat ${REQUIREDLIBS} ${OPTIONALLIBS} | sort > ${ALLLIBS}
64 # Strip away variant information to do presence checks
65 # non-normal variants can always link against normal clients
66 cd ${LSYS} && ls lib
*.
{dylib
,tbd
,api
,spi
} | sed -E -e 's/_(debug|profile|static)\././' | while read l
; do
67 if [ "${l: -6}" == ".dylib" ]; then
68 xcrun
-sdk "${SDKROOT}" lipo
"${LSYS}/${l}" -verify_arch "${arch}" 2>/dev
/null
70 xcrun
-sdk "${SDKROOT}" tapi archive
"${LSYS}/${l}" --verify-arch "${arch}" 2>/dev
/null
75 done | sed -E -e 's/^lib//' -e 's/\..*$$//' | sort -u > ${INUSRLIBSYSTEM}
76 [ -d ${LIBSYS} ] && cd ${LIBSYS} && ls lib
*.a
| sed -E -e 's/_(debug|profile|static)\././' | while read l
; do
77 xcrun
-sdk "${SDKROOT}" lipo
"${LIBSYS}/${l}" -verify_arch "${arch}" 2>/dev
/null
81 done | sed -E -e 's/^lib//' -e 's/\..*$$//' | sort -u > ${INUSRLOCALLIBSYSTEM}
84 for lib
in ${line} ; do
85 egrep "^${lib}$" ${INUSRLIBSYSTEM} && break
87 done < ${ALLLIBS} > ${FROMUSRLIBSYSTEM}
90 for lib
in ${line} ; do
91 egrep -q "^${lib}$" ${INUSRLIBSYSTEM} && break
92 egrep "^${lib}$" ${INUSRLOCALLIBSYSTEM} && break
94 done < ${ALLLIBS} > ${POSSIBLEUSRLOCALLIBSYSTEM}
96 comm -13 ${FROMUSRLIBSYSTEM} ${POSSIBLEUSRLOCALLIBSYSTEM} > ${FROMUSRLOCALLIBSYSTEM}
97 cat ${FROMUSRLIBSYSTEM} ${FROMUSRLOCALLIBSYSTEM} | sort > ${ACTUALLIBS}
101 for lib
in ${line} ; do
102 egrep -q "^${lib}$" ${ACTUALLIBS} && found
=1
104 [[ $found == 0 ]] && echo ${line}
105 done < ${REQUIREDLIBS} > ${MISSINGLIBS}
107 if [ -s ${MISSINGLIBS} ]; then
108 echo '*** missing required libs ***'
113 cat ${FROMUSRLIBSYSTEM} | while read lib
; do
114 echo "#define HAVE_"$(echo "${lib/_sim/}" | tr 'a-z' 'A-Z')" 1"
115 done >> "${OUTPUTCONFIG}"
117 cat ${FROMUSRLIBSYSTEM} | while read lib
; do
118 echo "-Wl,-reexport-l${lib}"
119 done >> "${OUTPUTFILE}"
121 # Allow static archives to degrade to their non-variant versions
122 cat ${FROMUSRLOCALLIBSYSTEM} | while read lib
; do
123 LPATH
="${LIBSYS}/lib${lib}${SUFFIX}.a"
124 xcrun
-sdk "${SDKROOT}" lipo
"${LPATH}" -verify_arch "${arch}" 2>/dev
/null
125 if [ $?
-ne 0 ]; then
126 LPATH
="${LIBSYS}/lib${lib}.a"
128 echo "-Wl,-force_load,${LPATH}"
129 done >> "${OUTPUTFILE}"
131 echo "Final contents of ${OUTPUTFILE}:"
136 MARKERFILE
="${OUTPUTDIR}/linker_arguments_changed.c"
138 for arch
in ${ARCHS}; do
139 for variant
in ${VARIANTS}; do
140 OUTPUTFILE
="${OUTPUTDIR}/linker_arguments.${arch}.${variant}.txt"
143 done | shasum
| sed 's,^,// ,' > "${MARKERFILE}"