Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/bc/configure.sh
39475 views
1
#! /bin/sh
2
#
3
# SPDX-License-Identifier: BSD-2-Clause
4
#
5
# Copyright (c) 2018-2025 Gavin D. Howard and contributors.
6
#
7
# Redistribution and use in source and binary forms, with or without
8
# modification, are permitted provided that the following conditions are met:
9
#
10
# * Redistributions of source code must retain the above copyright notice, this
11
# list of conditions and the following disclaimer.
12
#
13
# * Redistributions in binary form must reproduce the above copyright notice,
14
# this list of conditions and the following disclaimer in the documentation
15
# and/or other materials provided with the distribution.
16
#
17
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
30
script="$0"
31
scriptdir=$(dirname "$script")
32
script=$(basename "$script")
33
34
builddir=$(pwd)
35
36
. "$scriptdir/scripts/functions.sh"
37
38
# Simply prints the help message and quits based on the argument.
39
# @param msg The help message to print.
40
usage() {
41
42
if [ $# -gt 0 ]; then
43
44
_usage_val=1
45
46
printf '%s\n\n' "$1"
47
48
else
49
_usage_val=0
50
fi
51
52
printf 'usage:\n'
53
printf ' %s -h\n' "$script"
54
printf ' %s --help\n' "$script"
55
printf ' %s [-a|-bD|-dB|-c] [-CeEfgGHilmMNPrtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\\\n' "$script"
56
printf ' [-s SETTING] [-S SETTING] [-p TYPE]\n'
57
printf ' %s \\\n' "$script"
58
printf ' [--library|--bc-only --disable-dc|--dc-only --disable-bc] \\\n'
59
printf ' [--force --debug --disable-extra-math --disable-generated-tests] \\\n'
60
printf ' [--disable-history --disable-man-pages --disable-nls --disable-strip] \\\n'
61
printf ' [--enable-editline] [--enable-readline] [--enable-internal-history] \\\n'
62
printf ' [--disable-problematic-tests] [--install-all-locales] \\\n'
63
printf ' [--opt=OPT_LEVEL] [--karatsuba-len=KARATSUBA_LEN] \\\n'
64
printf ' [--set-default-on=SETTING] [--set-default-off=SETTING] \\\n'
65
printf ' [--predefined-build-type=TYPE] \\\n'
66
printf ' [--prefix=PREFIX] [--bindir=BINDIR] [--datarootdir=DATAROOTDIR] \\\n'
67
printf ' [--datadir=DATADIR] [--mandir=MANDIR] [--man1dir=MAN1DIR] \\\n'
68
printf ' [--man3dir=MAN3DIR]\n'
69
70
if [ "$_usage_val" -ne 0 ]; then
71
exit "$_usage_val"
72
fi
73
74
printf '\n'
75
printf ' -a, --library\n'
76
printf ' Build the libbcl instead of the programs. This is meant to be used with\n'
77
printf ' other software like programming languages that want to make use of the\n'
78
printf ' parsing and math capabilities. This option will install headers using\n'
79
printf ' `make install`.\n'
80
printf ' -b, --bc-only\n'
81
printf ' Build bc only. It is an error if "-d", "--dc-only", "-B", or\n'
82
printf ' "--disable-bc" are specified too.\n'
83
printf ' -B, --disable-bc\n'
84
printf ' Disable bc. It is an error if "-b", "--bc-only", "-D", or "--disable-dc"\n'
85
printf ' are specified too.\n'
86
printf ' -C, --disable-clean\n'
87
printf ' Disable the clean that configure.sh does before configure.\n'
88
printf ' -d, --dc-only\n'
89
printf ' Build dc only. It is an error if "-b", "--bc-only", "-D", or\n'
90
printf ' "--disable-dc" are specified too.\n'
91
printf ' -D, --disable-dc\n'
92
printf ' Disable dc. It is an error if "-d", "--dc-only", "-B", or "--disable-bc"\n'
93
printf ' are specified too.\n'
94
printf ' -e, --enable-editline\n'
95
printf ' Enable the use of libedit/editline. This is meant for those users that\n'
96
printf ' want vi-like or Emacs-like behavior in history. This option is ignored\n'
97
printf ' if history is disabled. If the -r or -i options are given with this\n'
98
printf ' option, the last occurrence of all of the three is used.\n'
99
printf ' -E, --disable-extra-math\n'
100
printf ' Disable extra math. This includes: "$" operator (truncate to integer),\n'
101
printf ' "@" operator (set number of decimal places), and r(x, p) (rounding\n'
102
printf ' function). Additionally, this option disables the extra printing\n'
103
printf ' functions in the math library.\n'
104
printf ' -f, --force\n'
105
printf ' Force use of all enabled options, even if they do not work. This\n'
106
printf ' option is to allow the maintainer a way to test that certain options\n'
107
printf ' are not failing invisibly. (Development only.)\n'
108
printf ' -g, --debug\n'
109
printf ' Build in debug mode. Adds the "-g" flag, and if there are no\n'
110
printf ' other CFLAGS, and "-O" was not given, this also adds the "-O0"\n'
111
printf ' flag. If this flag is *not* given, "-DNDEBUG" is added to CPPFLAGS\n'
112
printf ' and a strip flag is added to the link stage.\n'
113
printf ' -G, --disable-generated-tests\n'
114
printf ' Disable generating tests. This is for platforms that do not have a\n'
115
printf ' GNU bc-compatible bc to generate tests.\n'
116
printf ' -h, --help\n'
117
printf ' Print this help message and exit.\n'
118
printf ' -H, --disable-history\n'
119
printf ' Disable history.\n'
120
printf ' -i, --enable-internal-history\n'
121
printf ' Enable the internal history implementation and do not depend on either\n'
122
printf ' editline or readline. This option is ignored if history is disabled.\n'
123
printf ' If this option is given along with -e and -r, the last occurrence of\n'
124
printf ' all of the three is used.\n'
125
printf ' -k KARATSUBA_LEN, --karatsuba-len KARATSUBA_LEN\n'
126
printf ' Set the karatsuba length to KARATSUBA_LEN (default is 32).\n'
127
printf ' It is an error if KARATSUBA_LEN is not a number or is less than 16.\n'
128
printf ' -l, --install-all-locales\n'
129
printf ' Installs all locales, regardless of how many are on the system. This\n'
130
printf ' option is useful for package maintainers who want to make sure that\n'
131
printf ' a package contains all of the locales that end users might need.\n'
132
printf ' -M, --disable-man-pages\n'
133
printf ' Disable installing manpages.\n'
134
printf ' -N, --disable-nls\n'
135
printf ' Disable POSIX locale (NLS) support.\n'
136
printf ' ***WARNING***: Locales ignore the prefix because they *must* be\n'
137
printf ' installed at a fixed location to work at all. If you do not want that\n'
138
printf ' to happen, you must disable locales (NLS) completely.\n'
139
printf ' -O OPT_LEVEL, --opt OPT_LEVEL\n'
140
printf ' Set the optimization level. This can also be included in the CFLAGS,\n'
141
printf ' but it is provided, so maintainers can build optimized debug builds.\n'
142
printf ' This is passed through to the compiler, so it must be supported.\n'
143
printf ' -p TYPE, --predefined-build-type=TYPE\n'
144
printf ' Sets a given predefined build type with specific defaults. This is for\n'
145
printf ' easy setting of predefined builds. For example, to get a build that\n'
146
printf ' acts like the GNU bc by default, TYPE should be "GNU" (without the\n'
147
printf ' quotes) This option *must* come before any others that might change the\n'
148
printf ' build options. Currently supported values for TYPE include: "BSD" (for\n'
149
printf ' matching the BSD bc and BSD dc), "GNU" (for matching the GNU bc and\n'
150
printf ' dc), "GDH" (for the preferred build of the author, Gavin D. Howard),\n'
151
printf ' and "DBG" (for the preferred debug build of the author). This will\n'
152
printf ' also automatically enable a release build (except for "DBG").\n'
153
printf ' -P, --disable-problematic-tests\n'
154
printf ' Disables problematic tests. These tests usually include tests that\n'
155
printf ' can cause a SIGKILL because of too much memory usage.\n'
156
printf ' -r, --enable-readline\n'
157
printf ' Enable the use of libreadline/readline. This is meant for those users\n'
158
printf ' that want vi-like or Emacs-like behavior in history. This option is\n'
159
printf ' ignored if history is disabled. If this option is given along with -e\n'
160
printf ' and -i, the last occurrence of all of the three is used.\n'
161
printf ' -s SETTING, --set-default-on SETTING\n'
162
printf ' Set the default named by SETTING to on. See below for possible values\n'
163
printf ' for SETTING. For multiple instances of the -s or -S for the the same\n'
164
printf ' setting, the last one is used.\n'
165
printf ' -S SETTING, --set-default-off SETTING\n'
166
printf ' Set the default named by SETTING to off. See below for possible values\n'
167
printf ' for SETTING. For multiple instances of the -s or -S for the the same\n'
168
printf ' setting, the last one is used.\n'
169
printf ' -T, --disable-strip\n'
170
printf ' Disable stripping symbols from the compiled binary or binaries.\n'
171
printf ' Stripping symbols only happens when debug mode is off.\n'
172
printf ' --prefix PREFIX\n'
173
printf ' The prefix to install to. Overrides "$PREFIX" if it exists.\n'
174
printf ' If PREFIX is "/usr", install path will be "/usr/bin".\n'
175
printf ' Default is "/usr/local".\n'
176
printf ' ***WARNING***: Locales ignore the prefix because they *must* be\n'
177
printf ' installed at a fixed location to work at all. If you do not want that to\n'
178
printf ' happen, you must disable locales (NLS) completely.\n'
179
printf ' --bindir BINDIR\n'
180
printf ' The directory to install binaries in. Overrides "$BINDIR" if it exists.\n'
181
printf ' Default is "$PREFIX/bin".\n'
182
printf ' --includedir INCLUDEDIR\n'
183
printf ' The directory to install headers in. Overrides "$INCLUDEDIR" if it\n'
184
printf ' exists. Default is "$PREFIX/include".\n'
185
printf ' --libdir LIBDIR\n'
186
printf ' The directory to install libraries in. Overrides "$LIBDIR" if it exists.\n'
187
printf ' Default is "$PREFIX/lib".\n'
188
printf ' --datarootdir DATAROOTDIR\n'
189
printf ' The root location for data files. Overrides "$DATAROOTDIR" if it exists.\n'
190
printf ' Default is "$PREFIX/share".\n'
191
printf ' --datadir DATADIR\n'
192
printf ' The location for data files. Overrides "$DATADIR" if it exists.\n'
193
printf ' Default is "$DATAROOTDIR".\n'
194
printf ' --mandir MANDIR\n'
195
printf ' The location to install manpages to. Overrides "$MANDIR" if it exists.\n'
196
printf ' Default is "$DATADIR/man".\n'
197
printf ' --man1dir MAN1DIR\n'
198
printf ' The location to install Section 1 manpages to. Overrides "$MAN1DIR" if\n'
199
printf ' it exists. Default is "$MANDIR/man1".\n'
200
printf ' --man3dir MAN3DIR\n'
201
printf ' The location to install Section 3 manpages to. Overrides "$MAN3DIR" if\n'
202
printf ' it exists. Default is "$MANDIR/man3".\n'
203
printf '\n'
204
printf 'In addition, the following environment variables are used:\n'
205
printf '\n'
206
printf ' CC C compiler. Must be compatible with POSIX c99. If there is a\n'
207
printf ' space in the basename of the compiler, the items after the\n'
208
printf ' first space are assumed to be compiler flags, and in that case,\n'
209
printf ' the flags are automatically moved into CFLAGS. Default is\n'
210
printf ' "c99".\n'
211
printf ' HOSTCC Host C compiler. Must be compatible with POSIX c99. If there is\n'
212
printf ' a space in the basename of the compiler, the items after the\n'
213
printf ' first space are assumed to be compiler flags, and in the case,\n'
214
printf ' the flags are automatically moved into HOSTCFLAGS. Default is\n'
215
printf ' "$CC".\n'
216
printf ' HOST_CC Same as HOSTCC. If HOSTCC also exists, it is used.\n'
217
printf ' CFLAGS C compiler flags.\n'
218
printf ' HOSTCFLAGS CFLAGS for HOSTCC. Default is "$CFLAGS".\n'
219
printf ' HOST_CFLAGS Same as HOST_CFLAGS. If HOST_CFLAGS also exists, it is used.\n'
220
printf ' CPPFLAGS C preprocessor flags. Default is "".\n'
221
printf ' LDFLAGS Linker flags. Default is "".\n'
222
printf ' PREFIX The prefix to install to. Default is "/usr/local".\n'
223
printf ' If PREFIX is "/usr", install path will be "/usr/bin".\n'
224
printf ' ***WARNING***: Locales ignore the prefix because they *must* be\n'
225
printf ' installed at a fixed location to work at all. If you do not\n'
226
printf ' want that to happen, you must disable locales (NLS) completely.\n'
227
printf ' BINDIR The directory to install binaries in. Default is "$PREFIX/bin".\n'
228
printf ' INCLUDEDIR The directory to install header files in. Default is\n'
229
printf ' "$PREFIX/include".\n'
230
printf ' LIBDIR The directory to install libraries in. Default is\n'
231
printf ' "$PREFIX/lib".\n'
232
printf ' DATAROOTDIR The root location for data files. Default is "$PREFIX/share".\n'
233
printf ' DATADIR The location for data files. Default is "$DATAROOTDIR".\n'
234
printf ' MANDIR The location to install manpages to. Default is "$DATADIR/man".\n'
235
printf ' MAN1DIR The location to install Section 1 manpages to. Default is\n'
236
printf ' "$MANDIR/man1".\n'
237
printf ' MAN3DIR The location to install Section 3 manpages to. Default is\n'
238
printf ' "$MANDIR/man3".\n'
239
printf ' NLSPATH The location to install locale catalogs to. Must be an absolute\n'
240
printf ' path (or contain one). This is treated the same as the POSIX\n'
241
printf ' definition of $NLSPATH (see POSIX environment variables for\n'
242
printf ' more information). Default is "/usr/share/locale/%%L/%%N".\n'
243
printf ' PC_PATH The location to install pkg-config files to. Must be a\n'
244
printf ' path or contain one. Default is the first path given by the\n'
245
printf ' output of `pkg-config --variable=pc_path pkg-config`.\n'
246
printf ' EXECSUFFIX The suffix to append to the executable names, used to not\n'
247
printf ' interfere with other installed bc executables. Default is "".\n'
248
printf ' EXECPREFIX The prefix to prepend to the executable names, used to not\n'
249
printf ' interfere with other installed bc executables. Default is "".\n'
250
printf ' DESTDIR For package creation. Default is "". If it is empty when\n'
251
printf ' `%s` is run, it can also be passed to `make install`\n' "$script"
252
printf ' later as an environment variable. If both are specified,\n'
253
printf ' the one given to `%s` takes precedence.\n' "$script"
254
printf ' LONG_BIT The number of bits in a C `long` type. This is mostly for the\n'
255
printf ' embedded space since this `bc` uses `long`s internally for\n'
256
printf ' overflow checking. In C99, a `long` is required to be 32 bits.\n'
257
printf ' For most normal desktop systems, setting this is unnecessary,\n'
258
printf ' except that 32-bit platforms with 64-bit longs may want to set\n'
259
printf ' it to `32`. Default is the default of `LONG_BIT` for the target\n'
260
printf ' platform. Minimum allowed is `32`. It is a build time error if\n'
261
printf ' the specified value of `LONG_BIT` is greater than the default\n'
262
printf ' value of `LONG_BIT` for the target platform.\n'
263
printf ' GEN_HOST Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to\n'
264
printf ' produce the C files that contain the help texts as well as the\n'
265
printf ' math libraries. By default, `gen/strgen.c` is used, compiled by\n'
266
printf ' "$HOSTCC" and run on the host machine. Using `gen/strgen.sh`\n'
267
printf ' removes the need to compile and run an executable on the host\n'
268
printf ' machine since `gen/strgen.sh` is a POSIX shell script. However,\n'
269
printf ' `gen/lib2.bc` is over 4095 characters, the max supported length\n'
270
printf ' of a string literal in C99, and `gen/strgen.sh` generates a\n'
271
printf ' string literal instead of an array, as `gen/strgen.c` does. For\n'
272
printf ' most production-ready compilers, this limit probably is not\n'
273
printf ' enforced, but it could be. Both options are still available for\n'
274
printf ' this reason. If you are sure your compiler does not have the\n'
275
printf ' limit and do not want to compile and run a binary on the host\n'
276
printf ' machine, set this variable to "0". Any other value, or a\n'
277
printf ' non-existent value, will cause the build system to compile and\n'
278
printf ' run `gen/strgen.c`. Default is "".\n'
279
printf ' GEN_EMU Emulator to run string generator code under (leave empty if not\n'
280
printf ' necessary). This is not necessary when using `gen/strgen.sh`.\n'
281
printf ' Default is "".\n'
282
printf '\n'
283
printf 'WARNING: even though `configure.sh` supports both option types, short and\n'
284
printf 'long, it does not support handling both at the same time. Use only one type.\n'
285
printf '\n'
286
printf 'Settings\n'
287
printf '========\n'
288
printf '\n'
289
printf 'bc and dc have some settings that, while they cannot be removed by build time\n'
290
printf 'options, can have their defaults changed at build time by packagers. Users are\n'
291
printf 'also able to change each setting with environment variables.\n'
292
printf '\n'
293
printf 'The following is a table of settings, along with their default values and the\n'
294
printf 'environment variables users can use to change them. (For the defaults, non-zero\n'
295
printf 'means on, and zero means off.)\n'
296
printf '\n'
297
printf '| Setting | Description | Default | Env Variable |\n'
298
printf '| =============== | ==================== | ============ | ==================== |\n'
299
printf '| bc.banner | Whether to display | 0 | BC_BANNER |\n'
300
printf '| | the bc version | | |\n'
301
printf '| | banner when in | | |\n'
302
printf '| | interactive mode. | | |\n'
303
printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
304
printf '| bc.sigint_reset | Whether SIGINT will | 1 | BC_SIGINT_RESET |\n'
305
printf '| | reset bc, instead of | | |\n'
306
printf '| | exiting, when in | | |\n'
307
printf '| | interactive mode. | | |\n'
308
printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
309
printf '| dc.sigint_reset | Whether SIGINT will | 1 | DC_SIGINT_RESET |\n'
310
printf '| | reset dc, instead of | | |\n'
311
printf '| | exiting, when in | | |\n'
312
printf '| | interactive mode. | | |\n'
313
printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
314
printf '| bc.tty_mode | Whether TTY mode for | 1 | BC_TTY_MODE |\n'
315
printf '| | bc should be on when | | |\n'
316
printf '| | available. | | |\n'
317
printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
318
printf '| dc.tty_mode | Whether TTY mode for | 0 | BC_TTY_MODE |\n'
319
printf '| | dc should be on when | | |\n'
320
printf '| | available. | | |\n'
321
printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
322
printf '| bc.prompt | Whether the prompt | $BC_TTY_MODE | BC_PROMPT |\n'
323
printf '| | for bc should be on | | |\n'
324
printf '| | in tty mode. | | |\n'
325
printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
326
printf '| dc.prompt | Whether the prompt | $DC_TTY_MODE | DC_PROMPT |\n'
327
printf '| | for dc should be on | | |\n'
328
printf '| | in tty mode. | | |\n'
329
printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
330
printf '| bc.expr_exit | Whether to exit bc | 1 | BC_EXPR_EXIT |\n'
331
printf '| | if an expression or | | |\n'
332
printf '| | expression file is | | |\n'
333
printf '| | given with the -e or | | |\n'
334
printf '| | -f options. | | |\n'
335
printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
336
printf '| dc.expr_exit | Whether to exit dc | 1 | DC_EXPR_EXIT |\n'
337
printf '| | if an expression or | | |\n'
338
printf '| | expression file is | | |\n'
339
printf '| | given with the -e or | | |\n'
340
printf '| | -f options. | | |\n'
341
printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
342
printf '| bc.digit_clamp | Whether to have bc | 0 | BC_DIGIT_CLAMP |\n'
343
printf '| | clamp digits that | | |\n'
344
printf '| | are greater than or | | |\n'
345
printf '| | equal to the current | | |\n'
346
printf '| | ibase when parsing | | |\n'
347
printf '| | numbers. | | |\n'
348
printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
349
printf '| dc.digit_clamp | Whether to have dc | 0 | DC_DIGIT_CLAMP |\n'
350
printf '| | clamp digits that | | |\n'
351
printf '| | are greater than or | | |\n'
352
printf '| | equal to the current | | |\n'
353
printf '| | ibase when parsing | | |\n'
354
printf '| | numbers. | | |\n'
355
printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
356
printf '\n'
357
printf 'These settings are not meant to be changed on a whim. They are meant to ensure\n'
358
printf 'that this bc and dc will conform to the expectations of the user on each\n'
359
printf 'platform.\n'
360
361
exit "$_usage_val"
362
}
363
364
# Replaces a file extension in a filename. This is used mostly to turn filenames
365
# like `src/num.c` into `src/num.o`. In other words, it helps to link targets to
366
# the files they depend on.
367
#
368
# @param file The filename.
369
# @param ext1 The extension to replace.
370
# @param ext2 The new extension.
371
replace_ext() {
372
373
if [ "$#" -ne 3 ]; then
374
err_exit "Invalid number of args to $0"
375
fi
376
377
_replace_ext_file="$1"
378
_replace_ext_ext1="$2"
379
_replace_ext_ext2="$3"
380
381
_replace_ext_result="${_replace_ext_file%.$_replace_ext_ext1}.$_replace_ext_ext2"
382
383
printf '%s\n' "$_replace_ext_result"
384
}
385
386
# Replaces a file extension in every filename given in a list. The list is just
387
# a space-separated list of words, so filenames are expected to *not* have
388
# spaces in them. See the documentation for `replace_ext()`.
389
#
390
# @param files The list of space-separated filenames to replace extensions for.
391
# @param ext1 The extension to replace.
392
# @param ext2 The new extension.
393
replace_exts() {
394
395
if [ "$#" -ne 3 ]; then
396
err_exit "Invalid number of args to $0"
397
fi
398
399
_replace_exts_files="$1"
400
_replace_exts_ext1="$2"
401
_replace_exts_ext2="$3"
402
403
for _replace_exts_file in $_replace_exts_files; do
404
_replace_exts_new_name=$(replace_ext "$_replace_exts_file" "$_replace_exts_ext1" "$_replace_exts_ext2")
405
_replace_exts_result="$_replace_exts_result $_replace_exts_new_name"
406
done
407
408
printf '%s\n' "$_replace_exts_result"
409
}
410
411
# Finds a placeholder in @a str and replaces it. This is the workhorse of
412
# configure.sh. It's what replaces placeholders in Makefile.in with the data
413
# needed for the chosen build. Below, you will see a lot of calls to this
414
# function.
415
#
416
# Note that needle can never contain an exclamation point. For more information,
417
# see substring_replace() in scripts/functions.sh.
418
#
419
# @param str The string to find and replace placeholders in.
420
# @param needle The placeholder name.
421
# @param replacement The string to use to replace the placeholder.
422
replace() {
423
424
if [ "$#" -ne 3 ]; then
425
err_exit "Invalid number of args to $0"
426
fi
427
428
_replace_str="$1"
429
_replace_needle="$2"
430
_replace_replacement="$3"
431
432
substring_replace "$_replace_str" "%%$_replace_needle%%" "$_replace_replacement"
433
}
434
435
# This function finds all the source files that need to be built. If there is
436
# only one argument and it is empty, then all source files are built. Otherwise,
437
# the arguments are all assumed to be source files that should *not* be built.
438
find_src_files() {
439
440
_find_src_files_args=""
441
442
if [ "$#" -ge 1 ] && [ "$1" != "" ]; then
443
444
while [ "$#" -ge 1 ]; do
445
_find_src_files_a="${1## }"
446
shift
447
_find_src_files_args=$(printf '%s\n%s/src/%s\n' "$_find_src_files_args" "$scriptdir" "${_find_src_files_a}")
448
done
449
450
fi
451
452
_find_src_files_files=$(find "$scriptdir/src" -depth -name "*.c" -print | LC_ALL=C sort)
453
454
_find_src_files_result=""
455
456
for _find_src_files_f in $_find_src_files_files; do
457
458
# If this is true, the file is part of args, and therefore, unneeded.
459
if [ "${_find_src_files_args##*$_find_src_files_f}" != "${_find_src_files_args}" ]; then
460
continue
461
fi
462
463
_find_src_files_result=$(printf '%s\n%s\n' "$_find_src_files_result" "$_find_src_files_f")
464
465
done
466
467
printf '%s\n' "$_find_src_files_result"
468
}
469
470
# This function generates a list of files to go into the Makefile. It generates
471
# the list of object files.
472
#
473
# @param contents The contents of the Makefile template to put the list of
474
# files into.
475
gen_file_list() {
476
477
if [ "$#" -lt 1 ]; then
478
err_exit "Invalid number of args to $0"
479
fi
480
481
_gen_file_list_contents="$1"
482
shift
483
484
if [ "$#" -ge 1 ]; then
485
_gen_file_list_unneeded="$@"
486
else
487
_gen_file_list_unneeded=""
488
fi
489
490
_gen_file_list_needle_src="SRC"
491
_gen_file_list_needle_obj="OBJ"
492
493
_gen_file_list_replacement=$(find_src_files $_gen_file_list_unneeded | tr '\n' ' ')
494
_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
495
"$_gen_file_list_needle_src" "$_gen_file_list_replacement")
496
497
_gen_file_list_cbases=""
498
499
for _gen_file_list_f in $_gen_file_list_replacement; do
500
_gen_file_list_b=$(basename "$_gen_file_list_f")
501
_gen_file_list_cbases="$_gen_file_list_cbases src/$_gen_file_list_b"
502
done
503
504
_gen_file_list_replacement=$(replace_exts "$_gen_file_list_cbases" "c" "o")
505
_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
506
"$_gen_file_list_needle_obj" "$_gen_file_list_replacement")
507
508
printf '%s\n' "$_gen_file_list_contents"
509
}
510
511
set_default() {
512
513
_set_default_on="$1"
514
shift
515
516
_set_default_name="$1"
517
shift
518
519
# The reason that the variables that are being set do not have the same
520
# non-collision avoidance that the other variables do is that we *do* want
521
# the settings of these variables to leak out of the function. They adjust
522
# the settings outside of the function.
523
case "$_set_default_name" in
524
525
bc.banner) bc_default_banner="$_set_default_on" ;;
526
bc.sigint_reset) bc_default_sigint_reset="$_set_default_on" ;;
527
dc.sigint_reset) dc_default_sigint_reset="$_set_default_on" ;;
528
bc.tty_mode) bc_default_tty_mode="$_set_default_on" ;;
529
dc.tty_mode) dc_default_tty_mode="$_set_default_on" ;;
530
bc.prompt) bc_default_prompt="$_set_default_on" ;;
531
dc.prompt) dc_default_prompt="$_set_default_on" ;;
532
bc.expr_exit) bc_default_expr_exit="$_set_default_on";;
533
dc.expr_exit) dc_default_expr_exit="$_set_default_on";;
534
bc.digit_clamp) bc_default_digit_clamp="$_set_default_on";;
535
dc.digit_clamp) dc_default_digit_clamp="$_set_default_on";;
536
?) usage "Invalid setting: $_set_default_name" ;;
537
538
esac
539
}
540
541
predefined_build() {
542
543
_predefined_build_type="$1"
544
shift
545
546
# The reason that the variables that are being set do not have the same
547
# non-collision avoidance that the other variables do is that we *do* want
548
# the settings of these variables to leak out of the function. They adjust
549
# the settings outside of the function.
550
case "$_predefined_build_type" in
551
552
BSD)
553
bc_only=0
554
dc_only=0
555
debug=0
556
optimization="3"
557
hist=1
558
hist_impl="editline"
559
extra_math=1
560
generate_tests=$generate_tests
561
install_manpages=0
562
nls=1
563
force=0
564
strip_bin=1
565
all_locales=0
566
library=0
567
clean=1
568
bc_default_banner=0
569
bc_default_sigint_reset=1
570
dc_default_sigint_reset=1
571
bc_default_tty_mode=1
572
dc_default_tty_mode=0
573
bc_default_prompt=""
574
dc_default_prompt=""
575
bc_default_expr_exit=1
576
dc_default_expr_exit=1
577
bc_default_digit_clamp=0
578
dc_default_digit_clamp=0;;
579
580
GNU)
581
bc_only=0
582
dc_only=0
583
debug=0
584
optimization="3"
585
hist=1
586
hist_impl="internal"
587
extra_math=1
588
generate_tests=$generate_tests
589
install_manpages=1
590
nls=1
591
force=0
592
strip_bin=1
593
all_locales=0
594
library=0
595
clean=1
596
bc_default_banner=1
597
bc_default_sigint_reset=1
598
dc_default_sigint_reset=0
599
bc_default_tty_mode=1
600
dc_default_tty_mode=0
601
bc_default_prompt=""
602
dc_default_prompt=""
603
bc_default_expr_exit=1
604
dc_default_expr_exit=1
605
bc_default_digit_clamp=1
606
dc_default_digit_clamp=0;;
607
608
GDH)
609
CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories"
610
CFLAGS="$CFLAGS -Wno-unknown-warning-option -Wno-switch-default -Wno-pre-c11-compat"
611
CFLAGS="$CFLAGS -Werror -pedantic -std=c11"
612
bc_only=0
613
dc_only=0
614
debug=0
615
optimization="3"
616
hist=1
617
hist_impl="internal"
618
extra_math=1
619
generate_tests=1
620
install_manpages=1
621
nls=0
622
force=0
623
strip_bin=1
624
all_locales=0
625
library=0
626
clean=1
627
bc_default_banner=1
628
bc_default_sigint_reset=1
629
dc_default_sigint_reset=1
630
bc_default_tty_mode=1
631
dc_default_tty_mode=1
632
bc_default_prompt=""
633
dc_default_prompt=""
634
bc_default_expr_exit=0
635
dc_default_expr_exit=0
636
bc_default_digit_clamp=1
637
dc_default_digit_clamp=1;;
638
639
DBG)
640
CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories"
641
CFLAGS="$CFLAGS -Wno-unknown-warning-option -Wno-switch-default -Wno-pre-c11-compat"
642
CFLAGS="$CFLAGS -Werror -pedantic -std=c11"
643
bc_only=0
644
dc_only=0
645
debug=1
646
optimization="0"
647
hist=1
648
hist_impl="internal"
649
extra_math=1
650
generate_tests=1
651
install_manpages=1
652
nls=1
653
force=0
654
strip_bin=1
655
all_locales=0
656
library=0
657
clean=1
658
bc_default_banner=1
659
bc_default_sigint_reset=1
660
dc_default_sigint_reset=1
661
bc_default_tty_mode=1
662
dc_default_tty_mode=1
663
bc_default_prompt=""
664
dc_default_prompt=""
665
bc_default_expr_exit=0
666
dc_default_expr_exit=0
667
bc_default_digit_clamp=1
668
dc_default_digit_clamp=1;;
669
670
?|'') usage "Invalid user build: \"$_predefined_build_type\". Accepted types are BSD, GNU, GDH, DBG.";;
671
672
esac
673
}
674
675
# This is a list of defaults, but it is also the list of possible options for
676
# users to change.
677
#
678
# The development options are: force (force options even if they fail).
679
bc_only=0
680
dc_only=0
681
karatsuba_len=32
682
debug=0
683
hist=1
684
hist_impl="internal"
685
extra_math=1
686
optimization=""
687
generate_tests=1
688
install_manpages=1
689
nls=1
690
force=0
691
strip_bin=1
692
all_locales=0
693
library=0
694
clean=1
695
problematic_tests=1
696
697
# The empty strings are because they depend on TTY mode. If they are directly
698
# set, though, they will be integers. We test for empty strings later.
699
bc_default_banner=0
700
bc_default_sigint_reset=1
701
dc_default_sigint_reset=1
702
bc_default_tty_mode=1
703
dc_default_tty_mode=0
704
bc_default_prompt=""
705
dc_default_prompt=""
706
bc_default_expr_exit=1
707
dc_default_expr_exit=1
708
bc_default_digit_clamp=0
709
dc_default_digit_clamp=0
710
711
# getopts is a POSIX utility, but it cannot handle long options. Thus, the
712
# handling of long options is done by hand, and that's the reason that short and
713
# long options cannot be mixed.
714
while getopts "abBcdDeEfgGhHik:lMNO:p:PrS:s:T-" opt; do
715
716
case "$opt" in
717
a) library=1 ;;
718
b) bc_only=1 ;;
719
B) dc_only=1 ;;
720
C) clean=0 ;;
721
d) dc_only=1 ;;
722
D) bc_only=1 ;;
723
e) hist_impl="editline" ;;
724
E) extra_math=0 ;;
725
f) force=1 ;;
726
g) debug=1 ;;
727
G) generate_tests=0 ;;
728
h) usage ;;
729
H) hist=0 ;;
730
i) hist_impl="internal" ;;
731
k) karatsuba_len="$OPTARG" ;;
732
l) all_locales=1 ;;
733
M) install_manpages=0 ;;
734
N) nls=0 ;;
735
O) optimization="$OPTARG" ;;
736
p) predefined_build "$OPTARG" ;;
737
P) problematic_tests=0 ;;
738
r) hist_impl="readline" ;;
739
S) set_default 0 "$OPTARG" ;;
740
s) set_default 1 "$OPTARG" ;;
741
T) strip_bin=0 ;;
742
-)
743
arg="$1"
744
arg="${arg#--}"
745
LONG_OPTARG="${arg#*=}"
746
case $arg in
747
help) usage ;;
748
library) library=1 ;;
749
bc-only) bc_only=1 ;;
750
dc-only) dc_only=1 ;;
751
debug) debug=1 ;;
752
force) force=1 ;;
753
prefix=?*) PREFIX="$LONG_OPTARG" ;;
754
prefix)
755
if [ "$#" -lt 2 ]; then
756
usage "No argument given for '--$arg' option"
757
fi
758
PREFIX="$2"
759
shift ;;
760
bindir=?*) BINDIR="$LONG_OPTARG" ;;
761
bindir)
762
if [ "$#" -lt 2 ]; then
763
usage "No argument given for '--$arg' option"
764
fi
765
BINDIR="$2"
766
shift ;;
767
includedir=?*) INCLUDEDIR="$LONG_OPTARG" ;;
768
includedir)
769
if [ "$#" -lt 2 ]; then
770
usage "No argument given for '--$arg' option"
771
fi
772
INCLUDEDIR="$2"
773
shift ;;
774
libdir=?*) LIBDIR="$LONG_OPTARG" ;;
775
libdir)
776
if [ "$#" -lt 2 ]; then
777
usage "No argument given for '--$arg' option"
778
fi
779
LIBDIR="$2"
780
shift ;;
781
datarootdir=?*) DATAROOTDIR="$LONG_OPTARG" ;;
782
datarootdir)
783
if [ "$#" -lt 2 ]; then
784
usage "No argument given for '--$arg' option"
785
fi
786
DATAROOTDIR="$2"
787
shift ;;
788
datadir=?*) DATADIR="$LONG_OPTARG" ;;
789
datadir)
790
if [ "$#" -lt 2 ]; then
791
usage "No argument given for '--$arg' option"
792
fi
793
DATADIR="$2"
794
shift ;;
795
mandir=?*) MANDIR="$LONG_OPTARG" ;;
796
mandir)
797
if [ "$#" -lt 2 ]; then
798
usage "No argument given for '--$arg' option"
799
fi
800
MANDIR="$2"
801
shift ;;
802
man1dir=?*) MAN1DIR="$LONG_OPTARG" ;;
803
man1dir)
804
if [ "$#" -lt 2 ]; then
805
usage "No argument given for '--$arg' option"
806
fi
807
MAN1DIR="$2"
808
shift ;;
809
man3dir=?*) MAN3DIR="$LONG_OPTARG" ;;
810
man3dir)
811
if [ "$#" -lt 2 ]; then
812
usage "No argument given for '--$arg' option"
813
fi
814
MAN3DIR="$2"
815
shift ;;
816
karatsuba-len=?*) karatsuba_len="$LONG_OPTARG" ;;
817
karatsuba-len)
818
if [ "$#" -lt 2 ]; then
819
usage "No argument given for '--$arg' option"
820
fi
821
karatsuba_len="$1"
822
shift ;;
823
opt=?*) optimization="$LONG_OPTARG" ;;
824
opt)
825
if [ "$#" -lt 2 ]; then
826
usage "No argument given for '--$arg' option"
827
fi
828
optimization="$1"
829
shift ;;
830
set-default-on=?*) set_default 1 "$LONG_OPTARG" ;;
831
set-default-on)
832
if [ "$#" -lt 2 ]; then
833
usage "No argument given for '--$arg' option"
834
fi
835
set_default 1 "$1"
836
shift ;;
837
set-default-off=?*) set_default 0 "$LONG_OPTARG" ;;
838
set-default-off)
839
if [ "$#" -lt 2 ]; then
840
usage "No argument given for '--$arg' option"
841
fi
842
set_default 0 "$1"
843
shift ;;
844
predefined-build-type=?*) predefined_build "$LONG_OPTARG" ;;
845
predefined-build-type)
846
if [ "$#" -lt 2 ]; then
847
usage "No argument given for '--$arg' option"
848
fi
849
predefined_build "$1"
850
shift ;;
851
disable-bc) dc_only=1 ;;
852
disable-dc) bc_only=1 ;;
853
disable-clean) clean=0 ;;
854
disable-extra-math) extra_math=0 ;;
855
disable-generated-tests) generate_tests=0 ;;
856
disable-history) hist=0 ;;
857
disable-man-pages) install_manpages=0 ;;
858
disable-nls) nls=0 ;;
859
disable-strip) strip_bin=0 ;;
860
disable-problematic-tests) problematic_tests=0 ;;
861
enable-editline) hist_impl="editline" ;;
862
enable-readline) hist_impl="readline" ;;
863
enable-internal-history) hist_impl="internal" ;;
864
install-all-locales) all_locales=1 ;;
865
help* | bc-only* | dc-only* | debug*)
866
usage "No arg allowed for --$arg option" ;;
867
disable-bc* | disable-dc* | disable-clean*)
868
usage "No arg allowed for --$arg option" ;;
869
disable-extra-math*)
870
usage "No arg allowed for --$arg option" ;;
871
disable-history*)
872
usage "No arg allowed for --$arg option" ;;
873
disable-man-pages* | disable-nls* | disable-strip*)
874
usage "No arg allowed for --$arg option" ;;
875
disable-problematic-tests*)
876
usage "No arg allowed for --$arg option" ;;
877
install-all-locales*)
878
usage "No arg allowed for --$arg option" ;;
879
enable-editline* | enable-readline*)
880
usage "No arg allowed for --$arg option" ;;
881
enable-internal-history*)
882
usage "No arg allowed for --$arg option" ;;
883
'') break ;; # "--" terminates argument processing
884
* ) usage "Invalid option $LONG_OPTARG" ;;
885
esac
886
shift
887
OPTIND=1 ;;
888
?) usage "Invalid option: $opt" ;;
889
esac
890
891
done
892
893
# Sometimes, developers don't want configure.sh to do a config clean. But
894
# sometimes they do.
895
if [ "$clean" -ne 0 ]; then
896
if [ -f ./Makefile ]; then
897
make clean_config > /dev/null
898
fi
899
fi
900
901
# It is an error to say that bc only should be built and likewise for dc.
902
if [ "$bc_only" -eq 1 ] && [ "$dc_only" -eq 1 ]; then
903
usage "Can only specify one of -b(-D) or -d(-B)"
904
fi
905
906
# The library is mutually exclusive to the calculators, so it's an error to
907
# give an option for either of them.
908
if [ "$library" -ne 0 ]; then
909
if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then
910
usage "Must not specify -b(-D) or -d(-B) when building the library"
911
fi
912
fi
913
914
# KARATSUBA_LEN must be an integer and must be 16 or greater.
915
case $karatsuba_len in
916
(*[!0-9]*|'') usage "KARATSUBA_LEN is not a number" ;;
917
(*) ;;
918
esac
919
920
if [ "$karatsuba_len" -lt 16 ]; then
921
usage "KARATSUBA_LEN is less than 16"
922
fi
923
924
set -e
925
926
if [ -z "${LONG_BIT+set}" ]; then
927
LONG_BIT_DEFINE=""
928
elif [ "$LONG_BIT" -lt 32 ]; then
929
usage "LONG_BIT is less than 32"
930
else
931
LONG_BIT_DEFINE="-DBC_LONG_BIT=$LONG_BIT"
932
fi
933
934
if [ -z "$CC" ]; then
935
CC="c99"
936
else
937
938
# I had users complain that, if they gave CFLAGS as part of CC, which
939
# autotools allows in its braindead way, the build would fail with an error.
940
# I don't like adjusting for autotools, but oh well. These lines puts the
941
# stuff after the first space into CFLAGS.
942
ccbase=$(basename "$CC")
943
suffix=" *"
944
prefix="* "
945
946
if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
947
ccflags="${ccbase#$prefix}"
948
cc="${ccbase%%$suffix}"
949
ccdir=$(dirname "$CC")
950
if [ "$ccdir" = "." ] && [ "${CC#.}" = "$CC" ]; then
951
ccdir=""
952
else
953
ccdir="$ccdir/"
954
fi
955
CC="${ccdir}${cc}"
956
CFLAGS="$CFLAGS $ccflags"
957
fi
958
fi
959
960
if [ -z "$HOSTCC" ] && [ -z "$HOST_CC" ]; then
961
HOSTCC="$CC"
962
elif [ -z "$HOSTCC" ]; then
963
HOSTCC="$HOST_CC"
964
fi
965
966
if [ "$HOSTCC" != "$CC" ]; then
967
968
# Like above, this splits HOSTCC and HOSTCFLAGS.
969
ccbase=$(basename "$HOSTCC")
970
suffix=" *"
971
prefix="* "
972
973
if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
974
ccflags="${ccbase#$prefix}"
975
cc="${ccbase%%$suffix}"
976
ccdir=$(dirname "$HOSTCC")
977
if [ "$ccdir" = "." ] && [ "${HOSTCC#.}" = "$HOSTCC" ]; then
978
ccdir=""
979
else
980
ccdir="$ccdir/"
981
fi
982
HOSTCC="${ccdir}${cc}"
983
HOSTCFLAGS="$HOSTCFLAGS $ccflags"
984
fi
985
fi
986
987
if [ -z "${HOSTCFLAGS+set}" ] && [ -z "${HOST_CFLAGS+set}" ]; then
988
HOSTCFLAGS="$CFLAGS"
989
elif [ -z "${HOSTCFLAGS+set}" ]; then
990
HOSTCFLAGS="$HOST_CFLAGS"
991
fi
992
993
# Store these for the cross compilation detection later.
994
OLDCFLAGS="$CFLAGS"
995
OLDHOSTCFLAGS="$HOSTCFLAGS"
996
997
link="@printf 'No link necessary\\\\n'"
998
main_exec="BC"
999
executable="BC_EXEC"
1000
1001
karatsuba="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'"
1002
1003
bc_lib="\$(GEN_DIR)/lib.o"
1004
bc_help="\$(GEN_DIR)/bc_help.o"
1005
dc_help="\$(GEN_DIR)/dc_help.o"
1006
1007
default_target_prereqs="\$(BIN) \$(OBJS)"
1008
default_target_cmd="\$(CC) \$(CFLAGS) \$(OBJS) \$(LDFLAGS) -o \$(EXEC)"
1009
default_target="\$(DC_EXEC)"
1010
1011
second_target_prereqs=""
1012
second_target_cmd="$default_target_cmd"
1013
second_target="\$(BC_EXEC)"
1014
1015
# This if/else if chain is for setting the defaults that change based on whether
1016
# the library is being built, bc only, dc only, or both calculators.
1017
if [ "$library" -ne 0 ]; then
1018
1019
extra_math=1
1020
nls=0
1021
hist=0
1022
bc=1
1023
dc=1
1024
1025
default_target_prereqs="\$(BIN) \$(OBJ)"
1026
default_target_cmd="ar -r -cu \$(LIBBC) \$(OBJ)"
1027
default_target="\$(LIBBC)"
1028
1029
install_prereqs=" install_library"
1030
uninstall_prereqs=" uninstall_library"
1031
install_man_prereqs=" install_bcl_manpage"
1032
uninstall_man_prereqs=" uninstall_bcl_manpage"
1033
1034
elif [ "$bc_only" -eq 1 ]; then
1035
1036
bc=1
1037
dc=0
1038
1039
dc_help=""
1040
1041
executables="bc"
1042
1043
install_prereqs=" install_execs"
1044
install_man_prereqs=" install_bc_manpage"
1045
uninstall_prereqs=" uninstall_bc"
1046
uninstall_man_prereqs=" uninstall_bc_manpage"
1047
1048
default_target="\$(BC_EXEC)"
1049
second_target="\$(DC_EXEC)"
1050
1051
elif [ "$dc_only" -eq 1 ]; then
1052
1053
bc=0
1054
dc=1
1055
1056
bc_lib=""
1057
bc_help=""
1058
1059
executables="dc"
1060
1061
main_exec="DC"
1062
executable="DC_EXEC"
1063
1064
install_prereqs=" install_execs"
1065
install_man_prereqs=" install_dc_manpage"
1066
uninstall_prereqs=" uninstall_dc"
1067
uninstall_man_prereqs=" uninstall_dc_manpage"
1068
1069
else
1070
1071
bc=1
1072
dc=1
1073
1074
executables="bc and dc"
1075
1076
karatsuba="@\$(KARATSUBA) 30 0 \$(BC_EXEC)"
1077
1078
if [ "$library" -eq 0 ]; then
1079
install_prereqs=" install_execs"
1080
install_man_prereqs=" install_bc_manpage install_dc_manpage"
1081
uninstall_prereqs=" uninstall_bc uninstall_dc"
1082
uninstall_man_prereqs=" uninstall_bc_manpage uninstall_dc_manpage"
1083
else
1084
install_prereqs=" install_library install_bcl_header"
1085
install_man_prereqs=" install_bcl_manpage"
1086
uninstall_prereqs=" uninstall_library uninstall_bcl_header"
1087
uninstall_man_prereqs=" uninstall_bcl_manpage"
1088
fi
1089
1090
second_target_prereqs="$default_target_prereqs"
1091
default_target_prereqs="$second_target"
1092
default_target_cmd="\$(LINK) \$(BIN) \$(EXEC_PREFIX)\$(DC)"
1093
1094
fi
1095
1096
# This sets some necessary things for debug mode.
1097
if [ "$debug" -eq 1 ]; then
1098
1099
if [ -z "$CFLAGS" ] && [ -z "$optimization" ]; then
1100
CFLAGS="-O0"
1101
fi
1102
1103
CFLAGS="-g $CFLAGS"
1104
1105
else
1106
CPPFLAGS="-DNDEBUG $CPPFLAGS"
1107
fi
1108
1109
# Set optimization CFLAGS.
1110
if [ -n "$optimization" ]; then
1111
CFLAGS="-O$optimization $CFLAGS"
1112
fi
1113
1114
# Set some defaults.
1115
if [ -z "${DESTDIR+set}" ]; then
1116
destdir=""
1117
else
1118
destdir="DESTDIR = $DESTDIR"
1119
fi
1120
1121
# defprefix is for a warning about locales later.
1122
if [ -z "${PREFIX+set}" ]; then
1123
PREFIX="/usr/local"
1124
defprefix=1
1125
else
1126
defprefix=0
1127
fi
1128
1129
if [ -z "${BINDIR+set}" ]; then
1130
BINDIR="$PREFIX/bin"
1131
fi
1132
1133
if [ -z "${INCLUDEDIR+set}" ]; then
1134
INCLUDEDIR="$PREFIX/include"
1135
fi
1136
1137
if [ -z "${LIBDIR+set}" ]; then
1138
LIBDIR="$PREFIX/lib"
1139
fi
1140
1141
if [ -z "${PC_PATH+set}" ]; then
1142
1143
set +e
1144
1145
command -v pkg-config > /dev/null
1146
err=$?
1147
1148
set -e
1149
1150
if [ "$err" -eq 0 ]; then
1151
PC_PATH=$(pkg-config --variable=pc_path pkg-config)
1152
PC_PATH="${PC_PATH%%:*}"
1153
else
1154
PC_PATH=""
1155
fi
1156
1157
fi
1158
1159
# Set a default for the DATAROOTDIR. This is done if either manpages will be
1160
# installed, or locales are enabled because that's probably where NLSPATH
1161
# points.
1162
if [ "$install_manpages" -ne 0 ] || [ "$nls" -ne 0 ]; then
1163
if [ -z "${DATAROOTDIR+set}" ]; then
1164
DATAROOTDIR="$PREFIX/share"
1165
fi
1166
fi
1167
1168
# Set defaults for manpage environment variables.
1169
if [ "$install_manpages" -ne 0 ]; then
1170
1171
if [ -z "${DATADIR+set}" ]; then
1172
DATADIR="$DATAROOTDIR"
1173
fi
1174
1175
if [ -z "${MANDIR+set}" ]; then
1176
MANDIR="$DATADIR/man"
1177
fi
1178
1179
if [ -z "${MAN1DIR+set}" ]; then
1180
MAN1DIR="$MANDIR/man1"
1181
fi
1182
1183
if [ -z "${MAN3DIR+set}" ]; then
1184
MAN3DIR="$MANDIR/man3"
1185
fi
1186
1187
else
1188
install_man_prereqs=""
1189
uninstall_man_prereqs=""
1190
fi
1191
1192
# Here is where we test NLS (the locale system). This is done by trying to
1193
# compile src/vm.c, which has the relevant code. If it fails, then it is
1194
# disabled.
1195
if [ "$nls" -ne 0 ]; then
1196
1197
set +e
1198
1199
printf 'Testing NLS...\n'
1200
1201
flags="-DBC_ENABLE_NLS=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
1202
flags="$flags -DBC_ENABLE_HISTORY=$hist -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
1203
flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -DBC_ENABLE_OSSFUZZ=0"
1204
flags="$flags -I$scriptdir/include/ -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
1205
1206
ccbase=$(basename "$CC")
1207
1208
if [ "$ccbase" = "clang" ]; then
1209
flags="$flags -Wno-unreachable-code"
1210
fi
1211
1212
"$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/vm.c" -E > /dev/null
1213
1214
err="$?"
1215
1216
rm -rf "./vm.o"
1217
1218
# If this errors, it is probably because of building on Windows or musl,
1219
# and NLS is not supported on Windows or musl, so disable it.
1220
if [ "$err" -ne 0 ]; then
1221
printf 'NLS does not work.\n'
1222
if [ $force -eq 0 ]; then
1223
printf 'Disabling NLS...\n\n'
1224
nls=0
1225
else
1226
printf 'Forcing NLS...\n\n'
1227
fi
1228
else
1229
printf 'NLS works.\n\n'
1230
1231
printf 'Testing gencat...\n'
1232
gencat "./en_US.cat" "$scriptdir/locales/en_US.msg" 2>&1
1233
1234
err="$?"
1235
1236
rm -rf "./en_US.cat"
1237
1238
if [ "$err" -ne 0 ]; then
1239
printf 'gencat does not work.\n'
1240
if [ $force -eq 0 ]; then
1241
printf 'Disabling NLS...\n\n'
1242
nls=0
1243
else
1244
printf 'Forcing NLS...\n\n'
1245
fi
1246
else
1247
1248
printf 'gencat works.\n\n'
1249
1250
# It turns out that POSIX locales are really terrible, and running
1251
# gencat on one machine is not guaranteed to make those cat files
1252
# portable to another machine, so we had better warn the user here.
1253
if [ "$HOSTCC" != "$CC" ] || [ "$OLDHOSTCFLAGS" != "$OLDCFLAGS" ]; then
1254
printf 'Cross-compile detected.\n\n'
1255
printf 'WARNING: Catalog files generated with gencat may not be portable\n'
1256
printf ' across different architectures.\n\n'
1257
fi
1258
1259
if [ -z "$NLSPATH" ]; then
1260
NLSPATH="/usr/share/locale/%L/%N"
1261
fi
1262
1263
install_locales_prereqs=" install_locales"
1264
uninstall_locales_prereqs=" uninstall_locales"
1265
1266
fi
1267
1268
fi
1269
1270
set -e
1271
1272
else
1273
install_locales_prereqs=""
1274
uninstall_locales_prereqs=""
1275
all_locales=0
1276
fi
1277
1278
if [ "$nls" -ne 0 ] && [ "$all_locales" -ne 0 ]; then
1279
install_locales="\$(LOCALE_INSTALL) -l \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
1280
else
1281
install_locales="\$(LOCALE_INSTALL) \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
1282
fi
1283
1284
# Like the above tested locale support, this tests history.
1285
if [ "$hist" -eq 1 ]; then
1286
1287
if [ "$hist_impl" = "editline" ]; then
1288
editline=1
1289
readline=0
1290
elif [ "$hist_impl" = "readline" ]; then
1291
editline=0
1292
readline=1
1293
else
1294
editline=0
1295
readline=0
1296
fi
1297
1298
set +e
1299
1300
printf 'Testing history...\n'
1301
1302
flags="-DBC_ENABLE_HISTORY=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
1303
flags="$flags -DBC_ENABLE_NLS=$nls -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
1304
flags="$flags -DBC_ENABLE_EDITLINE=$editline -DBC_ENABLE_READLINE=$readline"
1305
flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -DBC_ENABLE_OSSFUZZ=0"
1306
flags="$flags -I$scriptdir/include/ -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
1307
1308
"$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/history.c" -E > /dev/null
1309
1310
err="$?"
1311
1312
rm -rf "./history.o"
1313
1314
# If this errors, it is probably because of building on Windows,
1315
# and history is not supported on Windows, so disable it.
1316
if [ "$err" -ne 0 ]; then
1317
printf 'History does not work.\n'
1318
if [ $force -eq 0 ]; then
1319
printf 'Disabling history...\n\n'
1320
hist=0
1321
else
1322
printf 'Forcing history...\n\n'
1323
fi
1324
else
1325
printf 'History works.\n\n'
1326
fi
1327
1328
set -e
1329
1330
else
1331
1332
editline=0
1333
readline=0
1334
1335
fi
1336
1337
if [ "$hist" -eq 0 ]; then
1338
CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0"
1339
else
1340
1341
# We are also setting the CFLAGS and LDFLAGS here.
1342
if [ "$editline" -ne 0 ]; then
1343
LDFLAGS="$LDFLAGS -ledit"
1344
CPPFLAGS="$CPPFLAGS -DBC_ENABLE_EDITLINE=1 -DBC_ENABLE_READLINE=0"
1345
elif [ "$readline" -ne 0 ]; then
1346
LDFLAGS="$LDFLAGS -lreadline"
1347
CPPFLAGS="$CPPFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=1"
1348
else
1349
CPPFLAGS="$CPPFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0"
1350
fi
1351
1352
fi
1353
1354
# Test FreeBSD. This is not in an if statement because regardless of whatever
1355
# the user says, we need to know if we are on FreeBSD. If we are, we cannot set
1356
# _POSIX_C_SOURCE and _XOPEN_SOURCE. The FreeBSD headers turn *off* stuff when
1357
# that is done.
1358
set +e
1359
printf 'Testing for FreeBSD...\n'
1360
1361
flags="-DBC_TEST_FREEBSD -DBC_ENABLE_AFL=0"
1362
"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/scripts/os.c" > /dev/null
1363
1364
err="$?"
1365
1366
if [ "$err" -ne 0 ]; then
1367
printf 'On FreeBSD. Not using _POSIX_C_SOURCE and _XOPEN_SOURCE.\n\n'
1368
else
1369
printf 'Not on FreeBSD. Using _POSIX_C_SOURCE and _XOPEN_SOURCE.\n\n'
1370
CPPFLAGS="$CPPFLAGS -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
1371
fi
1372
1373
# Test macOS. This is not in an if statement because regardless of whatever the
1374
# user says, we need to know if we are on macOS. If we are, we have to set
1375
# _DARWIN_C_SOURCE.
1376
printf 'Testing for macOS...\n'
1377
1378
flags="-DBC_TEST_APPLE -DBC_ENABLE_AFL=0"
1379
"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/scripts/os.c" > /dev/null
1380
1381
err="$?"
1382
1383
if [ "$err" -ne 0 ]; then
1384
printf 'On macOS. Using _DARWIN_C_SOURCE.\n\n'
1385
apple="-D_DARWIN_C_SOURCE"
1386
else
1387
printf 'Not on macOS.\n\n'
1388
apple=""
1389
fi
1390
1391
# We can't use the linker's strip flag on macOS.
1392
if [ "$debug" -eq 0 ] && [ "$apple" = "" ] && [ "$strip_bin" -ne 0 ]; then
1393
LDFLAGS="-s $LDFLAGS"
1394
fi
1395
1396
# Test OpenBSD. This is not in an if statement because regardless of whatever
1397
# the user says, we need to know if we are on OpenBSD to activate _BSD_SOURCE.
1398
# No, I cannot `#define _BSD_SOURCE` in a header because OpenBSD's patched GCC
1399
# and Clang complain that that is only allowed for system headers. Sigh....So we
1400
# have to check at configure time and set it on the compiler command-line. And
1401
# we have to set it because we also set _POSIX_C_SOURCE, which OpenBSD headers
1402
# detect, and when they detect it, they turn off _BSD_SOURCE unless it is
1403
# specifically requested.
1404
printf 'Testing for OpenBSD...\n'
1405
1406
flags="-DBC_TEST_OPENBSD -DBC_ENABLE_AFL=0"
1407
"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/scripts/os.c" > /dev/null
1408
1409
err="$?"
1410
1411
if [ "$err" -ne 0 ]; then
1412
1413
printf 'On OpenBSD. Using _BSD_SOURCE.\n\n'
1414
bsd="-D_BSD_SOURCE"
1415
1416
# Readline errors on OpenBSD, for some weird reason.
1417
if [ "$readline" -ne 0 ]; then
1418
usage "Cannot use readline on OpenBSD"
1419
fi
1420
1421
else
1422
printf 'Not on OpenBSD.\n\n'
1423
bsd=""
1424
fi
1425
1426
set -e
1427
1428
if [ "$library" -eq 1 ]; then
1429
bc_lib=""
1430
fi
1431
1432
if [ "$extra_math" -eq 1 ] && [ "$bc" -ne 0 ] && [ "$library" -eq 0 ]; then
1433
BC_LIB2_O="\$(GEN_DIR)/lib2.o"
1434
else
1435
BC_LIB2_O=""
1436
fi
1437
1438
GEN_DIR="$scriptdir/gen"
1439
1440
# These lines set the appropriate targets based on whether `gen/strgen.c` or
1441
# `gen/strgen.sh` is used.
1442
GEN="strgen"
1443
GEN_EXEC_TARGET="\$(HOSTCC) -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -I$scriptdir/include/ \$(HOSTCFLAGS) -o \$(GEN_EXEC) \$(GEN_C)"
1444
CLEAN_PREREQS=" clean_gen"
1445
1446
if [ -z "${GEN_HOST+set}" ]; then
1447
GEN_HOST=1
1448
else
1449
if [ "$GEN_HOST" -eq 0 ]; then
1450
GEN="strgen.sh"
1451
GEN_EXEC_TARGET="@printf 'Do not need to build gen/strgen.c\\\\n'"
1452
fi
1453
fi
1454
1455
# The fuzzer files are always unneeded because they'll be built separately.
1456
manpage_args=""
1457
unneeded="bc_fuzzer.c dc_fuzzer.c"
1458
headers="\$(HEADERS)"
1459
1460
# This series of if statements figure out what source files are *not* needed.
1461
if [ "$extra_math" -eq 0 ]; then
1462
exclude_extra_math=1
1463
manpage_args="E"
1464
unneeded="$unneeded rand.c"
1465
else
1466
exclude_extra_math=0
1467
headers="$headers \$(EXTRA_MATH_HEADERS)"
1468
fi
1469
1470
# All of these next if statements set the build type and mark certain source
1471
# files as unneeded so that they won't have targets generated for them.
1472
1473
if [ "$hist" -eq 0 ]; then
1474
manpage_args="${manpage_args}H"
1475
unneeded="$unneeded history.c"
1476
else
1477
headers="$headers \$(HISTORY_HEADERS)"
1478
fi
1479
1480
if [ "$nls" -eq 0 ]; then
1481
manpage_args="${manpage_args}N"
1482
fi
1483
1484
if [ "$bc" -eq 0 ]; then
1485
unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
1486
else
1487
headers="$headers \$(BC_HEADERS)"
1488
fi
1489
1490
if [ "$dc" -eq 0 ]; then
1491
unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
1492
else
1493
headers="$headers \$(DC_HEADERS)"
1494
fi
1495
1496
version=$(cat "$scriptdir/VERSION.txt" | head -n1)
1497
1498
if [ "$library" -ne 0 ]; then
1499
1500
unneeded="$unneeded args.c opt.c read.c file.c main.c"
1501
unneeded="$unneeded lang.c lex.c parse.c program.c"
1502
unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
1503
unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
1504
headers="$headers \$(LIBRARY_HEADERS)"
1505
1506
if [ "$PC_PATH" != "" ]; then
1507
1508
contents=$(cat "$scriptdir/bcl.pc.in")
1509
1510
contents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR")
1511
contents=$(replace "$contents" "LIBDIR" "$LIBDIR")
1512
contents=$(replace "$contents" "VERSION" "$version")
1513
1514
printf '%s\n' "$contents" > "$scriptdir/bcl.pc"
1515
1516
pkg_config_install="\$(SAFE_INSTALL) \$(PC_INSTALL_ARGS) \"\$(BCL_PC)\" \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\""
1517
pkg_config_uninstall="\$(RM) -f \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\""
1518
1519
else
1520
1521
pkg_config_install=""
1522
pkg_config_uninstall=""
1523
1524
fi
1525
1526
else
1527
1528
unneeded="$unneeded library.c"
1529
1530
PC_PATH=""
1531
pkg_config_install=""
1532
pkg_config_uninstall=""
1533
1534
fi
1535
1536
# library.c, bc_fuzzer.c, and dc_fuzzer.c are not needed under normal
1537
# circumstances.
1538
if [ "$unneeded" = "" ]; then
1539
unneeded="library.c bc_fuzzer.c dc_fuzzer.c"
1540
fi
1541
1542
# This sets the appropriate manpage for a full build.
1543
if [ "$manpage_args" = "" ]; then
1544
manpage_args="A"
1545
fi
1546
1547
if [ "$bc_default_prompt" = "" ]; then
1548
bc_default_prompt="$bc_default_tty_mode"
1549
fi
1550
1551
if [ "$dc_default_prompt" = "" ]; then
1552
dc_default_prompt="$dc_default_tty_mode"
1553
fi
1554
1555
printf 'unneeded: %s\n' "$unneeded"
1556
1557
# Print out the values; this is for debugging.
1558
printf 'Version: %s\n' "$version"
1559
1560
if [ "$bc" -ne 0 ]; then
1561
printf 'Building bc\n'
1562
else
1563
printf 'Not building bc\n'
1564
fi
1565
if [ "$dc" -ne 0 ]; then
1566
printf 'Building dc\n'
1567
else
1568
printf 'Not building dc\n'
1569
fi
1570
printf '\n'
1571
printf 'BC_ENABLE_LIBRARY=%s\n\n' "$library"
1572
printf 'BC_ENABLE_HISTORY=%s\n' "$hist"
1573
printf 'BC_ENABLE_EXTRA_MATH=%s\n' "$extra_math"
1574
printf 'BC_ENABLE_NLS=%s\n\n' "$nls"
1575
printf '\n'
1576
printf 'BC_NUM_KARATSUBA_LEN=%s\n' "$karatsuba_len"
1577
printf '\n'
1578
printf 'CC=%s\n' "$CC"
1579
printf 'CFLAGS=%s\n' "$CFLAGS"
1580
printf 'HOSTCC=%s\n' "$HOSTCC"
1581
printf 'HOSTCFLAGS=%s\n' "$HOSTCFLAGS"
1582
printf 'CPPFLAGS=%s\n' "$CPPFLAGS"
1583
printf 'LDFLAGS=%s\n' "$LDFLAGS"
1584
printf 'PREFIX=%s\n' "$PREFIX"
1585
printf 'BINDIR=%s\n' "$BINDIR"
1586
printf 'INCLUDEDIR=%s\n' "$INCLUDEDIR"
1587
printf 'LIBDIR=%s\n' "$LIBDIR"
1588
printf 'DATAROOTDIR=%s\n' "$DATAROOTDIR"
1589
printf 'DATADIR=%s\n' "$DATADIR"
1590
printf 'MANDIR=%s\n' "$MANDIR"
1591
printf 'MAN1DIR=%s\n' "$MAN1DIR"
1592
printf 'MAN3DIR=%s\n' "$MAN3DIR"
1593
printf 'NLSPATH=%s\n' "$NLSPATH"
1594
printf 'PC_PATH=%s\n' "$PC_PATH"
1595
printf 'EXECSUFFIX=%s\n' "$EXECSUFFIX"
1596
printf 'EXECPREFIX=%s\n' "$EXECPREFIX"
1597
printf 'DESTDIR=%s\n' "$DESTDIR"
1598
printf 'LONG_BIT=%s\n' "$LONG_BIT"
1599
printf 'GEN_HOST=%s\n' "$GEN_HOST"
1600
printf 'GEN_EMU=%s\n' "$GEN_EMU"
1601
printf '\n'
1602
printf 'Setting Defaults\n'
1603
printf '================\n'
1604
printf 'bc.banner=%s\n' "$bc_default_banner"
1605
printf 'bc.sigint_reset=%s\n' "$bc_default_sigint_reset"
1606
printf 'dc.sigint_reset=%s\n' "$dc_default_sigint_reset"
1607
printf 'bc.tty_mode=%s\n' "$bc_default_tty_mode"
1608
printf 'dc.tty_mode=%s\n' "$dc_default_tty_mode"
1609
printf 'bc.prompt=%s\n' "$bc_default_prompt"
1610
printf 'dc.prompt=%s\n' "$dc_default_prompt"
1611
printf 'bc.expr_exit=%s\n' "$bc_default_expr_exit"
1612
printf 'dc.expr_exit=%s\n' "$dc_default_expr_exit"
1613
printf 'bc.digit_clamp=%s\n' "$bc_default_digit_clamp"
1614
printf 'dc.digit_clamp=%s\n' "$dc_default_digit_clamp"
1615
1616
# This code outputs a warning. The warning is to not surprise users when locales
1617
# are installed outside of the prefix. This warning is suppressed when the
1618
# default prefix is used, as well, so as not to panic users just installing by
1619
# hand. I believe this will be okay because NLSPATH is usually in /usr and the
1620
# default prefix is /usr/local, so they'll be close that way.
1621
if [ "$nls" -ne 0 ] && [ "${NLSPATH#$PREFIX}" = "${NLSPATH}" ] && [ "$defprefix" -eq 0 ]; then
1622
printf '\n********************************************************************************\n\n'
1623
printf 'WARNING: Locales will *NOT* be installed in $PREFIX (%s).\n' "$PREFIX"
1624
printf '\n'
1625
printf ' This is because they *MUST* be installed at a fixed location to even\n'
1626
printf ' work, and that fixed location is $NLSPATH (%s).\n' "$NLSPATH"
1627
printf '\n'
1628
printf ' This location is *outside* of $PREFIX. If you do not wish to install\n'
1629
printf ' locales outside of $PREFIX, you must disable NLS with the -N or the\n'
1630
printf ' --disable-nls options.\n'
1631
printf '\n'
1632
printf ' The author apologizes for the inconvenience, but the need to install\n'
1633
printf ' the locales at a fixed location is mandated by POSIX, and it is not\n'
1634
printf ' possible for the author to change that requirement.\n'
1635
printf '\n********************************************************************************\n'
1636
fi
1637
1638
# This is where the real work begins. This is the point at which the Makefile.in
1639
# template is edited and output to the Makefile.
1640
1641
contents=$(cat "$scriptdir/Makefile.in")
1642
1643
needle="WARNING"
1644
replacement='*** WARNING: Autogenerated from Makefile.in. DO NOT MODIFY ***'
1645
1646
contents=$(replace "$contents" "$needle" "$replacement")
1647
1648
# The contents are edited to have the list of files to build.
1649
contents=$(gen_file_list "$contents" $unneeded)
1650
1651
SRC_TARGETS=""
1652
1653
# This line and loop generates the individual targets for source files. I used
1654
# to just use an implicit target, but that was found to be inadequate when I
1655
# added the library.
1656
src_files=$(find_src_files $unneeded)
1657
1658
for f in $src_files; do
1659
o=$(replace_ext "$f" "c" "o")
1660
o=$(basename "$o")
1661
SRC_TARGETS=$(printf '%s\n\nsrc/%s: src %s %s\n\t$(CC) $(CFLAGS) -o src/%s -c %s\n' \
1662
"$SRC_TARGETS" "$o" "$headers" "$f" "$o" "$f")
1663
done
1664
1665
# Replace all the placeholders.
1666
contents=$(replace "$contents" "ROOTDIR" "$scriptdir")
1667
contents=$(replace "$contents" "BUILDDIR" "$builddir")
1668
1669
contents=$(replace "$contents" "HEADERS" "$headers")
1670
1671
contents=$(replace "$contents" "VERSION" "$version")
1672
1673
contents=$(replace "$contents" "BC_ENABLED" "$bc")
1674
contents=$(replace "$contents" "DC_ENABLED" "$dc")
1675
1676
contents=$(replace "$contents" "BUILD_TYPE" "$manpage_args")
1677
contents=$(replace "$contents" "EXCLUDE_EXTRA_MATH" "$exclude_extra_math")
1678
1679
contents=$(replace "$contents" "LIBRARY" "$library")
1680
contents=$(replace "$contents" "HISTORY" "$hist")
1681
contents=$(replace "$contents" "EXTRA_MATH" "$extra_math")
1682
contents=$(replace "$contents" "NLS" "$nls")
1683
1684
contents=$(replace "$contents" "BC_LIB_O" "$bc_lib")
1685
contents=$(replace "$contents" "BC_HELP_O" "$bc_help")
1686
contents=$(replace "$contents" "DC_HELP_O" "$dc_help")
1687
contents=$(replace "$contents" "BC_LIB2_O" "$BC_LIB2_O")
1688
contents=$(replace "$contents" "KARATSUBA_LEN" "$karatsuba_len")
1689
1690
contents=$(replace "$contents" "NLSPATH" "$NLSPATH")
1691
contents=$(replace "$contents" "DESTDIR" "$destdir")
1692
contents=$(replace "$contents" "EXECSUFFIX" "$EXECSUFFIX")
1693
contents=$(replace "$contents" "EXECPREFIX" "$EXECPREFIX")
1694
contents=$(replace "$contents" "BINDIR" "$BINDIR")
1695
contents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR")
1696
contents=$(replace "$contents" "LIBDIR" "$LIBDIR")
1697
contents=$(replace "$contents" "MAN1DIR" "$MAN1DIR")
1698
contents=$(replace "$contents" "MAN3DIR" "$MAN3DIR")
1699
contents=$(replace "$contents" "CFLAGS" "$CFLAGS")
1700
contents=$(replace "$contents" "HOSTCFLAGS" "$HOSTCFLAGS")
1701
contents=$(replace "$contents" "CPPFLAGS" "$CPPFLAGS")
1702
contents=$(replace "$contents" "LDFLAGS" "$LDFLAGS")
1703
contents=$(replace "$contents" "CC" "$CC")
1704
contents=$(replace "$contents" "HOSTCC" "$HOSTCC")
1705
contents=$(replace "$contents" "INSTALL_PREREQS" "$install_prereqs")
1706
contents=$(replace "$contents" "INSTALL_MAN_PREREQS" "$install_man_prereqs")
1707
contents=$(replace "$contents" "INSTALL_LOCALES" "$install_locales")
1708
contents=$(replace "$contents" "INSTALL_LOCALES_PREREQS" "$install_locales_prereqs")
1709
contents=$(replace "$contents" "UNINSTALL_MAN_PREREQS" "$uninstall_man_prereqs")
1710
contents=$(replace "$contents" "UNINSTALL_PREREQS" "$uninstall_prereqs")
1711
contents=$(replace "$contents" "UNINSTALL_LOCALES_PREREQS" "$uninstall_locales_prereqs")
1712
1713
contents=$(replace "$contents" "PC_PATH" "$PC_PATH")
1714
contents=$(replace "$contents" "PKG_CONFIG_INSTALL" "$pkg_config_install")
1715
contents=$(replace "$contents" "PKG_CONFIG_UNINSTALL" "$pkg_config_uninstall")
1716
1717
contents=$(replace "$contents" "DEFAULT_TARGET" "$default_target")
1718
contents=$(replace "$contents" "DEFAULT_TARGET_PREREQS" "$default_target_prereqs")
1719
contents=$(replace "$contents" "DEFAULT_TARGET_CMD" "$default_target_cmd")
1720
contents=$(replace "$contents" "SECOND_TARGET" "$second_target")
1721
contents=$(replace "$contents" "SECOND_TARGET_PREREQS" "$second_target_prereqs")
1722
contents=$(replace "$contents" "SECOND_TARGET_CMD" "$second_target_cmd")
1723
1724
contents=$(replace "$contents" "ALL_PREREQ" "$ALL_PREREQ")
1725
contents=$(replace "$contents" "BC_EXEC_PREREQ" "$bc_exec_prereq")
1726
contents=$(replace "$contents" "BC_EXEC_CMD" "$bc_exec_cmd")
1727
contents=$(replace "$contents" "DC_EXEC_PREREQ" "$dc_exec_prereq")
1728
contents=$(replace "$contents" "DC_EXEC_CMD" "$dc_exec_cmd")
1729
1730
contents=$(replace "$contents" "GENERATE_TESTS" "$generate_tests")
1731
contents=$(replace "$contents" "PROBLEMATIC_TESTS" "$problematic_tests")
1732
1733
contents=$(replace "$contents" "EXECUTABLES" "$executables")
1734
contents=$(replace "$contents" "MAIN_EXEC" "$main_exec")
1735
contents=$(replace "$contents" "EXEC" "$executable")
1736
1737
contents=$(replace "$contents" "KARATSUBA" "$karatsuba")
1738
1739
contents=$(replace "$contents" "LONG_BIT_DEFINE" "$LONG_BIT_DEFINE")
1740
1741
contents=$(replace "$contents" "GEN_DIR" "$GEN_DIR")
1742
contents=$(replace "$contents" "GEN" "$GEN")
1743
contents=$(replace "$contents" "GEN_EXEC_TARGET" "$GEN_EXEC_TARGET")
1744
contents=$(replace "$contents" "CLEAN_PREREQS" "$CLEAN_PREREQS")
1745
contents=$(replace "$contents" "GEN_EMU" "$GEN_EMU")
1746
1747
contents=$(replace "$contents" "BSD" "$bsd")
1748
contents=$(replace "$contents" "APPLE" "$apple")
1749
1750
contents=$(replace "$contents" "BC_DEFAULT_BANNER" "$bc_default_banner")
1751
contents=$(replace "$contents" "BC_DEFAULT_SIGINT_RESET" "$bc_default_sigint_reset")
1752
contents=$(replace "$contents" "DC_DEFAULT_SIGINT_RESET" "$dc_default_sigint_reset")
1753
contents=$(replace "$contents" "BC_DEFAULT_TTY_MODE" "$bc_default_tty_mode")
1754
contents=$(replace "$contents" "DC_DEFAULT_TTY_MODE" "$dc_default_tty_mode")
1755
contents=$(replace "$contents" "BC_DEFAULT_PROMPT" "$bc_default_prompt")
1756
contents=$(replace "$contents" "DC_DEFAULT_PROMPT" "$dc_default_prompt")
1757
contents=$(replace "$contents" "BC_DEFAULT_EXPR_EXIT" "$bc_default_expr_exit")
1758
contents=$(replace "$contents" "DC_DEFAULT_EXPR_EXIT" "$dc_default_expr_exit")
1759
contents=$(replace "$contents" "BC_DEFAULT_DIGIT_CLAMP" "$bc_default_digit_clamp")
1760
contents=$(replace "$contents" "DC_DEFAULT_DIGIT_CLAMP" "$dc_default_digit_clamp")
1761
1762
# Do the first print to the Makefile.
1763
printf '%s\n%s\n\n' "$contents" "$SRC_TARGETS" > "Makefile"
1764
1765
# Copy the correct manuals to the expected places.
1766
mkdir -p manuals
1767
cp -f "$scriptdir/manuals/bc/$manpage_args.1.md" manuals/bc.1.md
1768
cp -f "$scriptdir/manuals/bc/$manpage_args.1" manuals/bc.1
1769
cp -f "$scriptdir/manuals/dc/$manpage_args.1.md" manuals/dc.1.md
1770
cp -f "$scriptdir/manuals/dc/$manpage_args.1" manuals/dc.1
1771
1772
make clean > /dev/null
1773
1774