-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbootstrap
203 lines (179 loc) · 4.95 KB
/
bootstrap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
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 <[email protected]>
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 ruby
# 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