summaryrefslogtreecommitdiffstats
path: root/bootstrap_cmds/migcom.tproj/mig.sh
diff options
context:
space:
mode:
Diffstat (limited to 'bootstrap_cmds/migcom.tproj/mig.sh')
-rw-r--r--bootstrap_cmds/migcom.tproj/mig.sh218
1 files changed, 218 insertions, 0 deletions
diff --git a/bootstrap_cmds/migcom.tproj/mig.sh b/bootstrap_cmds/migcom.tproj/mig.sh
new file mode 100644
index 0000000..85cf5a2
--- /dev/null
+++ b/bootstrap_cmds/migcom.tproj/mig.sh
@@ -0,0 +1,218 @@
+#!/bin/bash
+#
+# Copyright (c) 1999-2008 Apple Inc. All rights reserved.
+#
+# @APPLE_LICENSE_HEADER_START@
+#
+# "Portions Copyright (c) 1999, 2008 Apple Inc. All Rights
+# Reserved. This file contains Original Code and/or Modifications of
+# Original Code as defined in and that are subject to the Apple Public
+# Source License Version 1.0 (the 'License'). You may not use this file
+# except in compliance with the License. Please obtain a copy of the
+# License at http://www.apple.com/publicsource and read it before using
+# this file.
+#
+# The Original Code and all software distributed under the License are
+# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
+# License for the specific language governing rights and limitations
+# under the License."
+#
+# @APPLE_LICENSE_HEADER_END@
+#
+# Mach Operating System
+# Copyright (c) 1991,1990 Carnegie Mellon University
+# All Rights Reserved.
+#
+# Permission to use, copy, modify and distribute this software and its
+# documentation is hereby granted, provided that both the copyright
+# notice and this permission notice appear in all copies of the
+# software, derivative works or modified versions, and any portions
+# thereof, and that both notices appear in supporting documentation.
+#
+# CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+# CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+# ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+#
+# Carnegie Mellon requests users of this software to return to
+#
+# Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+# School of Computer Science
+# Carnegie Mellon University
+# Pittsburgh PA 15213-3890
+#
+# any improvements or extensions that they make and grant Carnegie Mellon
+# the rights to redistribute these changes.
+#
+
+realpath()
+{
+ local FILE="$1"
+ local PARENT=$(dirname "$FILE")
+ local BASE=$(basename "$FILE")
+ pushd "$PARENT" >/dev/null 2>&1 || return 0
+ local DIR=$(pwd -P)
+ popd >/dev/null
+ if [ "$DIR" == "/" ]; then
+ echo "/$BASE"
+ else
+ echo "$DIR/$BASE"
+ fi
+ return 1
+}
+
+scriptPath=$(realpath "$0")
+scriptRoot=$(dirname "$scriptPath")
+migcomPath=$(realpath "${scriptRoot}/../libexec/migcom")
+
+if [ -n "${SDKROOT}" ]; then
+ sdkRoot="${SDKROOT}";
+fi
+
+if [ -z "${MIGCC}" ]; then
+ xcrunPath="/usr/bin/xcrun"
+ if [ -x "${xcrunPath}" ]; then
+ MIGCC=`"${xcrunPath}" -sdk "$sdkRoot" -find cc`
+ else
+ MIGCC=$(realpath "${scriptRoot}/cc")
+ fi
+fi
+
+C=${MIGCC}
+M=${MIGCOM-${migcomPath}}
+
+if [ $# -eq 1 ] && [ "$1" = "-version" ] ; then
+ "$M" "$@"
+ exit $?
+fi
+
+cppflags="-D__MACH30__"
+
+files=
+arch=`/usr/bin/arch`
+
+WORKTMP=`/usr/bin/mktemp -d "${TMPDIR:-/tmp}/mig.XXXXXX"`
+if [ $? -ne 0 ]; then
+ echo "Failure creating temporary work directory: ${WORKTMP}"
+ echo "Exiting..."
+ exit 1
+fi
+
+# parse out the arguments until we hit plain file name(s)
+
+until [ $# -eq 0 ]
+do
+ case "$1" in
+ -[dtqkKQvVtTrRsSlLxXnN] ) migflags=( "${migflags[@]}" "$1" ); shift;;
+ -i ) sawI=1; migflags=( "${migflags[@]}" "$1" "$2" ); shift; shift;;
+ -user ) user="$2"; if [ ! "${sawI-}" ]; then migflags=( "${migflags[@]}" "$1" "$2" ); fi; shift; shift;;
+ -server ) server="$2"; migflags=( "${migflags[@]}" "$1" "$2" ); shift; shift;;
+ -header ) header="$2"; migflags=( "${migflags[@]}" "$1" "$2"); shift; shift;;
+ -sheader ) sheader="$2"; migflags=( "${migflags[@]}" "$1" "$2"); shift; shift;;
+ -iheader ) iheader="$2"; migflags=( "${migflags[@]}" "$1" "$2"); shift; shift;;
+ -dheader ) dheader="$2"; migflags=( "${migflags[@]}" "$1" "$2"); shift; shift;;
+ -arch ) arch="$2"; shift; shift;;
+ -target ) target=( "$1" "$2"); shift; shift;;
+ -maxonstack ) migflags=( "${migflags[@]}" "$1" "$2"); shift; shift;;
+ -split ) migflags=( "${migflags[@]}" "$1" ); shift;;
+ -novouchers ) migflags=( "${migflags[@]}" "$1" ); shift;;
+ -MD ) sawMD=1; cppflags=( "${cppflags[@]}" "$1"); shift;;
+ -cpp) shift; shift;;
+ -cc) C="$2"; shift; shift;;
+ -migcom) M="$2"; shift; shift;;
+ -isysroot) sdkRoot=$(realpath "$2"); shift; shift;;
+ -* ) cppflags=( "${cppflags[@]}" "$1"); shift;;
+ * ) break;;
+ esac
+done
+
+# process the rest as files
+until [ $# -eq 0 ]
+do
+ case "$1" in
+ -[dtqkKQvVtTrRsSlLxXnN] ) echo "warning: option \"$1\" after filename(s) ignored"; shift; continue;;
+ -i ) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -user ) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -server ) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -header ) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -sheader ) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -iheader ) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -dheader ) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -arch ) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift ; shift; continue;;
+ -target ) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift ; shift; continue;;
+ -maxonstack ) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -split ) echo "warning: option \"$1\" after filename(s) ignored"; shift; continue;;
+ -novouchers ) echo "warning: option \"$1\" after filename(s) ignored"; shift; continue;;
+ -MD ) echo "warning: option \"$1\" after filename(s) ignored"; shift; continue;;
+ -cpp) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -cc) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -migcom) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -isysroot) echo "warning: option \"$1 $2\" after filename(s) ignored"; shift; shift; continue;;
+ -* ) echo "warning: option \"$1\" after filename(s) ignored"; shift; continue;;
+ * ) file="$1"; shift;;
+ esac
+ base="$(basename "${file}" .defs)"
+ temp="${WORKTMP}/${base}.$$"
+ sourcedir="$(dirname "${file}")"
+ if [ -n "${sdkRoot}" ]
+ then
+ iSysRootParm=( "-isysroot" "${sdkRoot}" )
+ fi
+ if [ ! -r "${file}" ]
+ then
+ echo "error: cannot read file ${file}"
+ rm -rf ${WORKTMP}
+ exit 1
+ fi
+ rm -f "${temp}.c" "${temp}.d"
+ (echo '#line 1 '\"${file}\" ; cat "${file}" ) > "${temp}.c"
+ "$C" -E -arch ${arch} "${target[@]}" "${cppflags[@]}" -I "${sourcedir}" "${iSysRootParm[@]}" "${temp}.c" | "$M" "${migflags[@]}"
+ if [ $? -ne 0 ]
+ then
+ rm -rf "${temp}.c" "${temp}.d" "${WORKTMP}"
+ exit 1
+ fi
+ if [ "${sawMD}" -a -f "${temp}.d" ]
+ then
+ deps=
+ s=
+ rheader="${header-${base}.h}"
+ if [ "${rheader}" != /dev/null ]; then
+ deps="${deps}${s}${rheader}"; s=" "
+ fi
+ ruser="${user-${base}User.c}"
+ if [ "${ruser}" != /dev/null ]; then
+ deps="${deps}${s}${ruser}"; s=" "
+ fi
+ rserver="${server-${base}Server.c}"
+ if [ "${rserver}" != /dev/null ]; then
+ deps="${deps}${s}${rserver}"; s=" "
+ fi
+ rsheader="${sheader-/dev/null}"
+ if [ "${rsheader}" != /dev/null ]; then
+ deps="${deps}${s}${rsheader}"; s=" "
+ fi
+ riheader="${iheader-/dev/null}"
+ if [ "${riheader}" != /dev/null ]; then
+ deps="${deps}${s}${riheader}"; s=" "
+ fi
+ rdheader="${dheader-/dev/null}"
+ if [ "${rdheader}" != /dev/null ]; then
+ deps="${deps}${s}${rdheader}"; s=" "
+ fi
+ for target in "${deps}"
+ do
+ sed -e 's;^'"${temp}"'.o[ ]*:;'"${target}"':;' \
+ -e 's;: '"${temp}"'.c;: '"$file"';' \
+ < "${temp}.d" > "${target}.d"
+ done
+ rm -f "${temp}.d"
+ fi
+ rm -f "${temp}.c"
+done
+
+/bin/rmdir "${WORKTMP}"
+exit 0
+