1*fdc4a7c8SStefan Eßer/* 2*fdc4a7c8SStefan Eßer * ***************************************************************************** 3*fdc4a7c8SStefan Eßer * 4*fdc4a7c8SStefan Eßer * SPDX-License-Identifier: BSD-2-Clause 5*fdc4a7c8SStefan Eßer * 6*fdc4a7c8SStefan Eßer * Copyright (c) 2018-2025 Gavin D. Howard and contributors. 7*fdc4a7c8SStefan Eßer * 8*fdc4a7c8SStefan Eßer * Redistribution and use in source and binary forms, with or without 9*fdc4a7c8SStefan Eßer * modification, are permitted provided that the following conditions are met: 10*fdc4a7c8SStefan Eßer * 11*fdc4a7c8SStefan Eßer * * Redistributions of source code must retain the above copyright notice, this 12*fdc4a7c8SStefan Eßer * list of conditions and the following disclaimer. 13*fdc4a7c8SStefan Eßer * 14*fdc4a7c8SStefan Eßer * * Redistributions in binary form must reproduce the above copyright notice, 15*fdc4a7c8SStefan Eßer * this list of conditions and the following disclaimer in the documentation 16*fdc4a7c8SStefan Eßer * and/or other materials provided with the distribution. 17*fdc4a7c8SStefan Eßer * 18*fdc4a7c8SStefan Eßer * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*fdc4a7c8SStefan Eßer * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*fdc4a7c8SStefan Eßer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*fdc4a7c8SStefan Eßer * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*fdc4a7c8SStefan Eßer * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*fdc4a7c8SStefan Eßer * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*fdc4a7c8SStefan Eßer * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*fdc4a7c8SStefan Eßer * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*fdc4a7c8SStefan Eßer * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*fdc4a7c8SStefan Eßer * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*fdc4a7c8SStefan Eßer * POSSIBILITY OF SUCH DAMAGE. 29*fdc4a7c8SStefan Eßer * 30*fdc4a7c8SStefan Eßer * ***************************************************************************** 31*fdc4a7c8SStefan Eßer * 32*fdc4a7c8SStefan Eßer * The build script file. 33*fdc4a7c8SStefan Eßer * 34*fdc4a7c8SStefan Eßer */ 35*fdc4a7c8SStefan Eßer 36*fdc4a7c8SStefan Eßerif OS == "Windows" && bool(config["lto"]) 37*fdc4a7c8SStefan Eßer{ 38*fdc4a7c8SStefan Eßer error("Link-time optimization is not supported on Windows"); 39*fdc4a7c8SStefan Eßer} 40*fdc4a7c8SStefan Eßer 41*fdc4a7c8SStefan Eßerif LIBRARY_ENABLED == "0" 42*fdc4a7c8SStefan Eßer{ 43*fdc4a7c8SStefan Eßer if OS != "Windows" && NLS_ENABLED != "0" 44*fdc4a7c8SStefan Eßer { 45*fdc4a7c8SStefan Eßer io.eprint("Testing NLS...\n"); 46*fdc4a7c8SStefan Eßer 47*fdc4a7c8SStefan Eßer clang_flags: []str = 48*fdc4a7c8SStefan Eßer if CC contains "clang" 49*fdc4a7c8SStefan Eßer { 50*fdc4a7c8SStefan Eßer @[ "-Wno_unreachable-code" ]; 51*fdc4a7c8SStefan Eßer }; 52*fdc4a7c8SStefan Eßer 53*fdc4a7c8SStefan Eßer flags: []str = clang_flags +~ @[ 54*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_NLS=1", 55*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLED=" +~ BC_ENABLED, 56*fdc4a7c8SStefan Eßer DEFOPT +~ "DC_ENABLED=" +~ DC_ENABLED, 57*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_HISTORY=0", 58*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_LIBRARY=0", 59*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_AFL=0", 60*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_EXTRA_MATH=" +~ EXTRA_MATH_ENABLED, 61*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_OSSFUZZ=0", 62*fdc4a7c8SStefan Eßer DEFOPT +~ "_POSIX_C_SOURCE=200809L", 63*fdc4a7c8SStefan Eßer DEFOPT +~ "_XOPEN_SOURCE=700", 64*fdc4a7c8SStefan Eßer INCOPT, 65*fdc4a7c8SStefan Eßer ]; 66*fdc4a7c8SStefan Eßer 67*fdc4a7c8SStefan Eßer res := $ $CC %(flags) -c @(path.join(src_dir, "src/vm.c")) -E; 68*fdc4a7c8SStefan Eßer 69*fdc4a7c8SStefan Eßer if res.exitcode != 0 70*fdc4a7c8SStefan Eßer { 71*fdc4a7c8SStefan Eßer if FORCE 72*fdc4a7c8SStefan Eßer { 73*fdc4a7c8SStefan Eßer io.eprint("Forcing NLS...\n"); 74*fdc4a7c8SStefan Eßer } 75*fdc4a7c8SStefan Eßer else 76*fdc4a7c8SStefan Eßer { 77*fdc4a7c8SStefan Eßer error("NLS does not work\n"); 78*fdc4a7c8SStefan Eßer } 79*fdc4a7c8SStefan Eßer } 80*fdc4a7c8SStefan Eßer else 81*fdc4a7c8SStefan Eßer { 82*fdc4a7c8SStefan Eßer if path.isfile("vm.o") 83*fdc4a7c8SStefan Eßer { 84*fdc4a7c8SStefan Eßer path.rm("vm.o"); 85*fdc4a7c8SStefan Eßer } 86*fdc4a7c8SStefan Eßer 87*fdc4a7c8SStefan Eßer io.eprint("NLS works.\n\n"); 88*fdc4a7c8SStefan Eßer io.eprint("Testing gencat...\n"); 89*fdc4a7c8SStefan Eßer 90*fdc4a7c8SStefan Eßer res2 := $ gencat ./en_US.cat 91*fdc4a7c8SStefan Eßer @(path.join(src_dir, "locales/en_US.msg")); 92*fdc4a7c8SStefan Eßer 93*fdc4a7c8SStefan Eßer if res2.exitcode != 0 94*fdc4a7c8SStefan Eßer { 95*fdc4a7c8SStefan Eßer if FORCE 96*fdc4a7c8SStefan Eßer { 97*fdc4a7c8SStefan Eßer io.eprint("Forcing NLS...\n"); 98*fdc4a7c8SStefan Eßer } 99*fdc4a7c8SStefan Eßer else 100*fdc4a7c8SStefan Eßer { 101*fdc4a7c8SStefan Eßer error("gencat does not work\n"); 102*fdc4a7c8SStefan Eßer } 103*fdc4a7c8SStefan Eßer } 104*fdc4a7c8SStefan Eßer else 105*fdc4a7c8SStefan Eßer { 106*fdc4a7c8SStefan Eßer io.eprint("gencat works.\n\n"); 107*fdc4a7c8SStefan Eßer 108*fdc4a7c8SStefan Eßer if platform != host 109*fdc4a7c8SStefan Eßer { 110*fdc4a7c8SStefan Eßer error("Cross compiles will not work!\n\n"); 111*fdc4a7c8SStefan Eßer } 112*fdc4a7c8SStefan Eßer } 113*fdc4a7c8SStefan Eßer } 114*fdc4a7c8SStefan Eßer } 115*fdc4a7c8SStefan Eßer 116*fdc4a7c8SStefan Eßer if OS != "Windows" && sym(config["history"]) != @none 117*fdc4a7c8SStefan Eßer { 118*fdc4a7c8SStefan Eßer io.eprint("Testing history...\n"); 119*fdc4a7c8SStefan Eßer 120*fdc4a7c8SStefan Eßer flags: []str = @[ 121*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_HISTORY=1", 122*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLED=" +~ BC_ENABLED, 123*fdc4a7c8SStefan Eßer DEFOPT +~ "DC_ENABLED=" +~ DC_ENABLED, 124*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_NLS=" +~ NLS_ENABLED, 125*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_LIBRARY=0", 126*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_AFL=0", 127*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_EDITLINE=" +~ EDITLINE_ENABLED, 128*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_READLINE=" +~ READLINE_ENABLED, 129*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_EXTRA_MATH=" +~ EXTRA_MATH_ENABLED, 130*fdc4a7c8SStefan Eßer DEFOPT +~ "BC_ENABLE_OSSFUZZ=0", 131*fdc4a7c8SStefan Eßer DEFOPT +~ "_POSIX_C_SOURCE=200809L", 132*fdc4a7c8SStefan Eßer DEFOPT +~ "_XOPEN_SOURCE=700", 133*fdc4a7c8SStefan Eßer INCOPT, 134*fdc4a7c8SStefan Eßer ]; 135*fdc4a7c8SStefan Eßer 136*fdc4a7c8SStefan Eßer res := $ $CC %(flags) -c @(path.join(src_dir, "src/history.c")) -E; 137*fdc4a7c8SStefan Eßer 138*fdc4a7c8SStefan Eßer if res.exitcode != 0 139*fdc4a7c8SStefan Eßer { 140*fdc4a7c8SStefan Eßer if FORCE 141*fdc4a7c8SStefan Eßer { 142*fdc4a7c8SStefan Eßer io.eprint("Forcing history...\n"); 143*fdc4a7c8SStefan Eßer } 144*fdc4a7c8SStefan Eßer else 145*fdc4a7c8SStefan Eßer { 146*fdc4a7c8SStefan Eßer error("History does not work\n"); 147*fdc4a7c8SStefan Eßer } 148*fdc4a7c8SStefan Eßer } 149*fdc4a7c8SStefan Eßer else 150*fdc4a7c8SStefan Eßer { 151*fdc4a7c8SStefan Eßer if path.isfile("history.o") 152*fdc4a7c8SStefan Eßer { 153*fdc4a7c8SStefan Eßer path.rm("history.o"); 154*fdc4a7c8SStefan Eßer } 155*fdc4a7c8SStefan Eßer 156*fdc4a7c8SStefan Eßer io.eprint("History works.\n\n"); 157*fdc4a7c8SStefan Eßer } 158*fdc4a7c8SStefan Eßer } 159*fdc4a7c8SStefan Eßer} 160*fdc4a7c8SStefan Eßer 161*fdc4a7c8SStefan Eßerfreebsd_flags: []str = 162*fdc4a7c8SStefan Eßerif OS != "FreeBSD" 163*fdc4a7c8SStefan Eßer{ 164*fdc4a7c8SStefan Eßer @[ DEFOPT +~ "_POSIX_C_SOURCE=200809L", DEFOPT +~ "_XOPEN_SOURCE=700" ]; 165*fdc4a7c8SStefan Eßer}; 166*fdc4a7c8SStefan Eßer 167*fdc4a7c8SStefan Eßermacos: bool = (OS == "Darwin"); 168*fdc4a7c8SStefan Eßer 169*fdc4a7c8SStefan Eßermacos_flags: []str = 170*fdc4a7c8SStefan Eßerif macos 171*fdc4a7c8SStefan Eßer{ 172*fdc4a7c8SStefan Eßer @[ DEFOPT +~ "_DARWIN_C_SOURCE" ]; 173*fdc4a7c8SStefan Eßer}; 174*fdc4a7c8SStefan Eßer 175*fdc4a7c8SStefan Eßeropenbsd_flags: []str = 176*fdc4a7c8SStefan Eßerif OS == "OpenBSD" 177*fdc4a7c8SStefan Eßer{ 178*fdc4a7c8SStefan Eßer if READLINE_ENABLED != "0" 179*fdc4a7c8SStefan Eßer { 180*fdc4a7c8SStefan Eßer error("Cannot use readline on OpenBSD"); 181*fdc4a7c8SStefan Eßer } 182*fdc4a7c8SStefan Eßer 183*fdc4a7c8SStefan Eßer @[ DEFOPT +~ "_BSD_SOURCE" ]; 184*fdc4a7c8SStefan Eßer}; 185*fdc4a7c8SStefan Eßer 186*fdc4a7c8SStefan Eßerstrip_flag: []str = 187*fdc4a7c8SStefan Eßerif OS != "Windows" && !bool(config["debug"]) && !macos && bool(config["strip"]) 188*fdc4a7c8SStefan Eßer{ 189*fdc4a7c8SStefan Eßer @[ "-s" ]; 190*fdc4a7c8SStefan Eßer}; 191*fdc4a7c8SStefan Eßer 192*fdc4a7c8SStefan Eßerlto_flag: []str = 193*fdc4a7c8SStefan Eßerif bool(config["lto"]) 194*fdc4a7c8SStefan Eßer{ 195*fdc4a7c8SStefan Eßer @[ "-flto" ]; 196*fdc4a7c8SStefan Eßer}; 197*fdc4a7c8SStefan Eßer 198*fdc4a7c8SStefan Eßerstrict_flags: []str = 199*fdc4a7c8SStefan Eßerif bool(config["strict"]) 200*fdc4a7c8SStefan Eßer{ 201*fdc4a7c8SStefan Eßer // Strict build only works for GCC and Clang, so we do want to set that 202*fdc4a7c8SStefan Eßer // here. 203*fdc4a7c8SStefan Eßer if CC contains "gcc" || CC contains "clang" 204*fdc4a7c8SStefan Eßer { 205*fdc4a7c8SStefan Eßer // These are the standard strict build flags for both compilers. 206*fdc4a7c8SStefan Eßer std_strict: []str = @[ "-Wall", "-Wextra", "-Werror", "-pedantic" ]; 207*fdc4a7c8SStefan Eßer 208*fdc4a7c8SStefan Eßer // Clang has -Weverything, which I ensure Yc builds under. 209*fdc4a7c8SStefan Eßer // 210*fdc4a7c8SStefan Eßer // I also want unlimited errors because Clang is my development 211*fdc4a7c8SStefan Eßer // compiler; it caps at 20 by default. 212*fdc4a7c8SStefan Eßer compiler_strict: []str = 213*fdc4a7c8SStefan Eßer if CC contains "clang" 214*fdc4a7c8SStefan Eßer { 215*fdc4a7c8SStefan Eßer // Oh, and add the standard. 216*fdc4a7c8SStefan Eßer @[ "-Weverything", "-ferror-limit=100000", "-Wno-padded", 217*fdc4a7c8SStefan Eßer "-Wno-unknown-warning-option", "-Wno-unsafe-buffer-usage", 218*fdc4a7c8SStefan Eßer "-Wno-documentation-unknown-command", "-Wno-pre-c11-compat", 219*fdc4a7c8SStefan Eßer "-Wno-enum-enum-conversion", "-Wno-switch-default" ]; 220*fdc4a7c8SStefan Eßer }; 221*fdc4a7c8SStefan Eßer 222*fdc4a7c8SStefan Eßer // Return the combination of the sets. 223*fdc4a7c8SStefan Eßer std_strict +~ compiler_strict; 224*fdc4a7c8SStefan Eßer } 225*fdc4a7c8SStefan Eßer else if OS == "Windows" 226*fdc4a7c8SStefan Eßer { 227*fdc4a7c8SStefan Eßer // Return the combo of the strict options, the standard, and the 228*fdc4a7c8SStefan Eßer // sanitizer defines. 229*fdc4a7c8SStefan Eßer @[ "/W4", "/WX", "/wd\"4996\"", "/permissive-" ]; 230*fdc4a7c8SStefan Eßer } 231*fdc4a7c8SStefan Eßer}; 232*fdc4a7c8SStefan Eßer 233*fdc4a7c8SStefan Eßerversion_contents: str = io.read_file(path.join(src_dir, "VERSION.txt")); 234*fdc4a7c8SStefan Eßerversion_lines: []str = version_contents.split("\n"); 235*fdc4a7c8SStefan Eßerversion: str = version_lines[0]; 236*fdc4a7c8SStefan Eßer 237*fdc4a7c8SStefan Eßerversion_flag: []str = @[ DEFOPT +~ "VERSION=" +~ version ]; 238*fdc4a7c8SStefan Eßer 239*fdc4a7c8SStefan Eßerother_flags: []str = freebsd_flags +~ macos_flags +~ openbsd_flags +~ 240*fdc4a7c8SStefan Eßer lto_flag +~ strict_flags +~ version_flag +~ 241*fdc4a7c8SStefan Eßerif bool(config["debug"]) 242*fdc4a7c8SStefan Eßer{ 243*fdc4a7c8SStefan Eßer @[ compiler_db["opt.debug"] ]; 244*fdc4a7c8SStefan Eßer}; 245*fdc4a7c8SStefan Eßer 246*fdc4a7c8SStefan Eßerhistory_files: []str = 247*fdc4a7c8SStefan Eßerif HISTORY != @none 248*fdc4a7c8SStefan Eßer{ 249*fdc4a7c8SStefan Eßer HISTORY_C_FILES; 250*fdc4a7c8SStefan Eßer}; 251*fdc4a7c8SStefan Eßer 252*fdc4a7c8SStefan Eßerc_files: []str = 253*fdc4a7c8SStefan Eßerif BUILD_MODE == @both 254*fdc4a7c8SStefan Eßer{ 255*fdc4a7c8SStefan Eßer COMMON_C_FILES +~ EXEC_C_FILES +~ BC_C_FILES +~ DC_C_FILES +~ history_files; 256*fdc4a7c8SStefan Eßer} 257*fdc4a7c8SStefan Eßerelse if BUILD_MODE == @bc 258*fdc4a7c8SStefan Eßer{ 259*fdc4a7c8SStefan Eßer COMMON_C_FILES +~ EXEC_C_FILES +~ BC_C_FILES +~ history_files; 260*fdc4a7c8SStefan Eßer} 261*fdc4a7c8SStefan Eßerelse if BUILD_MODE == @dc 262*fdc4a7c8SStefan Eßer{ 263*fdc4a7c8SStefan Eßer COMMON_C_FILES +~ EXEC_C_FILES +~ DC_C_FILES +~ history_files; 264*fdc4a7c8SStefan Eßer} 265*fdc4a7c8SStefan Eßerelse 266*fdc4a7c8SStefan Eßer{ 267*fdc4a7c8SStefan Eßer COMMON_C_FILES +~ LIBRARY_C_FILES; 268*fdc4a7c8SStefan Eßer}; 269*fdc4a7c8SStefan Eßer 270*fdc4a7c8SStefan Eßerbuild_config: Gaml = @(gaml){ 271*fdc4a7c8SStefan Eßer other_cflags: $other_flags 272*fdc4a7c8SStefan Eßer strip_flag: $strip_flag 273*fdc4a7c8SStefan Eßer}; 274*fdc4a7c8SStefan Eßer 275*fdc4a7c8SStefan Eßertargets: []str = 276*fdc4a7c8SStefan Eßerpush build_config: config_stack 277*fdc4a7c8SStefan Eßer{ 278*fdc4a7c8SStefan Eßer gen_o_files: []str = 279*fdc4a7c8SStefan Eßer if BUILD_MODE != @library 280*fdc4a7c8SStefan Eßer { 281*fdc4a7c8SStefan Eßer @[ 282*fdc4a7c8SStefan Eßer txt2o("gen/lib.bc", "bc_lib", "bc_lib_name", "BC_ENABLED", true), 283*fdc4a7c8SStefan Eßer txt2o("gen/lib2.bc", "bc_lib2", "bc_lib2_name", 284*fdc4a7c8SStefan Eßer "BC_ENABLED && BC_ENABLE_EXTRA_MATH", true), 285*fdc4a7c8SStefan Eßer txt2o("gen/bc_help.txt", "bc_help", "", "BC_ENABLED", false), 286*fdc4a7c8SStefan Eßer txt2o("gen/dc_help.txt", "dc_help", "", "DC_ENABLED", false), 287*fdc4a7c8SStefan Eßer ]; 288*fdc4a7c8SStefan Eßer }; 289*fdc4a7c8SStefan Eßer 290*fdc4a7c8SStefan Eßer obj_files: []str = gen_o_files +~ 291*fdc4a7c8SStefan Eßer for f: c_files 292*fdc4a7c8SStefan Eßer { 293*fdc4a7c8SStefan Eßer c2o(f); 294*fdc4a7c8SStefan Eßer }; 295*fdc4a7c8SStefan Eßer 296*fdc4a7c8SStefan Eßer if BUILD_MODE == @both || BUILD_MODE == @bc 297*fdc4a7c8SStefan Eßer { 298*fdc4a7c8SStefan Eßer if OS != "Windows" && bool(config["install_manpages"]) 299*fdc4a7c8SStefan Eßer { 300*fdc4a7c8SStefan Eßer src: str = path.join("manuals/bc", BUILD_TYPE +~ ".1"); 301*fdc4a7c8SStefan Eßer 302*fdc4a7c8SStefan Eßer target BC_MANPAGE: src 303*fdc4a7c8SStefan Eßer { 304*fdc4a7c8SStefan Eßer $ cp -f @(file_dep) @(tgt); 305*fdc4a7c8SStefan Eßer } 306*fdc4a7c8SStefan Eßer } 307*fdc4a7c8SStefan Eßer 308*fdc4a7c8SStefan Eßer exe(BC_BIN, obj_files); 309*fdc4a7c8SStefan Eßer } 310*fdc4a7c8SStefan Eßer 311*fdc4a7c8SStefan Eßer if BUILD_MODE == @both || BUILD_MODE == @dc 312*fdc4a7c8SStefan Eßer { 313*fdc4a7c8SStefan Eßer if OS != "Windows" && bool(config["install_manpages"]) 314*fdc4a7c8SStefan Eßer { 315*fdc4a7c8SStefan Eßer src: str = path.join("manuals/dc", BUILD_TYPE +~ ".1"); 316*fdc4a7c8SStefan Eßer 317*fdc4a7c8SStefan Eßer target DC_MANPAGE: src 318*fdc4a7c8SStefan Eßer { 319*fdc4a7c8SStefan Eßer $ cp -f @(file_dep) @(tgt); 320*fdc4a7c8SStefan Eßer } 321*fdc4a7c8SStefan Eßer } 322*fdc4a7c8SStefan Eßer 323*fdc4a7c8SStefan Eßer if BUILD_MODE == @both 324*fdc4a7c8SStefan Eßer { 325*fdc4a7c8SStefan Eßer ln(DC_BIN, BC_BIN); 326*fdc4a7c8SStefan Eßer } 327*fdc4a7c8SStefan Eßer else 328*fdc4a7c8SStefan Eßer { 329*fdc4a7c8SStefan Eßer exe(DC_BIN, obj_files); 330*fdc4a7c8SStefan Eßer } 331*fdc4a7c8SStefan Eßer } 332*fdc4a7c8SStefan Eßer 333*fdc4a7c8SStefan Eßer if BUILD_MODE == @library 334*fdc4a7c8SStefan Eßer { 335*fdc4a7c8SStefan Eßer lib(LIBRARY, obj_files); 336*fdc4a7c8SStefan Eßer } 337*fdc4a7c8SStefan Eßer 338*fdc4a7c8SStefan Eßer if BUILD_MODE == @both 339*fdc4a7c8SStefan Eßer { 340*fdc4a7c8SStefan Eßer @[ BC_BIN, DC_BIN ]; 341*fdc4a7c8SStefan Eßer } 342*fdc4a7c8SStefan Eßer else if BUILD_MODE == @bc 343*fdc4a7c8SStefan Eßer { 344*fdc4a7c8SStefan Eßer @[ DC_BIN ]; 345*fdc4a7c8SStefan Eßer } 346*fdc4a7c8SStefan Eßer else if BUILD_MODE == @dc 347*fdc4a7c8SStefan Eßer { 348*fdc4a7c8SStefan Eßer @[ DC_BIN ]; 349*fdc4a7c8SStefan Eßer } 350*fdc4a7c8SStefan Eßer else 351*fdc4a7c8SStefan Eßer { 352*fdc4a7c8SStefan Eßer includedir: str = get_includedir(); 353*fdc4a7c8SStefan Eßer libdir: str = get_libdir(); 354*fdc4a7c8SStefan Eßer 355*fdc4a7c8SStefan Eßer pc_config: Gaml = @(gaml){ 356*fdc4a7c8SStefan Eßer INCLUDEDIR: $includedir 357*fdc4a7c8SStefan Eßer LIBDIR: $libdir 358*fdc4a7c8SStefan Eßer VERSION: $version 359*fdc4a7c8SStefan Eßer }; 360*fdc4a7c8SStefan Eßer 361*fdc4a7c8SStefan Eßer push pc_config: config_stack 362*fdc4a7c8SStefan Eßer { 363*fdc4a7c8SStefan Eßer target PC_FILE: PC_FILE +~ ".in" 364*fdc4a7c8SStefan Eßer { 365*fdc4a7c8SStefan Eßer configure_file(file_dep, tgt, "%%"); 366*fdc4a7c8SStefan Eßer } 367*fdc4a7c8SStefan Eßer } 368*fdc4a7c8SStefan Eßer 369*fdc4a7c8SStefan Eßer @[ LIBRARY, PC_FILE ]; 370*fdc4a7c8SStefan Eßer } 371*fdc4a7c8SStefan Eßer}; 372*fdc4a7c8SStefan Eßer 373*fdc4a7c8SStefan Eßerif OS != "Windows" 374*fdc4a7c8SStefan Eßer{ 375*fdc4a7c8SStefan Eßer if LIBRARY_ENABLED == "0" 376*fdc4a7c8SStefan Eßer { 377*fdc4a7c8SStefan Eßer target @install: targets 378*fdc4a7c8SStefan Eßer { 379*fdc4a7c8SStefan Eßer bindir: str = get_bindir(); 380*fdc4a7c8SStefan Eßer 381*fdc4a7c8SStefan Eßer if BC_ENABLED != "0" 382*fdc4a7c8SStefan Eßer { 383*fdc4a7c8SStefan Eßer $ $SAFE_INSTALL $EXEC_INSTALL_MODE $BC_BIN 384*fdc4a7c8SStefan Eßer @(path.join(bindir, BC_BIN)); 385*fdc4a7c8SStefan Eßer } 386*fdc4a7c8SStefan Eßer 387*fdc4a7c8SStefan Eßer if DC_ENABLED != "0" 388*fdc4a7c8SStefan Eßer { 389*fdc4a7c8SStefan Eßer if BC_ENABLED != "0" 390*fdc4a7c8SStefan Eßer { 391*fdc4a7c8SStefan Eßer $ ln -sf @("./" +~ BC_BIN) @(path.join(bindir, DC_BIN)); 392*fdc4a7c8SStefan Eßer } 393*fdc4a7c8SStefan Eßer else 394*fdc4a7c8SStefan Eßer { 395*fdc4a7c8SStefan Eßer $ $SAFE_INSTALL $EXEC_INSTALL_MODE $BC_BIN 396*fdc4a7c8SStefan Eßer @(path.join(bindir, BC_BIN)); 397*fdc4a7c8SStefan Eßer } 398*fdc4a7c8SStefan Eßer } 399*fdc4a7c8SStefan Eßer 400*fdc4a7c8SStefan Eßer if NLS_ENABLED != "0" 401*fdc4a7c8SStefan Eßer { 402*fdc4a7c8SStefan Eßer locale_install_args: []str = 403*fdc4a7c8SStefan Eßer if sym(config["locales"]) == @all 404*fdc4a7c8SStefan Eßer { 405*fdc4a7c8SStefan Eßer @[ "-l" ]; 406*fdc4a7c8SStefan Eßer }; 407*fdc4a7c8SStefan Eßer 408*fdc4a7c8SStefan Eßer if DESTDIR != "" 409*fdc4a7c8SStefan Eßer { 410*fdc4a7c8SStefan Eßer $ @(path.join(src_dir, "scripts/locale_install.sh")) 411*fdc4a7c8SStefan Eßer %(locale_install_args) @(str(config["nlspath"])) 412*fdc4a7c8SStefan Eßer $MAINEXEC $DESTDIR; 413*fdc4a7c8SStefan Eßer } 414*fdc4a7c8SStefan Eßer else 415*fdc4a7c8SStefan Eßer { 416*fdc4a7c8SStefan Eßer $ @(path.join(src_dir, "scripts/locale_install.sh")) 417*fdc4a7c8SStefan Eßer %(locale_install_args) @(str(config["nlspath"])) 418*fdc4a7c8SStefan Eßer $MAINEXEC; 419*fdc4a7c8SStefan Eßer } 420*fdc4a7c8SStefan Eßer } 421*fdc4a7c8SStefan Eßer 422*fdc4a7c8SStefan Eßer if bool(config["install_manpages"]) 423*fdc4a7c8SStefan Eßer { 424*fdc4a7c8SStefan Eßer man1dir: str = get_man1dir(); 425*fdc4a7c8SStefan Eßer 426*fdc4a7c8SStefan Eßer if BC_ENABLED != "0" 427*fdc4a7c8SStefan Eßer { 428*fdc4a7c8SStefan Eßer $ rm -rf @(path.join(man1dir, BC_MANPAGE)); 429*fdc4a7c8SStefan Eßer } 430*fdc4a7c8SStefan Eßer 431*fdc4a7c8SStefan Eßer if DC_ENABLED != "0" 432*fdc4a7c8SStefan Eßer { 433*fdc4a7c8SStefan Eßer $ rm -rf @(path.join(man1dir, DC_MANPAGE)); 434*fdc4a7c8SStefan Eßer } 435*fdc4a7c8SStefan Eßer } 436*fdc4a7c8SStefan Eßer } 437*fdc4a7c8SStefan Eßer 438*fdc4a7c8SStefan Eßer target @uninstall 439*fdc4a7c8SStefan Eßer { 440*fdc4a7c8SStefan Eßer bindir: str = get_bindir(); 441*fdc4a7c8SStefan Eßer 442*fdc4a7c8SStefan Eßer if BC_ENABLED != "0" 443*fdc4a7c8SStefan Eßer { 444*fdc4a7c8SStefan Eßer $ rm -rf @(path.join(bindir, BC_BIN)); 445*fdc4a7c8SStefan Eßer } 446*fdc4a7c8SStefan Eßer 447*fdc4a7c8SStefan Eßer if DC_ENABLED != "0" 448*fdc4a7c8SStefan Eßer { 449*fdc4a7c8SStefan Eßer $ rm -rf @(path.join(bindir, DC_BIN)); 450*fdc4a7c8SStefan Eßer } 451*fdc4a7c8SStefan Eßer 452*fdc4a7c8SStefan Eßer if NLS_ENABLED != "0" 453*fdc4a7c8SStefan Eßer { 454*fdc4a7c8SStefan Eßer if DESTDIR != "" 455*fdc4a7c8SStefan Eßer { 456*fdc4a7c8SStefan Eßer $ @(path.join(src_dir, "scripts/locale_uninstall.sh")) 457*fdc4a7c8SStefan Eßer @(str(config["nlspath"])) $MAINEXEC $DESTDIR; 458*fdc4a7c8SStefan Eßer } 459*fdc4a7c8SStefan Eßer else 460*fdc4a7c8SStefan Eßer { 461*fdc4a7c8SStefan Eßer $ @(path.join(src_dir, "scripts/locale_uninstall.sh")) 462*fdc4a7c8SStefan Eßer @(str(config["nlspath"])) $MAINEXEC; 463*fdc4a7c8SStefan Eßer } 464*fdc4a7c8SStefan Eßer } 465*fdc4a7c8SStefan Eßer 466*fdc4a7c8SStefan Eßer if bool(config["install_manpages"]) 467*fdc4a7c8SStefan Eßer { 468*fdc4a7c8SStefan Eßer man1dir: str = get_man1dir(); 469*fdc4a7c8SStefan Eßer $ rm -rf @(path.join(man1dir, BC_MANPAGE)) 470*fdc4a7c8SStefan Eßer @(path.join(man1dir, DC_MANPAGE)); 471*fdc4a7c8SStefan Eßer } 472*fdc4a7c8SStefan Eßer } 473*fdc4a7c8SStefan Eßer } 474*fdc4a7c8SStefan Eßer else 475*fdc4a7c8SStefan Eßer { 476*fdc4a7c8SStefan Eßer target @install: targets, BCL_HEADER_PATH 477*fdc4a7c8SStefan Eßer { 478*fdc4a7c8SStefan Eßer full_libdir: str = get_libdir(); 479*fdc4a7c8SStefan Eßer 480*fdc4a7c8SStefan Eßer $ $SAFE_INSTALL $EXEC_INSTALL_MODE @(file_dep) 481*fdc4a7c8SStefan Eßer @(path.join(full_libdir, file_dep)); 482*fdc4a7c8SStefan Eßer 483*fdc4a7c8SStefan Eßer full_pc_path: str = get_pc_path(); 484*fdc4a7c8SStefan Eßer bcl_pc: str = file_deps[1]; 485*fdc4a7c8SStefan Eßer 486*fdc4a7c8SStefan Eßer $ $SAFE_INSTALL $MANPAGE_INSTALL_MODE $bcl_pc 487*fdc4a7c8SStefan Eßer @(path.join(full_pc_path, bcl_pc)); 488*fdc4a7c8SStefan Eßer 489*fdc4a7c8SStefan Eßer full_includedir: str = get_includedir(); 490*fdc4a7c8SStefan Eßer 491*fdc4a7c8SStefan Eßer $ $SAFE_INSTALL $MANPAGE_INSTALL_MODE @(file_deps[2]) 492*fdc4a7c8SStefan Eßer @(path.join(full_includedir, BCL_HEADER)); 493*fdc4a7c8SStefan Eßer 494*fdc4a7c8SStefan Eßer if bool(config["install_manpages"]) 495*fdc4a7c8SStefan Eßer { 496*fdc4a7c8SStefan Eßer $ $SAFE_INSTALL $MANPAGE_INSTALL_MODE 497*fdc4a7c8SStefan Eßer @(path.join(src_dir, path.join("manuals", BCL_MANPAGE))) 498*fdc4a7c8SStefan Eßer @(path.join(get_man3dir(), BCL_MANPAGE)); 499*fdc4a7c8SStefan Eßer } 500*fdc4a7c8SStefan Eßer } 501*fdc4a7c8SStefan Eßer 502*fdc4a7c8SStefan Eßer target @uninstall 503*fdc4a7c8SStefan Eßer { 504*fdc4a7c8SStefan Eßer $ rm -rf @(path.join(get_libdir(), LIBRARY)) 505*fdc4a7c8SStefan Eßer @(path.join(get_pc_path(), PC_FILE)) 506*fdc4a7c8SStefan Eßer @(path.join(get_includedir(), BCL_HEADER)); 507*fdc4a7c8SStefan Eßer 508*fdc4a7c8SStefan Eßer if bool(config["install_manpages"]) 509*fdc4a7c8SStefan Eßer { 510*fdc4a7c8SStefan Eßer $ rm -rf @(path.join(get_man3dir(), BCL_MANPAGE)); 511*fdc4a7c8SStefan Eßer } 512*fdc4a7c8SStefan Eßer } 513*fdc4a7c8SStefan Eßer } 514*fdc4a7c8SStefan Eßer} 515*fdc4a7c8SStefan Eßer 516*fdc4a7c8SStefan Eßer// If the platform matches the host, we can run the test suite. 517*fdc4a7c8SStefan Eßerif platform == host 518*fdc4a7c8SStefan Eßer{ 519*fdc4a7c8SStefan Eßer // If we have the library, build and run that test. 520*fdc4a7c8SStefan Eßer if BUILD_MODE == @library 521*fdc4a7c8SStefan Eßer { 522*fdc4a7c8SStefan Eßer libtesto: str = c2o("tests/bcl.c"); 523*fdc4a7c8SStefan Eßer 524*fdc4a7c8SStefan Eßer libtest: str = "bcl"; 525*fdc4a7c8SStefan Eßer 526*fdc4a7c8SStefan Eßer exe(libtest, @[ libtesto, targets[0] ]); 527*fdc4a7c8SStefan Eßer 528*fdc4a7c8SStefan Eßer test @bcl: libtest 529*fdc4a7c8SStefan Eßer { 530*fdc4a7c8SStefan Eßer $ @(str(tgt_name)); 531*fdc4a7c8SStefan Eßer } 532*fdc4a7c8SStefan Eßer } 533*fdc4a7c8SStefan Eßer else 534*fdc4a7c8SStefan Eßer { 535*fdc4a7c8SStefan Eßer if BUILD_MODE != @dc 536*fdc4a7c8SStefan Eßer { 537*fdc4a7c8SStefan Eßer exe_tests("bc"); 538*fdc4a7c8SStefan Eßer } 539*fdc4a7c8SStefan Eßer 540*fdc4a7c8SStefan Eßer if BUILD_MODE != @bc 541*fdc4a7c8SStefan Eßer { 542*fdc4a7c8SStefan Eßer exe_tests("dc"); 543*fdc4a7c8SStefan Eßer } 544*fdc4a7c8SStefan Eßer 545*fdc4a7c8SStefan Eßer target @clean_tests 546*fdc4a7c8SStefan Eßer { 547*fdc4a7c8SStefan Eßer for f: path.find_ext(build_dir, "txt") 548*fdc4a7c8SStefan Eßer { 549*fdc4a7c8SStefan Eßer path.rm(f); 550*fdc4a7c8SStefan Eßer } 551*fdc4a7c8SStefan Eßer } 552*fdc4a7c8SStefan Eßer } 553*fdc4a7c8SStefan Eßer} 554*fdc4a7c8SStefan Eßer 555*fdc4a7c8SStefan Eßertarget "bitfuncgen" 556*fdc4a7c8SStefan Eßer{ 557*fdc4a7c8SStefan Eßer error("TODO: Make this"); 558*fdc4a7c8SStefan Eßer} 559*fdc4a7c8SStefan Eßer 560*fdc4a7c8SStefan Eßertarget @bitfuncgen: "bitfuncgen" 561*fdc4a7c8SStefan Eßer{ 562*fdc4a7c8SStefan Eßer error("TODO: Make this"); 563*fdc4a7c8SStefan Eßer} 564*fdc4a7c8SStefan Eßer 565*fdc4a7c8SStefan Eßertarget "ministat" 566*fdc4a7c8SStefan Eßer{ 567*fdc4a7c8SStefan Eßer error("TODO: Make this"); 568*fdc4a7c8SStefan Eßer} 569*fdc4a7c8SStefan Eßer 570*fdc4a7c8SStefan Eßertarget @ministat: "ministat" 571*fdc4a7c8SStefan Eßer{ 572*fdc4a7c8SStefan Eßer error("TODO: Make this"); 573*fdc4a7c8SStefan Eßer} 574*fdc4a7c8SStefan Eßer 575*fdc4a7c8SStefan Eßertarget @all: targets; 576