xref: /freebsd/contrib/bc/build.rig (revision fdc4a7c8012b214986cfa2e2fb6d99731f004b1b)
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