-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.mb
156 lines (122 loc) · 4.09 KB
/
build.mb
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
; mb build file for mariebuild 0.4.0 or higher
; this file also serves as a lead example for how to use mariebuild.
sector config
section files
str obj 'obj/'
list str sources 'strlist', 'logging', 'types', 'executor', 'c_rule', 'target', 'build', 'main'
end
section mariebuild
u8 default_log_level 2
; mariebuild now supports incremental building. In this mode, a compilation rule
; is only executed if a file it executes upon is
str build_type 'incremental'
str cc 'clang'
; mcfg 2 has brought along a new list syntax, where each element is its own string
; and seperated by commas.
list str targets 'clean', 'debug', 'release'
str default 'debug'
end
end
; Mariebuild now works with targets defined in this sector.
; Each target can list other targets which it requires. Fields
; from the current target are accesible via %target%.
sector targets
section clean
str exec '#!/bin/bash
if [ -d $(/config/files/obj) ]; then
rm -rf $(/config/files/obj)
fi
mkdir $(/config/files/obj)
'
end
section depends
str exec '#!/bin/bash
if [[ lib/libmcfg_2.a -ot ./setup.bash ]]; then
./setup.bash
fi
'
end
section debug
; Any field defined within a target of which the name if prefixed with
; target_ is registered as a dynfield with the exact same name.
; (So this field can be used using $(%target_cflags%)
str target_cflags '-ggdb -Iinclude/ -Isrc/'
str target_ldflags ''
; Each target lists c_rules (or compilation rules) which are executed in order.
list str c_rules 'executable'
end
section release
str target_cflags '-Oz -Iinclude/ -Isrc/'
str target_ldflags ''
list str required_targets 'clean', 'depends'
list str c_rules 'executable', 'strip-executable'
end
section static-release
str target_cflags '-Oz -Iinclude/ -Isrc/'
str target_ldflags '-static'
list str required_targets 'clean', 'depends'
list str c_rules 'executable', 'strip-executable'
end
end
; Each compilation rule is defined within this sector. They can access Fields
; of the current target using %target%.
sector c_rules
section strip-executable
list str input ''
str input_format ''
str output_format ''
str exec '#!/bin/bash
STRIPFLAGS="--strip-all"
unameOut="\$(uname -s)"
case "${unameOut}" in
Darwin*) STRIPFLAGS="-S -X";;
esac
printf " strip $STRIPFLAGS ./mb\\n"
strip $STRIPFLAGS ./mb
'
end
section executable
; Compilation rules can list other compilation rules which they require
; These are executed in order.
list str c_rules 'main'
str binname 'mb'
str build_type 'full'
str exec_mode 'unify'
str input_src '/config/files/sources'
str input_format '$(/config/files/obj)$(%element%).o'
str output_format '$(binname)'
str ldflags '$(%target_ldflags%) -Llib/ -lmcfg_2 -lm'
; The command which is specified in the exec field is executed for each member of
; the list specified in exec_on
str exec '#!/bin/bash
unameOut="\$(uname -s)"
case "${unameOut}" in
Darwin*)
EXTRA_LDFLAGS="-L/usr/local/lib -largp"
printf " -> Linking for Darwin, EXTRA_LDFLAGS=$EXTRA_LDFLAGS\\n";;
esac
COMMAND="$(/config/mariebuild/cc) -o $(%output%) $(%input%) $(ldflags) $EXTRA_LDFLAGS"
printf " $COMMAND\\n"
$COMMAND
'
end
section main
; Run the 'exec' command for each input element.
str exec_mode 'singular'
str obj 'obj/'
str src 'src/'
; Declare our set of input elements. If no output list is defined,
; the input list is used for that as well.
str input_src '/config/files/sources'
str output_src '/config/files/sources'
; The input and output_format fields are used to determine if a output file
; is out of date. They are also used to generate the input and output dynfields
str input_format '$(src)$(%element%).c'
str output_format '$(obj)$(%element%).o'
str exec '#!/bin/bash
COMMAND="$(/config/mariebuild/cc) $(%target_cflags%) -c $(%input%) -o $(%output%)"
printf " $COMMAND\\n"
$COMMAND
'
end
end