#! /bin/bash # 1. Determine platform PLATFORM='' if [ -n "$1" ]; then PLATFORM="$1" if [ "${PLATFORM}" = "auto" ]; then PLATFORM='' fi fi if [ -z "${PLATFORM}" ]; then # Determine platform from what GCC was compiled for if possible PLATFORM="$(gcc -dumpmachine 2>/dev/null)" case "${PLATFORM}" in *-redhat-linux) # Fix-up RHEL to include version number rhel_version="$(sed 's@.* release \([0-9][0-9]*\)\..*@\1@' /etc/redhat-release)" PLATFORM="$(echo "${PLATFORM}" | sed "s@-redhat-@-redhat${rhel_version}-@")" if [ "${rhel_version}" = '5' ]; then BUILD_CC_GCC_CONFIGURE_EXTRA="${BUILD_CC_GCC_CONFIGURE_EXTRA} --disable-libsanitizer --disable-target-libsanitizer" fi ;; esac fi if [ -z "${PLATFORM}" ]; then case "$(uname -s)" in SunOS) case "$(uname -r)" in 5.*) SOLARIS_VERSION="2.$(uname -r | cut -f 2 -d '.')" ;; *) SOLARIS_VERSION="1.$(uname -r | cut -f 2 -d '.')" ;; esac if isainfo 2>/dev/null | grep sparc >/dev/null; then PLATFORM="sparc-sun-solaris${SOLARIS_VERSION}" elif isainfo 2>/dev/null | grep i386 >/dev/null; then PLATFORM="i386-pc-solaris${SOLARIS_VERSION}" fi ;; HP-UX) HPUX_VERSION="$(uname -r | sed 's@^[A-Z][A-Z]*\.@@')" if hp-pa 2>/dev/null >/dev/null; then if [ -d '/usr/lib/pa20_64' ]; then PLATFORM="hppa64-hp-hpux${HPUX_VERSION}" else PLATFORM="hppa1.1-hp-hpux${HPUX_VERSION}" fi else PLATFORM="ia64-hp-hpux${HPUX_VERSION}" fi ;; NetBSD) PLATFORM="$(uname -p)-unknown-netbsd$(uname -r | cut -f 1 -d '.')" ;; FreeBSD) # Determine more generic CPU platform name cpu_platform="$(uname -p)" case "${cpu_platform}" in amd64) cpu_platform="x86_64" ;; esac PLATFORM="${cpu_platform}-unknown-freebsd$(uname -r | cut -f 1 -d '.')" ;; Darwin) case "$(uname -r)" in 11.*) cpu_platform="x86_64" ;; esac PLATFORM="${cpu_platform}-apple-darwin$(uname -r | cut -f 1 -d '.')" ;; Linux) libc="" for testfile in /lib{,64}/libc-2.*.so; do if [ ! -f "${testfile}" ]; then continue fi libc="-gnu" break done PLATFORM="$(uname -m)-unknown-linux${libc}" ;; AIX) PLATFORM="$(uname -p)-ibm-aix$(uname -v).$(uname -r).0.0" ;; esac fi if [ -z "${PLATFORM}" ]; then echo 'Unable to guess platform. Try specifying the platform.' >&2 exit 1 fi # 2. Create directory to hold system files PLATFORM_ROOT="/var/tmp/platform-$$${RANDOM}${RANDOM}${RANDOM}" PLATFORM_INCLUDE="${PLATFORM_ROOT}/include" PLATFORM_LIB="${PLATFORM_ROOT}/lib" PLATFORM_PKGCONFIG="${PLATFORM_ROOT}/lib/pkgconfig" rm -rf "${PLATFORM_ROOT}" mkdir -p "${PLATFORM_ROOT}" "${PLATFORM_LIB}" "${PLATFORM_INCLUDE}" "${PLATFORM_PKGCONFIG}" # 3. Collect header files case "${PLATFORM}" in *-solaris2*) # Libraries mkdir "${PLATFORM_LIB}/64" cp /usr/lib/64/*.o "${PLATFORM_LIB}/64/" cp /lib/64/lib*.so* "${PLATFORM_LIB}/64/" cp /lib/64/lib*.a "${PLATFORM_LIB}/64/" cp /usr/lib/64/lib*.so* "${PLATFORM_LIB}/64/" cp /usr/lib/64/lib*.a "${PLATFORM_LIB}/64/" cp /usr/sfw/lib/64/lib*.so* "${PLATFORM_LIB}/64/" cp /usr/sfw/lib/64/lib*.a "${PLATFORM_LIB}/64/" if echo "${PLATFORM}" | grep '^sparc' >/dev/null; then ln -s '64' "${PLATFORM_LIB}/sparcv9" else ln -s '64' "${PLATFORM_LIB}/amd64" fi cp /usr/lib/*.o "${PLATFORM_LIB}/" cp /lib/lib*.so* "${PLATFORM_LIB}/" cp /lib/lib*.a "${PLATFORM_LIB}/" cp /usr/lib/lib*.so* "${PLATFORM_LIB}/" cp /usr/lib/lib*.a "${PLATFORM_LIB}/" cp /usr/sfw/lib/lib*.so* "${PLATFORM_LIB}/" cp /usr/sfw/lib/lib*.a "${PLATFORM_LIB}/" ln -s '.' "${PLATFORM_LIB}/32" # Headers cp -rp /usr/include/* "${PLATFORM_INCLUDE}/" # "pkgconfig" mkdir "${PLATFORM_LIB}/64/pkgconfig" cp /usr/lib/pkgconfig/*.pc "${PLATFORM_PKGCONFIG}/" cp /usr/sfw/lib/pkgconfig/*.pc "${PLATFORM_PKGCONFIG}/" cp /usr/lib/64/pkgconfig/*.pc "${PLATFORM_LIB}/64/pkgconfig/" cp /usr/sfw/lib/64/pkgconfig/*.pc "${PLATFORM_LIB}/64/pkgconfig/" ;; *-linux*) # Libraries SRCLIB32='lib' SRCLIB64='' SRCLIBPLAT="lib/${PLATFORM}" if [ -d '/usr/lib32' ]; then SRCLIB32='lib32' fi if [ -d '/usr/lib64' ]; then SRCLIB64='lib64' elif [ -d '/usr/lib' -a -d '/usr/lib32' -a ! '/usr/lib' -ef '/usr/lib32' ]; then SRCLIB64='lib' fi cp /usr/${SRCLIB32}/*.o "${PLATFORM_LIB}/" cp /usr/${SRCLIB32}/lib*.so* "${PLATFORM_LIB}/" cp /usr/${SRCLIB32}/lib*.a "${PLATFORM_LIB}/" cp /usr/${SRCLIB32}/ld-*.so* "${PLATFORM_LIB}/" cp /${SRCLIB32}/*.o "${PLATFORM_LIB}/" cp /${SRCLIB32}/lib*.so* "${PLATFORM_LIB}/" cp /${SRCLIB32}/lib*.a "${PLATFORM_LIB}/" cp /${SRCLIB32}/ld-*.so* "${PLATFORM_LIB}/" if [ -d "/usr/${SRCLIBPLAT}" ]; then cp /usr/${SRCLIBPLAT}/*.o "${PLATFORM_LIB}/" cp /usr/${SRCLIBPLAT}/lib*.so* "${PLATFORM_LIB}/" cp /usr/${SRCLIBPLAT}/lib*.a "${PLATFORM_LIB}/" cp /usr/${SRCLIBPLAT}/ld-*.so* "${PLATFORM_LIB}/" ln -s . "${PLATFORM_LIB}/${PLATFORM}" fi if [ -d "/${SRCLIBPLAT}" ]; then cp /${SRCLIBPLAT}/*.o "${PLATFORM_LIB}/" cp /${SRCLIBPLAT}/lib*.so* "${PLATFORM_LIB}/" cp /${SRCLIBPLAT}/lib*.a "${PLATFORM_LIB}/" cp /${SRCLIBPLAT}/ld-*.so* "${PLATFORM_LIB}/" ln -s . "${PLATFORM_LIB}/${PLATFORM}" fi if [ -n "${SRCLIB64}" ]; then PLATFORM_LIB64="${PLATFORM_ROOT}/lib64" PLATFORM_PKGCONFIG64="${PLATFORM_LIB64}/pkgconfig" mkdir -p "${PLATFORM_LIB64}" "${PLATFORM_PKGCONFIG64}" cp /usr/${SRCLIB64}/*.o "${PLATFORM_LIB64}/" cp /usr/${SRCLIB64}/lib*.so* "${PLATFORM_LIB64}/" cp /usr/${SRCLIB64}/lib*.a "${PLATFORM_LIB64}/" cp /usr/${SRCLIB64}/ld-*.so* "${PLATFORM_LIB64}/" cp /${SRCLIB64}/*.o "${PLATFORM_LIB64}/" cp /${SRCLIB64}/lib*.so* "${PLATFORM_LIB64}/" cp /${SRCLIB64}/lib*.a "${PLATFORM_LIB64}/" cp /${SRCLIB64}/ld-*.so* "${PLATFORM_LIB64}/" echo 1 > "${PLATFORM_ROOT}/multilib" else echo 0 > "${PLATFORM_ROOT}/multilib" fi # Headers cp -rp /usr/include/* "${PLATFORM_INCLUDE}/" # "pkgconfig" cp /usr/${SRCLIB32}/pkgconfig/*.pc "${PLATFORM_PKGCONFIG}/" cp /${SRCLIB32}/pkgconfig/*.pc "${PLATFORM_PKGCONFIG}/" if [ -d "/usr/${SRCLIBPLAT}/pkgconfig" ]; then cp /usr/${SRCLIBPLAT}/pkgconfig/*.pc "${PLATFORM_PKGCONFIG}/" fi if [ -d "/${SRCLIBPLAT}/pkgconfig" ]; then cp /${SRCLIBPLAT}/pkgconfig/*.pc "${PLATFORM_PKGCONFIG}/" fi if [ -n "${SRCLIB64}" ]; then cp /usr/${SRCLIB64}/pkgconfig/*.pc "${PLATFORM_PKGCONFIG64}/" cp /${SRCLIB64}/pkgconfig/*.pc "${PLATFORM_PKGCONFIG64}/" fi if [ -d "/usr/share/pkgconfig" ]; then cp /usr/share/pkgconfig/*.pc "${PLATFORM_PKGCONFIG}/" fi ;; *-aix*) # Libraries cp /usr/lib/*.o "${PLATFORM_LIB}/" cp /usr/lib/*.exp "${PLATFORM_LIB}/" cp /usr/lib/lib*.so* "${PLATFORM_LIB}/" cp /usr/lib/lib*.a "${PLATFORM_LIB}/" cp /lib/*.o "${PLATFORM_LIB}/" cp /lib/*.exp "${PLATFORM_LIB}/" cp /lib/lib*.so* "${PLATFORM_LIB}/" cp /lib/lib*.a "${PLATFORM_LIB}/" # Headers cp -rp /usr/include/* "${PLATFORM_INCLUDE}/" ;; *-netbsd*) # Libraries mkdir -p "${PLATFORM_ROOT}/libexec/" ## Determine the X11 sub-directory for xdir in X11R7 X11R6 __fail__; do if [ -d "/usr/${xdir}/lib" ]; then break fi if [ "${xdir}" = "__fail__" ]; then echo 'WARNING: Unable to find X11 libraries, collection will be incomplete!' >&2 fi done ## Determine sub-archs echo 0 > "${PLATFORM_ROOT}/multilib" for subarch in i386 sparc; do subarchdir="/usr/lib/${subarch}" if [ ! -d "${subarchdir}" ]; then continue fi platform_subarchdir="${PLATFORM_LIB}/${subarch}" mkdir "${platform_subarchdir}" cp "${subarchdir}"/*.o "${platform_subarchdir}/" cp "${subarchdir}"/lib*.so "${platform_subarchdir}/" cp "${subarchdir}"/lib*.a "${platform_subarchdir}/" cp "/usr/libexec/ld.elf_so-${subarch}" "${PLATFORM_ROOT}/libexec/" platform_subarchpkgcfgdir="${platform_subarchdir}/pkgconfig" mkdir -p "${platform_subarchpkgcfgdir}" cp "${subarchdir}"/pkgconfig/*.pc "${platform_subarchpkgcfgdir}/" echo 1 > "${PLATFORM_ROOT}/multilib" done cp /usr/${xdir}/lib/lib*.so* "${PLATFORM_LIB}/" cp /usr/${xdir}/lib/*.a "${PLATFORM_LIB}/" cp /usr/lib/*.o "${PLATFORM_LIB}/" cp /usr/lib/lib*.so* "${PLATFORM_LIB}/" cp /usr/lib/lib*.a "${PLATFORM_LIB}/" cp /lib/lib*.so* "${PLATFORM_LIB}/" cp /lib/lib*.a "${PLATFORM_LIB}/" # Shared object loader cp /usr/libexec/ld.elf_so "${PLATFORM_ROOT}/libexec/" # Headers cp -rp /usr/${xdir}/include/* "${PLATFORM_INCLUDE}/" cp -rp /usr/include/* "${PLATFORM_INCLUDE}/" # "pkgconfig" cp /usr/lib/pkgconfig/*.pc "${PLATFORM_PKGCONFIG}/" ;; *-hpux11*) # Libraries if echo "${PLATFORM}" | grep '^hppa64-' >/dev/null; then if [ -d '/usr/lib/pa20_64' ]; then cp /usr/lib/pa20_64/*.o "${PLATFORM_LIB}" cp /usr/ccs/lib/pa20_64/*.o "${PLATFORM_LIB}" cp /usr/lib/pa20_64/lib*.[0-9] "${PLATFORM_LIB}" cp /usr/lib/pa20_64/lib*.sl "${PLATFORM_LIB}" cp /usr/lib/pa20_64/*.a "${PLATFORM_LIB}" cp /usr/lib/X11R6/pa20_64/lib*.[0-9] "${PLATFORM_LIB}" cp /usr/lib/X11R6/pa20_64/lib*.sl "${PLATFORM_LIB}" cp /usr/lib/X11R6/pa20_64/*.a "${PLATFORM_LIB}" fi echo 0 > "${PLATFORM_ROOT}/multilib" else cp /usr/lib/*.o "${PLATFORM_LIB}" cp /usr/lib/lib*.[0-9] "${PLATFORM_LIB}" cp /usr/lib/lib*.sl "${PLATFORM_LIB}" cp /usr/lib/*.a "${PLATFORM_LIB}" cp /usr/lib/X11R6/lib*.[0-9] "${PLATFORM_LIB}" cp /usr/lib/X11R6/lib*.sl "${PLATFORM_LIB}" cp /usr/lib/X11R6/*.a "${PLATFORM_LIB}" fi ## Create lib symlinks as needed ( cd "${PLATFORM_LIB}" || exit 1 for libfile in *.[0-9]; do if echo "${libfile}" | grep '\.sl' >/dev/null; then continue fi shlib="$(echo "${libfile}" | sed 's@\.[0-9]$@@').sl" if [ -f "${shlib}" ]; then continue fi rm -f "${shlib}" ln -s "${libfile}" "${shlib}" done ) # Headers ## Create all directories ( cd /usr/include || exit 1 find . -type d ) | while read dir; do mkdir "${PLATFORM_INCLUDE}/${dir}" >/dev/null 2>/dev/null done ## Create all symlinks to directories ( cd /usr/include || exit 1 find . -type l ) | while read link; do if [ ! -d "/usr/include/${link}" ]; then continue fi cp -R "/usr/include/${link}" "${PLATFORM_INCLUDE}/${link}" done ## Create all files ( cd /usr/include || exit 1 find . -type f ) | while read file; do cat "/usr/include/${file}" > "${PLATFORM_INCLUDE}/${file}" done ;; *-darwin*) # Determine path to SDK ## Determine Mac OS X version macosxvers_maj='10' macosxvers_min="$[$(uname -r | cut -f 1 -d '.') - 4]" ## Determine SDK path from version sdkroot='/Developer/SDKs' if [ -d "${sdkroot}/MacOSX${macosxvers_maj}.${macosxvers_min}.sdk" ]; then sdkdir="${sdkroot}/MacOSX${macosxvers_maj}.${macosxvers_min}.sdk" else sdkdir="$(ls -1 "${sdkroot}/MacOSX${macosxvers_maj}.${macosxvers_min}*.sdk" | head -1)" fi # Libraries cp /usr/lib/*.o "${PLATFORM_LIB}" cp /usr/lib/lib*.dylib* "${PLATFORM_LIB}" cp /usr/lib/lib*.a "${PLATFORM_LIB}" cp /usr/lib/system/*.o "${PLATFORM_LIB}" cp /usr/lib/system/lib*.dylib* "${PLATFORM_LIB}" cp /usr/lib/system/lib*.a "${PLATFORM_LIB}" # Headers cp -rp /usr/include/* "${PLATFORM_INCLUDE}/" # Frameworks PLATFORM_FRAMEWORKS="${PLATFORM_ROOT}/System/Library/Frameworks" export PLATFORM_FRAMEWORKS mkdir -p "${PLATFORM_FRAMEWORKS}" cp -rp "${sdkdir}/System/Library/Frameworks"/*.framework "${PLATFORM_FRAMEWORKS}" ;; *) # Print a warning if this is an unknown platform case "${PLATFORM}" in *-freebsd*) # FreeBSD is generic, non-multilib mkdir -p "${PLATFORM_ROOT}/libexec" cp /libexec/ld-elf.so* "${PLATFORM_ROOT}/libexec/" ;; *) echo 'WARNING: Unknown system type, using generic collection' >&2 ;; esac # Libraries cp /usr/local/lib/*.o "${PLATFORM_LIB}" cp /usr/local/lib/lib*.so* "${PLATFORM_LIB}" cp /usr/local/lib/lib*.a "${PLATFORM_LIB}" cp /usr/lib/*.o "${PLATFORM_LIB}" cp /usr/lib/lib*.so* "${PLATFORM_LIB}" cp /usr/lib/lib*.a "${PLATFORM_LIB}" cp /lib/*.o "${PLATFORM_LIB}" cp /lib/lib*.so* "${PLATFORM_LIB}" cp /lib/lib*.a "${PLATFORM_LIB}" # Headers cp -rp /usr/local/include/* "${PLATFORM_INCLUDE}/" cp -rp /usr/include/* "${PLATFORM_INCLUDE}/" # "pkgconfig" cp /usr/local/lib/pkgconfig/*.pc "${PLATFORM_PKGCONFIG}/" cp /usr/lib/pkgconfig/*.pc "${PLATFORM_PKGCONFIG}/" cp /lib/pkgconfig/*.pc "${PLATFORM_PKGCONFIG}/" # Disable multilib since we only collected one platform echo 0 > "${PLATFORM_ROOT}/multilib" ;; esac if [ -n "${BUILD_CC_GCC_CONFIGURE_EXTRA}" ]; then echo "${BUILD_CC_GCC_CONFIGURE_EXTRA}" > "${PLATFORM_ROOT}/BUILD_CC_GCC_CONFIGURE_EXTRA" fi # 4. Create archive ## Resolve symlinks find "${PLATFORM_ROOT}" -type l | while read link; do if [ -d "${link}" ]; then continue fi cat "${link}" > "${link}.new" rm "${link}" mv "${link}.new" "${link}" done ## Re-create safe symlinks ( cd "${PLATFORM_ROOT}" || exit 1 prevhash=''; find . -type f | xargs openssl sha1 | sed 's@^SHA1(\(.*\))= \([0-9a-f][0-9a-f]*\)$@\2 \1@' | sort | while read hash file; do file="$(echo "${file}" | sed 's@^\./@@')" if [ "${hash}" = "${prevhash}" ]; then numslashes="$(echo "${file}" | sed 's@[^/]@@g' | wc -c | awk '{ print $1 - 1 }')" prefix='' for ((idx = 0; $idx < $numslashes; idx++)); do prefix="../${prefix}" done rm -f "${file}" ln -s "${prefix}${prevfile}" "${file}" continue fi prevhash="${hash}" prevfile="${file}" done ) ## Create archive ( cd "${PLATFORM_ROOT}" || exit 1 tar -cf - * ) | bzip2 -9c > "${PLATFORM}-platform.tar.bz2" ## Remove temporary files rm -rf "${PLATFORM_ROOT}" exit 0