1#!/bin/bash -x 2 3if [ $# -ne 5 ]; then 4 echo "Usage: $0 <archs> <variants> <outputdir> <sdkroot> <srcroot>" 1>&2 5 exit 1 6fi 7 8ARCHS="$1" 9VARIANTS="$2" 10OUTPUTDIR="$3" 11SDKROOT="$4" 12SRCROOT="$5" 13 14LIBSYS="${SDKROOT}/usr/local/lib/system" 15LSYS="${SDKROOT}/usr/lib/system" 16 17mkdir -p "${OUTPUTDIR}" 18 19for 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 | sed -E -e 's/_(debug|profile|static)\././' | while read l; do 51 xcrun -sdk "${SDKROOT}" lipo "${LSYS}/${l}" -verify_arch "${arch}" 2>/dev/null 52 if [ $? -eq 0 ]; then 53 echo "${l}" 54 fi 55 done | sed -E -e 's/^lib//' -e 's/\..*$$//' | sort -u > ${INUSRLIBSYSTEM} 56 cd ${LIBSYS} && ls lib*.a | sed -E -e 's/_(debug|profile|static)\././' | while read l; do 57 xcrun -sdk "${SDKROOT}" lipo "${LIBSYS}/${l}" -verify_arch "${arch}" 2>/dev/null 58 if [ $? -eq 0 ]; then 59 echo "${l}" 60 fi 61 done | sed -E -e 's/^lib//' -e 's/\..*$$//' | sort -u > ${INUSRLOCALLIBSYSTEM} 62 63 while read line ; do 64 for lib in ${line} ; do 65 egrep "^${lib}$" ${INUSRLIBSYSTEM} && break 66 done 67 done < ${ALLLIBS} > ${FROMUSRLIBSYSTEM} 68 69 while read line ; do 70 for lib in ${line} ; do 71 egrep "^${lib}$" ${INUSRLOCALLIBSYSTEM} && break 72 done 73 done < ${ALLLIBS} > ${POSSIBLEUSRLOCALLIBSYSTEM} 74 75 comm -13 ${FROMUSRLIBSYSTEM} ${POSSIBLEUSRLOCALLIBSYSTEM} > ${FROMUSRLOCALLIBSYSTEM} 76 cat ${FROMUSRLIBSYSTEM} ${FROMUSRLOCALLIBSYSTEM} | sort > ${ACTUALLIBS} 77 78 while read line ; do 79 found=0 80 for lib in ${line} ; do 81 egrep -q "^${lib}$" ${ACTUALLIBS} && found=1 82 done 83 [[ $found == 0 ]] && echo ${line} 84 done < ${REQUIREDLIBS} > ${MISSINGLIBS} 85 86 if [ -s ${MISSINGLIBS} ]; then 87 echo '*** missing required libs ***' 88 cat ${MISSINGLIBS} 89 exit 1 90 fi 91 92 cat ${FROMUSRLIBSYSTEM} | while read lib; do 93 echo "#define HAVE_"$(echo "${lib/_sim/}" | tr 'a-z' 'A-Z')" 1" 94 done >> "${OUTPUTCONFIG}" 95 96 cat ${FROMUSRLIBSYSTEM} | while read lib; do 97 echo "-Wl,-reexport-l${lib}" 98 done >> "${OUTPUTFILE}" 99 100 # Allow static archives to degrade to their non-variant versions 101 cat ${FROMUSRLOCALLIBSYSTEM} | while read lib; do 102 LPATH="${LIBSYS}/lib${lib}${SUFFIX}.a" 103 xcrun -sdk "${SDKROOT}" lipo "${LPATH}" -verify_arch "${arch}" 2>/dev/null 104 if [ $? -ne 0 ]; then 105 LPATH="${LIBSYS}/lib${lib}.a" 106 fi 107 echo "-Wl,-force_load,${LPATH}" 108 done >> "${OUTPUTFILE}" 109 110 echo "Final contents of ${OUTPUTFILE}:" 111 cat "${OUTPUTFILE}" 112 done 113done 114 115MARKERFILE="${OUTPUTDIR}/linker_arguments_changed.c" 116 117for arch in ${ARCHS}; do 118 for variant in ${VARIANTS}; do 119 OUTPUTFILE="${OUTPUTDIR}/linker_arguments.${arch}.${variant}.txt" 120 cat "${OUTPUTFILE}" 121 done 122done | shasum | sed 's,^,// ,' > "${MARKERFILE}" 123 124exit 0 125