This repository has been archived by the owner on May 19, 2022. It is now read-only.
forked from muchrons/ACARM-ng
/
configure
executable file
·397 lines (345 loc) · 9.06 KB
/
configure
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
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
#!/bin/bash
#
# autotools-like script for creating configuration
#
#
# default values
#
# dirs
PREFIX="/usr/local"
# features and build stuff
PLUGINS="`(cd src ; ls -d persistency?* input?* trigger?* filter?*)`"
PROFILE="release"
FEATURES="lock_on_write_graph_add"
TOOLCHAIN="gcc"
TC_CPP="g++"
TC_FLAGS=""
#
# helper functions
#
# print help screen
function print_help()
{
cat<<EOF >&2
$0 options are:
[--prefix <path>] prefix for the installation directory (1)
[--bindir <path>] path to copy binaries to (1)
[--libdir <path>] path to install libraries in (1)
[--datadir <path>] place to put shared files to (1)
[--sysconfdir <path>] destination directory for system configuration (1)
[--includedir <path>] destination for include files (1)
[--docdir <path>] path for documentation (1)
[--localstatedir <path>] directory to store variables in (1)
[--toolchain <tc>] toolchain to build project with (gcc or intel; default is gcc)
[--debug] build in debug mode (2)
[--automatic-tests] build automatic tests only
[--list-plugins] list all available plugin
[--disable <plugin>] do not compile given plugin (3)
[--list-tests] show what tests are available
[--test <name>] run only specific test and exit (3)
[-I <includes_dir>] add extra include directory to compilation (3)
[-L <libs_dir>] add extra library directory to linking (3)
[--help] show this helpful text
(1) does not require recompilation
(2) makes binary slower and much larger (~30 times)
(3) can be specified multiple times
note that you may have to set PKG_CONFIG_PATH in order to make pkg-config
work correctly, before running configure/make:
export PKG_CONFIG_PATH="\$PKG_CONFIG_PATH:/path/1:/other/path"
EOF
exit 1
}
CFG_OUT="configure-output.mk"
LOG="configure.log"
ROOT="`readlink -f "$0" | xargs dirname`"
SRCS="$ROOT/src"
# compile implementation function
function compile_impl()
{
local OUT="$1"
shift
date >> "$LOG"
cat "$1" >> "$LOG"
local CMD="$TC_CPP $TC_FLAGS -x c++ -o $OUT $@ $EXTRA_COMPILE_FLAGS $EXTRA_LINK_FLAGS"
echo "$CMD" >> "$LOG"
$CMD >> "$LOG" 2>&1
return "$?"
}
# compile user call
function compile()
{
compile_impl "/dev/null" "$@"
return "$?"
}
# compile+run user call
function compile_and_run()
{
local BIN="`mktemp tmp.confgure.bin.XXXXXXXX`"
compile_impl "$BIN" "$@"
local RET="$?"
if [ "$RET" -eq 0 ]
then
echo "running $BIN..." >> "$LOG"
./"$BIN"
RET="$?"
fi
rm -f "$BIN"
return "$RET"
}
# parse version string in form of X.Y.Z to a number
function parse_version3()
{
sed -e 's:[^0-9\.]: :g' -e 's: *\([0-9]\+\.[0-9]\+\.[0-9]\+\) *:\1:' -e 's:\.: * 10000 + :' -e 's:\.: * 100 + :' | xargs expr
}
#
# process command line options
#
ONLY_TESTS_RUN="false"
rm -f "$LOG" "$CFG_OUT"
while [ "$#" -gt 0 ]
do
case "$1" in
"--prefix")
if ! grep -q '^/' <<< "$2"
then
echo "$0: prefix must be an absolute path, got '$2' instead" >&2
exit 2
fi
PREFIX="$2"
echo "setting prefix to '$PREFIX'" >> "$LOG"
shift
;;
"--bindir")
if ! grep -q '^/' <<< "$2"
then
echo "$0: bindir must be an absolute path, got '$2' instead" >&2
exit 2
fi
BINDIR="$2"
echo "setting bindir to '$BINDIR'" >> "$LOG"
shift
;;
"--libdir")
if ! grep -q '^/' <<< "$2"
then
echo "$0: libdir must be an absolute path, got '$2' instead" >&2
exit 2
fi
LIBDIR="$2"
echo "setting libdir to '$LIBDIR'" >> "$LOG"
shift
;;
"--datadir")
if ! grep -q '^/' <<< "$2"
then
echo "$0: datadir must be an absolute path, got '$2' instead" >&2
exit 2
fi
DATADIR="$2"
echo "setting datadir to '$DATADIR'" >> "$LOG"
shift
;;
"--sysconfdir")
if ! grep -q '^/' <<< "$2"
then
echo "$0: sysconfdir must be an absolute path, got '$2' instead" >&2
exit 2
fi
SYSCONFDIR="$2"
echo "setting sysconfdir to '$SYSCONFDIR'" >> "$LOG"
shift
;;
"--includedir")
if ! grep -q '^/' <<< "$2"
then
echo "$0: includedir must be an absolute path, got '$2' instead" >&2
exit 2
fi
INCLUDEDIR="$2"
echo "setting includedir to '$INCLUDEDIR'" >> "$LOG"
shift
;;
"--docdir")
if ! grep -q '^/' <<< "$2"
then
echo "$0: docdir must be an absolute path, got '$2' instead" >&2
exit 2
fi
DOCDIR="$2"
echo "setting docdir to '$DOCDIR'" >> "$LOG"
shift
;;
"--localstatedir")
if ! grep -q '^/' <<< "$2"
then
echo "$0: localstatedir must be an absolute path, got '$2' instead" >&2
exit 2
fi
LOCALSTATEDIR="$2"
echo "setting localstatedir to '$LOCALSTATEDIR'" >> "$LOG"
shift
;;
"--disable")
PLUGINS="`echo "$PLUGINS" | xargs -n 1 -r echo | grep -v "^$2$"`"
echo "disabling plugin '$2'" >> "$LOG"
shift
;;
"--toolchain")
TOOLCHAIN="$2"
case "$TOOLCHAIN" in
"intel")
TC_CPP="icc"
TC_FLAGS="-I/usr/include/$($TC_CPP -dumpmachine)"
;;
"gcc")
TC_CPP="g++"
;;
*)
echo "$0: unsupported toolchain $TOOLCHAIN" >&2
exit 2
;;
esac
echo "enabling $TOOLCHAIN toolchain" >> "$LOG"
shift
;;
"--debug")
PROFILE="debug"
echo "enabling debug mode" >> "$LOG"
;;
"--automatic-tests")
PROFILE="test"
echo "enabling build of automatic tests only" >> "$LOG"
;;
"--list-plugins")
echo "$PLUGINS" | sort
exit 0
;;
"--list-tests")
ls misc/config_tests/ | sort
exit 0
;;
"--test")
TESTS_TO_RUN="$TESTS_TO_RUN $2"
ONLY_TESTS_RUN="true"
echo "running test only mode for: $TESTS_TO_RUN" >> "$LOG"
shift
;;
"-I")
EXTRA_COMPILE_FLAGS="$EXTRA_COMPILE_FLAGS -I$2"
echo "extending compilation flags: $EXTRA_COMPILE_FLAGS" >> "$LOG"
shift
;;
"-L")
EXTRA_LINK_FLAGS="$EXTRA_LINK_FLAGS -L$2"
EXTRA_LIB_DIRS="$EXTRA_LIB_DIRS:$2"
echo "extending linkage flags: $EXTRA_LINK_FLAGS" >> "$LOG"
shift
;;
"--help")
print_help
;;
*)
print_help
;;
esac
shift
done
[ -z "$PREFIX" ] && PREFIX="$PREFIX_DEF"
[ -z "$BINDIR" ] && BINDIR="$PREFIX/bin"
[ -z "$LIBDIR" ] && LIBDIR="$PREFIX/lib"
[ -z "$DATADIR" ] && DATADIR="$PREFIX/share"
[ -z "$SYSCONFDIR" ] && SYSCONFDIR="$PREFIX/etc"
[ -z "$INCLUDEDIR" ] && INCLUDEDIR="$PREFIX/include"
[ -z "$DOCDIR" ] && DOCDIR="$DATADIR/doc/acarm-ng"
[ -z "$LOCALSTATEDIR" ] && LOCALSTATEDIR="$PREFIX/var"
# ensure .../libs/acarm-ng is also present
EXTRA_LIB_DIRS="$LIBDIR/:$EXTRA_LIB_DIRS"
# if no explicit test(s) specified, run all
if [ -z "$TESTS_TO_RUN" ]
then
TESTS_TO_RUN="`"$0" --list-tests | xargs -r echo -n`"
echo "running all tests" >> "$LOG"
fi
# prepare single temporary file to work on
TMP="`mktemp tmp.confgure.XXXXXXXX`"
#
# run all tests
#
for t in $TESTS_TO_RUN
do
echo "BEGIN: running test $1" >> "$LOG"
source "./misc/config_tests/$t"
echo "END: done running test $1" >> "$LOG"
echo >> "$LOG"
done
echo "ALL TESTS ARE DONE" >> "$LOG"
#
# cleanup
#
rm -f "$TMP"
# exit, if only tests were to be run
"$ONLY_TESTS_RUN" && exit 0
#
# postprocess some extra settings, if needed
#
NEED_SIZEOF_MACROS_WORKAROUND="export ENABLE_SIZEOF_MACROS_WORKAROUND:=1"
[ -z "$ENABLE_SIZEOF_MACROS_WORKAROUND" ] && NEED_SIZEOF_MACROS_WORKAROUND="#$NEED_SIZEOF_MACROS_WORKAROUND"
# check if install should be allowed
case "$PROFILE" in
"release")
CAN_INSTALL=true
;;
"debug")
CAN_INSTALL=true
;;
*)
CAN_INSTALL=false
;;
esac
#
# prepare proper make entries
#
# prepare main makefile elements
cat > "$CFG_OUT" <<EOF
# extra flags
LOCAL_MAKE_FLAGS+="TC=$TOOLCHAIN"
LOCAL_MAKE_FLAGS+="PROFILE=$PROFILE"
LOCAL_MAKE_FLAGS+="FEATURES=$FEATURES"
LOCAL_MAKE_FLAGS+="EXTRA_COMPILE_FLAGS=$EXTRA_COMPILE_FLAGS"
LOCAL_MAKE_FLAGS+="EXTRA_LINK_FLAGS=$EXTRA_LINK_FLAGS"
# additional settings
$NEED_SIZEOF_MACROS_WORKAROUND
# things to build, with defaults
EXTRA_LIB_DIRS:=$EXTRA_LIB_DIRS
PLUGINS_LIST:=`echo "$PLUGINS" | xargs -n 1 echo -n ' ' `
# destination directories
DESTDIR :=/
INSTALL_DIR :=\$(DESTDIR)
PREFIX :=$PREFIX
BINDIR :=$BINDIR
LIBDIR :=$LIBDIR
DATADIR :=$DATADIR
SYSCONFDIR :=$SYSCONFDIR
INCLUDEDIR :=$INCLUDEDIR
DOCDIR :=$DOCDIR
LOCALSTATEDIR:=$LOCALSTATEDIR
# helpers
BUILD_DIR:=src/gen/${PROFILE}_${TOOLCHAIN}_normal_default
INSTSTRIP:=`[ "$PROFILE" = "release" ] && echo -s`
CAN_INSTALL:=$CAN_INSTALL
EOF
#
# display summary
#
echo
echo "SUMMARY:"
echo " prefix: $PREFIX"
echo " toolchain: $TOOLCHAIN"
echo " profile: $PROFILE"
echo " plugins:"
echo "$PLUGINS" | sort | sed 's:^ *: :'
echo " features: $FEATURES"
echo " comp flags: $EXTRA_COMPILE_FLAGS"
echo " link flags: $EXTRA_LINK_FLAGS"
echo " lib dirs: $EXTRA_LIB_DIRS"
echo