blob: dc5d75b299ea7b7b5ecb516f508e4fe74015c19f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
# file : cli/buildfile
# license : MIT; see accompanying LICENSE file
import libs = libcutl%lib{cutl}
./: exe{cli}: cxx{cli} libue{cli}
# Target metadata, see also --build2-metadata in cli.cxx.
#
exe{cli}:
{
export.metadata = 1 cli
cli.name = [string] cli
cli.version = $version
cli.checksum = $version
}
hdr = {hxx ixx txx}{* -cli -version -options -*.test...}
src = cxx{* -cli -version -options -*.test...}
all_s = semantics/{hxx ixx txx cxx}{*}
all_t = traversal/{hxx ixx txx cxx}{*}
libue{cli}: $hdr $src $all_s $all_t {hxx}{version} $libs
hxx{version}: in{version} $src_root/manifest
# Build options (both bootstrap and final version).
#
cxx.poptions =+ "-I$out_root" "-I$src_root"
# Bootstrap.
#
# The plan is as follows:
#
# 1. Build the bootstrap version of cli using a copy of options.?xx saved in
# bootstrap/cli/.
#
# 2. Use that to re-generate options.?xx. If the result differs from the
# saved version, copy it over and fail the build, asking for a restart.
#
# 3. Otherwise, proceed to build the final version of cli.
#
if $config.cli.develop
{
libue{cli}: {hxx ixx cxx}{options}
bootstrap/
{
# This should only apply to the bootstrap build.
#
cxx.poptions =+ "-I$src_base" # Note: must come first.
cli/
{
# Note: semantics/ and traversal/ do not include options.hxx so we can
# share their object files.
#
exe{cli}: obj{cli $name($src) options} ../../{$all_s $all_t} $libs
for s: cli $name($src)
obj{$s}: ../../cxx{$s} $libs
obj{options}: {hxx ixx cxx}{options}
obj{cli}: cxx.poptions += -DCLI_BOOTSTRAP
}
}
<{hxx ixx cxx}{options}>: cli{options} bootstrap/cli/exe{cli}
{
options = --include-with-brackets --include-prefix cli \
--guard-prefix CLI --generate-file-scanner \
--generate-specifier --generate-modifier \
--suppress-undocumented --reserved-name stdout
# Symlink the generated code in src for convenience of development.
#
backlink = true
}
{{
diag cli ($<[0])
($<[1]) $options -o $out_base $path($<[0])
# If the result differs from the bootstrap version, copy it over and
# request the build restart.
#
if diff $src_base/bootstrap/cli/options.hxx $path($>[0]) >- && \
diff $src_base/bootstrap/cli/options.ixx $path($>[1]) >- && \
diff $src_base/bootstrap/cli/options.cxx $path($>[2]) >-
exit
end
cp $path($>[0]) $src_base/bootstrap/cli/options.hxx
cp $path($>[1]) $src_base/bootstrap/cli/options.ixx
cp $path($>[2]) $src_base/bootstrap/cli/options.cxx
exit "bootstrap options.?xx have changed, restart the build"
}}
}
else
{
# Use bootstrap options.?xx to build the final version of cli.
#
libue{cli}: bootstrap/cli/{hxx ixx cxx}{options}
cxx.poptions =+ "-I($src_base/bootstrap)" # Note: must come first.
./: cli{options} # Keep in distribution.
}
# Build options (final version only).
#
# Pass the copyright notice extracted from the LICENSE file.
#
obj{cli}: cxx.poptions += -DCLI_COPYRIGHT=\"$copyright\"
# Unit tests.
#
exe{*.test}:
{
test = true
install = false
}
for t: cxx{**.test...}
{
d = $directory($t)
n = $name($t)...
./: $d/exe{$n}: $t $d/{hxx ixx txx}{+$n} $d/testscript{+$n}
$d/exe{$n}: libue{cli}: bin.whole = false
}
|