1# 2# Copyright (c) 2018-2019 Gavin D. Howard and contributors. 3# 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions are met: 8# 9# * Redistributions of source code must retain the above copyright notice, this 10# list of conditions and the following disclaimer. 11# 12# * Redistributions in binary form must reproduce the above copyright notice, 13# this list of conditions and the following disclaimer in the documentation 14# and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26# POSSIBILITY OF SUCH DAMAGE. 27# 28# %%WARNING%% 29# 30.POSIX: 31 32VERSION = 2.4.0 33 34SRC = %%SRC%% 35OBJ = %%OBJ%% 36GCDA = %%GCDA%% 37GCNO = %%GCNO%% 38 39BC_SRC = %%BC_SRC%% 40BC_OBJ = %%BC_OBJ%% 41BC_GCDA = %%BC_GCDA%% 42BC_GCNO = %%BC_GCNO%% 43 44DC_SRC = %%DC_SRC%% 45DC_OBJ = %%DC_OBJ%% 46DC_GCDA = %%DC_GCDA%% 47DC_GCNO = %%DC_GCNO%% 48 49HISTORY_SRC = %%HISTORY_SRC%% 50HISTORY_OBJ = %%HISTORY_OBJ%% 51HISTORY_GCDA = %%HISTORY_GCDA%% 52HISTORY_GCNO = %%HISTORY_GCNO%% 53 54BC_ENABLED_NAME = BC_ENABLED 55BC_ENABLED = %%BC_ENABLED%% 56DC_ENABLED_NAME = DC_ENABLED 57DC_ENABLED = %%DC_ENABLED%% 58 59GEN_DIR = gen 60GEN = %%GEN%% 61GEN_EXEC = $(GEN_DIR)/$(GEN) 62GEN_C = $(GEN_DIR)/$(GEN).c 63 64GEN_EMU = %%GEN_EMU%% 65 66BC_LIB = $(GEN_DIR)/lib.bc 67BC_LIB_C = $(GEN_DIR)/lib.c 68BC_LIB_O = %%BC_LIB_O%% 69BC_LIB_GCDA = $(GEN_DIR)/lib.gcda 70BC_LIB_GCNO = $(GEN_DIR)/lib.gcno 71 72BC_LIB2 = $(GEN_DIR)/lib2.bc 73BC_LIB2_C = $(GEN_DIR)/lib2.c 74BC_LIB2_O = %%BC_LIB2_O%% 75BC_LIB2_GCDA = $(GEN_DIR)/lib2.gcda 76BC_LIB2_GCNO = $(GEN_DIR)/lib2.gcno 77 78BC_HELP = $(GEN_DIR)/bc_help.txt 79BC_HELP_C = $(GEN_DIR)/bc_help.c 80BC_HELP_O = %%BC_HELP_O%% 81BC_HELP_GCDA = $(GEN_DIR)/bc_help.gcda 82BC_HELP_GCNO = $(GEN_DIR)/bc_help.gcno 83 84DC_HELP = $(GEN_DIR)/dc_help.txt 85DC_HELP_C = $(GEN_DIR)/dc_help.c 86DC_HELP_O = %%DC_HELP_O%% 87DC_HELP_GCDA = $(GEN_DIR)/dc_help.gcda 88DC_HELP_GCNO = $(GEN_DIR)/dc_help.gcno 89 90BIN = bin 91LOCALES = locales 92EXEC_SUFFIX = %%EXECSUFFIX%% 93EXEC_PREFIX = %%EXECPREFIX%% 94 95BC = bc 96DC = dc 97BC_EXEC = $(BIN)/$(EXEC_PREFIX)$(BC) 98DC_EXEC = $(BIN)/$(EXEC_PREFIX)$(DC) 99 100MANUALS = manuals 101BC_MANPAGE_NAME = $(EXEC_PREFIX)$(BC)$(EXEC_SUFFIX).1 102BC_MANPAGE = $(MANUALS)/$(BC).1 103BC_RONN = $(BC_MANPAGE).ronn 104DC_MANPAGE_NAME = $(EXEC_PREFIX)$(DC)$(EXEC_SUFFIX).1 105DC_MANPAGE = $(MANUALS)/$(DC).1 106DC_RONN = $(DC_MANPAGE).ronn 107 108MANPAGE_INSTALL_ARGS = -Dm644 109 110%%DESTDIR%% 111BINDIR = %%BINDIR%% 112MAN1DIR = %%MAN1DIR%% 113MAIN_EXEC = $(EXEC_PREFIX)$(%%MAIN_EXEC%%)$(EXEC_SUFFIX) 114EXEC = $(%%EXEC%%) 115NLSPATH = %%NLSPATH%% 116 117BC_ENABLE_SIGNALS = %%SIGNALS%% 118BC_ENABLE_HISTORY = %%HISTORY%% 119BC_ENABLE_EXTRA_MATH_NAME = BC_ENABLE_EXTRA_MATH 120BC_ENABLE_EXTRA_MATH = %%EXTRA_MATH%% 121BC_ENABLE_NLS = %%NLS%% 122BC_ENABLE_PROMPT = %%PROMPT%% 123BC_LONG_BIT = %%LONG_BIT%% 124 125RM = rm 126MKDIR = mkdir 127 128INSTALL = ./install.sh 129SAFE_INSTALL = ./safe-install.sh 130LINK = ./link.sh 131KARATSUBA = ./karatsuba.py 132LOCALE_INSTALL = ./locale_install.sh 133LOCALE_UNINSTALL = ./locale_uninstall.sh 134 135VALGRIND_ARGS = --error-exitcode=100 --leak-check=full --show-leak-kinds=all --errors-for-leak-kinds=all 136RONN_ARGS = --roff --organization="Gavin D. Howard" --manual="General Commands Manual" 137 138BC_NUM_KARATSUBA_LEN = %%KARATSUBA_LEN%% 139 140CPPFLAGS1 = -D$(BC_ENABLED_NAME)=$(BC_ENABLED) -D$(DC_ENABLED_NAME)=$(DC_ENABLED) 141CPPFLAGS2 = $(CPPFLAGS1) -I./include/ -DVERSION=$(VERSION) %%LONG_BIT_DEFINE%% 142CPPFLAGS3 = $(CPPFLAGS2) -DEXECPREFIX=$(EXEC_PREFIX) -DMAINEXEC=$(MAIN_EXEC) 143CPPFLAGS4 = $(CPPFLAGS3) -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 144CPPFLAGS5 = $(CPPFLAGS4) -DBC_NUM_KARATSUBA_LEN=$(BC_NUM_KARATSUBA_LEN) 145CPPFLAGS6 = $(CPPFLAGS5) -DBC_ENABLE_NLS=$(BC_ENABLE_NLS) -DBC_ENABLE_PROMPT=$(BC_ENABLE_PROMPT) 146CPPFLAGS7 = $(CPPFLAGS6) -D$(BC_ENABLE_EXTRA_MATH_NAME)=$(BC_ENABLE_EXTRA_MATH) 147CPPFLAGS = $(CPPFLAGS7) -DBC_ENABLE_SIGNALS=$(BC_ENABLE_SIGNALS) -DBC_ENABLE_HISTORY=$(BC_ENABLE_HISTORY) 148CFLAGS = $(CPPFLAGS) %%CPPFLAGS%% %%CFLAGS%% 149LDFLAGS = %%LDFLAGS%% 150 151HOSTCFLAGS = %%HOSTCFLAGS%% 152 153CC = %%CC%% 154HOSTCC = %%HOSTCC%% 155 156.c.o: 157 $(CC) $(CFLAGS) -o $@ -c $< 158 159all: make_bin $(DC_HELP_O) $(BC_HELP_O) $(BC_LIB_O) $(BC_LIB2_O) $(BC_LIB3_O) $(BC_OBJ) $(DC_OBJ) $(HISTORY_OBJ) $(OBJ) 160 $(CC) $(CFLAGS) $(OBJ) $(DC_OBJ) $(BC_OBJ) $(HISTORY_OBJ) $(BC_HELP_O) $(DC_HELP_O) \ 161 $(BC_LIB_O) $(BC_LIB2_O) $(BC_LIB3_O) $(LDFLAGS) -o $(EXEC) 162 %%LINK%% 163 164$(GEN_EXEC): 165 %%GEN_EXEC_TARGET%% 166 167$(BC_LIB_C): $(GEN_EXEC) $(BC_LIB) 168 $(GEN_EMU) $(GEN_EXEC) $(BC_LIB) $(BC_LIB_C) bc_lib bc.h bc_lib_name $(BC_ENABLED_NAME) 1 169 170$(BC_LIB2_C): $(GEN_EXEC) $(BC_LIB2) 171 $(GEN_EMU) $(GEN_EXEC) $(BC_LIB2) $(BC_LIB2_C) bc_lib2 bc.h bc_lib2_name \ 172 "$(BC_ENABLED_NAME) && $(BC_ENABLE_EXTRA_MATH_NAME)" 1 173 174$(BC_HELP_C): $(GEN_EXEC) $(BC_HELP) 175 $(GEN_EMU) $(GEN_EXEC) $(BC_HELP) $(BC_HELP_C) bc_help bc.h "" $(BC_ENABLED_NAME) 176 177$(DC_HELP_C): $(GEN_EXEC) $(DC_HELP) 178 $(GEN_EMU) $(GEN_EXEC) $(DC_HELP) $(DC_HELP_C) dc_help dc.h "" $(DC_ENABLED_NAME) 179 180make_bin: 181 $(MKDIR) -p $(BIN) 182 183help: 184 @printf 'available targets:\n' 185 @printf '\n' 186 @printf ' all (default) builds %%EXECUTABLES%%\n' 187 @printf ' check alias for `make test`\n' 188 @printf ' clean removes all build files\n' 189 @printf ' clean_config removes all build files as well as the generated Makefile\n' 190 @printf ' clean_tests removes all build files, the generated Makefile,\n 191 @printf ' and generated tests\n' 192 @printf ' install installs binaries to "%s%s"\n' "$(DESTDIR)" "$(BINDIR)" 193 @printf ' and (if enabled) manpages to "%s%s"\n' "$(DESTDIR)" "$(MAN1DIR)" 194 @printf ' karatsuba runs the karatsuba script (requires Python 3)\n' 195 @printf ' karatsuba_test runs the karatsuba script while running tests\n' 196 @printf ' (requires Python 3)\n' 197 @printf ' uninstall uninstalls binaries from "%s%s"\n' "$(DESTDIR)" "$(BINDIR)" 198 @printf ' and (if enabled) manpages from "%s%s"\n' "$(DESTDIR)" "$(MAN1DIR)" 199 @printf ' test runs the test suite\n' 200 @printf ' test_bc runs the bc test suite, if bc has been built\n' 201 @printf ' test_dc runs the dc test suite, if dc has been built\n' 202 @printf ' time_test runs the test suite, displaying times for some things\n' 203 @printf ' time_test_bc runs the bc test suite, displaying times for some things\n' 204 @printf ' time_test_dc runs the dc test suite, displaying times for some things\n' 205 @printf ' timeconst runs the test on the Linux timeconst.bc script,\n' 206 @printf ' if it exists and bc has been built\n' 207 @printf ' valgrind runs the test suite through valgrind\n' 208 @printf ' valgrind_bc runs the bc test suite, if bc has been built,\n' 209 @printf ' through valgrind\n' 210 @printf ' valgrind_dc runs the dc test suite, if dc has been built,\n' 211 @printf ' through valgrind\n' 212 213check: test 214 215test: test_bc timeconst test_dc 216 217test_bc: 218 %%BC_TEST%% 219 220test_dc: 221 %%DC_TEST%% 222 223time_test: time_test_bc timeconst time_test_dc 224 225time_test_bc: 226 %%BC_TIME_TEST%% 227 228time_test_dc: 229 %%DC_TIME_TEST%% 230 231timeconst: 232 %%TIMECONST%% 233 234valgrind: valgrind_bc valgrind_dc 235 236valgrind_bc: 237 %%VG_BC_TEST%% 238 239valgrind_dc: 240 %%VG_DC_TEST%% 241 242karatsuba: 243 %%KARATSUBA%% 244 245karatsuba_test: 246 %%KARATSUBA_TEST%% 247 248coverage:%%COVERAGE_PREREQS%% 249 %%COVERAGE%% 250 251version: 252 @printf '%s' "$(VERSION)" 253 254libcname: 255 @printf '%s' "$(BC_LIB_C)" 256 257extra_math: 258 @printf '%s' "$(BC_ENABLE_EXTRA_MATH)" 259 260manpages: 261 ronn $(RONN_ARGS) $(BC_RONN) 262 ronn $(RONN_ARGS) $(DC_RONN) 263 264clean_gen: 265 @$(RM) -f $(GEN_EXEC) 266 267clean:%%CLEAN_PREREQS%% 268 @printf 'Cleaning files...\n' 269 @$(RM) -f $(OBJ) 270 @$(RM) -f $(BC_OBJ) 271 @$(RM) -f $(DC_OBJ) 272 @$(RM) -f $(HISTORY_OBJ) 273 @$(RM) -f $(BC_EXEC) 274 @$(RM) -f $(DC_EXEC) 275 @$(RM) -fr $(BIN) 276 @$(RM) -f *.gcov 277 @$(RM) -f *.html 278 @$(RM) -f *.gcda *.gcno 279 @$(RM) -f *.profraw 280 @$(RM) -f $(LOCALES)/*.cat 281 @$(RM) -f $(BC_LIB_C) $(BC_LIB_O) 282 @$(RM) -f $(BC_LIB2_C) $(BC_LIB2_O) 283 @$(RM) -f $(BC_HELP_C) $(BC_HELP_O) 284 @$(RM) -f $(DC_HELP_C) $(DC_HELP_O) 285 286clean_config: clean 287 @printf 'Cleaning config...\n' 288 @$(RM) -f Makefile 289 290clean_tests: clean clean_config 291 @printf 'Cleaning test files...\n' 292 @$(RM) -f tests/bc/parse.txt tests/bc/parse_results.txt 293 @$(RM) -f tests/bc/print.txt tests/bc/print_results.txt 294 @$(RM) -f tests/bc/bessel.txt tests/bc/bessel_results.txt 295 @$(RM) -f tests/bc/scripts/bessel.txt 296 @$(RM) -f tests/bc/scripts/parse.txt 297 @$(RM) -f tests/bc/scripts/print.txt 298 @$(RM) -f tests/bc/scripts/add.txt 299 @$(RM) -f tests/bc/scripts/divide.txt 300 @$(RM) -f tests/bc/scripts/multiply.txt 301 @$(RM) -f tests/bc/scripts/subtract.txt 302 @$(RM) -f tests/dc/scripts/prime.txt tests/dc/scripts/stream.txt 303 @$(RM) -f .log_*.txt 304 @$(RM) -f .math.txt .results.txt .ops.txt 305 @$(RM) -f .test.txt 306 @$(RM) -f $(GCDA) $(GCNO) 307 @$(RM) -f $(BC_GCDA) $(BC_GCNO) 308 @$(RM) -f $(DC_GCDA) $(DC_GCNO) 309 @$(RM) -f $(HISTORY_GCDA) $(HISTORY_GCNO) 310 @$(RM) -f $(BC_LIB_GCDA) $(BC_LIB_GCNO) 311 @$(RM) -f $(BC_LIB2_GCDA) $(BC_LIB2_GCNO) 312 @$(RM) -f $(BC_HELP_GCDA) $(BC_HELP_GCNO) 313 @$(RM) -f $(DC_HELP_GCDA) $(DC_HELP_GCNO) 314 @$(RM) -f tags .gdbbreakpoints .gdb_history .gdbsetup 315 @$(RM) -f cscope.* 316 317install_locales: 318 $(LOCALE_INSTALL) $(NLSPATH) $(MAIN_EXEC) $(DESTDIR) 319 320install_bc_manpage: 321 $(SAFE_INSTALL) $(MANPAGE_INSTALL_ARGS) $(BC_MANPAGE) $(DESTDIR)$(MAN1DIR)/$(BC_MANPAGE_NAME) 322 323install_dc_manpage: 324 $(SAFE_INSTALL) $(MANPAGE_INSTALL_ARGS) $(DC_MANPAGE) $(DESTDIR)$(MAN1DIR)/$(DC_MANPAGE_NAME) 325 326install:%%INSTALL_LOCALES_PREREQS%%%%INSTALL_PREREQS%% 327 $(INSTALL) $(DESTDIR)$(BINDIR) "$(EXEC_SUFFIX)" 328 329uninstall_locales: 330 $(LOCALE_UNINSTALL) $(NLSPATH) $(MAIN_EXEC) $(DESTDIR) 331 332uninstall_bc_manpage: 333 $(RM) -f $(DESTDIR)$(MAN1DIR)/$(BC_MANPAGE_NAME) 334 335uninstall_bc: 336 $(RM) -f $(DESTDIR)$(BINDIR)/$(EXEC_PREFIX)$(BC)$(EXEC_SUFFIX) 337 338uninstall_dc_manpage: 339 $(RM) -f $(DESTDIR)$(MAN1DIR)/$(DC_MANPAGE_NAME) 340 341uninstall_dc: 342 $(RM) -f $(DESTDIR)$(BINDIR)/$(EXEC_PREFIX)$(DC)$(EXEC_SUFFIX) 343 344uninstall:%%UNINSTALL_LOCALES_PREREQS%%%%UNINSTALL_MAN_PREREQS%%%%UNINSTALL_PREREQS%% 345