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