4 echo "Usage: $0 <archs> <variants> <outputdir> <sdkroot> <srcroot>" 1>&2
14 LIBSYS
="${SDKROOT}/usr/local/lib/system"
15 LSYS
="${SDKROOT}/usr/lib/system"
17 mkdir -p "${OUTPUTDIR}"
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"
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"
38 if [ ${variant} = "normal" ]; then
46 cat ${REQUIREDLIBS} ${OPTIONALLIBS} | sort > ${ALLLIBS}
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
54 xcrun
-sdk "${SDKROOT}" tapi archive
"${LSYS}/${l}" --verify-arch "${arch}" 2>/dev
/null
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
65 done | sed -E -e 's/^lib//' -e 's/\..*$$//' | sort -u > ${INUSRLOCALLIBSYSTEM}
68 for lib
in ${line} ; do
69 egrep "^${lib}$" ${INUSRLIBSYSTEM} && break
71 done < ${ALLLIBS} > ${FROMUSRLIBSYSTEM}
74 for lib
in ${line} ; do
75 egrep -q "^${lib}$" ${INUSRLIBSYSTEM} && break
76 egrep "^${lib}$" ${INUSRLOCALLIBSYSTEM} && break
78 done < ${ALLLIBS} > ${POSSIBLEUSRLOCALLIBSYSTEM}
80 comm -13 ${FROMUSRLIBSYSTEM} ${POSSIBLEUSRLOCALLIBSYSTEM} > ${FROMUSRLOCALLIBSYSTEM}
81 cat ${FROMUSRLIBSYSTEM} ${FROMUSRLOCALLIBSYSTEM} | sort > ${ACTUALLIBS}
85 for lib
in ${line} ; do
86 egrep -q "^${lib}$" ${ACTUALLIBS} && found
=1
88 [[ $found == 0 ]] && echo ${line}
89 done < ${REQUIREDLIBS} > ${MISSINGLIBS}
91 if [ -s ${MISSINGLIBS} ]; then
92 echo '*** missing required libs ***'
97 cat ${FROMUSRLIBSYSTEM} | while read lib
; do
98 echo "#define HAVE_"$(echo "${lib/_sim/}" | tr 'a-z' 'A-Z')" 1"
99 done >> "${OUTPUTCONFIG}"
101 cat ${FROMUSRLIBSYSTEM} | while read lib
; do
102 echo "-Wl,-reexport-l${lib}"
103 done >> "${OUTPUTFILE}"
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"
112 echo "-Wl,-force_load,${LPATH}"
113 done >> "${OUTPUTFILE}"
115 echo "Final contents of ${OUTPUTFILE}:"
120 MARKERFILE
="${OUTPUTDIR}/linker_arguments_changed.c"
122 for arch
in ${ARCHS}; do
123 for variant
in ${VARIANTS}; do
124 OUTPUTFILE
="${OUTPUTDIR}/linker_arguments.${arch}.${variant}.txt"
127 done | shasum
| sed 's,^,// ,' > "${MARKERFILE}"