summaryrefslogtreecommitdiff
path: root/tiger-compiler/bootstrap
diff options
context:
space:
mode:
Diffstat (limited to 'tiger-compiler/bootstrap')
-rwxr-xr-xtiger-compiler/bootstrap203
1 files changed, 203 insertions, 0 deletions
diff --git a/tiger-compiler/bootstrap b/tiger-compiler/bootstrap
new file mode 100755
index 0000000..84bd56d
--- /dev/null
+++ b/tiger-compiler/bootstrap
@@ -0,0 +1,203 @@
+#! /bin/sh
+
+
+fatal ()
+{
+ echo >&2 "$0: $@"
+ exit 1
+}
+
+usage ()
+{
+ cat <<EOF
+Usage: $0 [OPTION]
+
+Options:
+ -h, --help display this message
+ -m, --make run make at the end of the bootstraping
+
+Report bugs to <tiger@lrde.epita.fr>
+EOF
+}
+
+# Run make at the end of the bootstraping?
+run_make_p=false
+
+awk_strverscmp='
+ # Use only awk features that work with 7th edition Unix awk (1978).
+ # My, what an old awk you have, Mr. Solaris!
+ END {
+ while (length(v1) || length(v2)) {
+ # Set d1 to be the next thing to compare from v1, and likewise for d2.
+ # Normally this is a single character, but if v1 and v2 contain digits,
+ # compare them as integers and fractions as strverscmp does.
+ if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) {
+ # Split v1 and v2 into their leading digit string components d1 and d2,
+ # and advance v1 and v2 past the leading digit strings.
+ for (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue
+ for (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue
+ d1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1)
+ d2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1)
+ if (d1 ~ /^0/) {
+ if (d2 ~ /^0/) {
+ # Compare two fractions.
+ while (d1 ~ /^0/ && d2 ~ /^0/) {
+ d1 = substr(d1, 2); len1--
+ d2 = substr(d2, 2); len2--
+ }
+ if (len1 != len2 && ! (len1 && len2 && substr(d1, 1, 1) == substr(d2, 1, 1))) {
+ # The two components differ in length, and the common prefix
+ # contains only leading zeros. Consider the longer to be less.
+ d1 = -len1
+ d2 = -len2
+ } else {
+ # Otherwise, compare as strings.
+ d1 = "x" d1
+ d2 = "x" d2
+ }
+ } else {
+ # A fraction is less than an integer.
+ exit 1
+ }
+ } else {
+ if (d2 ~ /^0/) {
+ # An integer is greater than a fraction.
+ exit 2
+ } else {
+ # Compare two integers.
+ d1 += 0
+ d2 += 0
+ }
+ }
+ } else {
+ # The normal case, without worrying about digits.
+ if (v1 == "") d1 = v1; else { d1 = substr(v1, 1, 1); v1 = substr(v1,2) }
+ if (v2 == "") d2 = v2; else { d2 = substr(v2, 1, 1); v2 = substr(v2,2) }
+ }
+ if (d1 < d2) exit 1
+ if (d1 > d2) exit 2
+ }
+ }
+'
+
+version_compare ()
+{
+ (
+ # Locally ignore failures, otherwise we'll exit whenever $1 and $2
+ # are not equal!
+ set +e
+
+ awk "$awk_strverscmp" v1="$1" v2="$2" /dev/null
+ case $? in
+ 1) echo '<';;
+ 0) echo '=';;
+ 2) echo '>';;
+ esac
+ )
+}
+
+# require TOOL REQUIREMENT
+# ------------------------
+# Test that TOOL exists, and its version is at least REQUIREMENT.
+# Check whether the environment contains a variable named like TOOL,
+# but upper-cased, and use it instead of TOOL if so.
+require ()
+{
+ envvar_name=$(echo $1 | tr '[:lower:]' '[:upper:]')
+ tool=$(printenv $envvar_name || echo $1)
+ local version=$($tool --version | \
+ sed -n 's/[^0-9.]*\([0-9][0-9.]*\).*/\1/p;q')
+ test x"$version" != x ||
+ fatal "$tool is required"
+ case $(version_compare "$2" "$version") in
+ '>') fatal "$1 $2 or better is required: this is $tool $version";;
+ esac
+}
+
+
+# Failures do matter.
+set -e
+
+for arg in "$@"; do
+ case "$arg" in
+ -h|--help) usage; exit 0 ;;
+ -m|--make) run_make_p=true ;;
+ *) fatal "error: unrecognized option: $1" ;;
+ esac
+done
+
+# The ast/ is generated, including its Makefile.
+if test -f dev/ast-nodes-mk-gen.py && test -f src/ast/ast.yml; then
+ python_check_mod_yaml='
+import sys, importlib
+try:
+ importlib.import_module("yaml")
+except ImportError:
+ sys.exit(1)
+'
+ if ! python3 -c ''; then
+ fatal "Python is required"
+ elif ! python3 -c "$python_check_mod_yaml"; then
+ fatal "Python module \`yaml' is required (http://pyyaml.org/)"
+ fi
+
+ rm -f src/ast/ast-nodes.mk
+ python3 dev/ast-nodes-mk-gen.py src/ast <src/ast/ast.yml >src/ast/ast-nodes.mk \
+ || {
+ rv=$?
+ cat >&2 <<EOF
+
+-----------------------------------------------------------------------
+If the last error is "./bootstrap: Python module \`yaml' is required"
+Then you need to install Python bindings for libyaml (http://pyyaml.org/).
+
+Try 'sudo pip install pyyaml'.
+EOF
+ (exit $rv); exit $rv
+ }
+fi
+
+# Swig makefiles.
+if test -d tcsh; then
+ here=$(pwd)
+ cd tcsh
+ for i in python
+ do
+ rm -f $i/swig.mk
+ top_srcdir=.. ./generate-swig-mk $i $i/swig.mk
+ done
+ cd $here
+fi
+
+# Requirements over bootstrap tools.
+require autoconf 2.64
+require automake 1.11.1
+libtoolize=libtoolize
+for l in "$LIBTOOLIZE" glibtoolize libtoolize;
+do
+ if ($l --version) >/dev/null 2>&1; then
+ libtoolize=$l
+ break
+ fi
+done
+export LIBTOOLIZE=$libtoolize
+require $libtoolize 2.2.6
+
+# Tell what's going on.
+set -x
+
+# Finally, install the GNU Build System.
+autoreconf -f -v -i
+
+# FIXME: autoheader does not obey --force.
+find . -name 'config.h.in' | xargs touch
+
+
+# If the pseudo-standard name "_build" is used and if asked so, then
+# try and continue the re-build.
+if $run_make_p && test -f _build/config.status; then
+ cd _build
+ ./config.status --recheck
+ ./config.status
+ make
+fi