swissChili | 0fc3f26 | 2021-08-09 22:05:17 -0700 | [diff] [blame] | 1 | # Rewrite of JMK in TCL |
2 | |||||
3 | variable jmk_name {} | ||||
4 | variable jmk_target {} | ||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 5 | variable jmk_clean_libs {} |
6 | variable jmk_phony_libs {} | ||||
7 | variable jmk_lib_paths | ||||
8 | variable jmk_lib_targets | ||||
9 | |||||
swissChili | 9b46c90 | 2022-07-10 15:48:46 -0700 | [diff] [blame^] | 10 | variable jmk_sourced |
11 | |||||
swissChili | 0fc3f26 | 2021-08-09 22:05:17 -0700 | [diff] [blame] | 12 | variable cflags {} |
13 | variable asmflags {} | ||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 14 | variable ldflags {} |
swissChili | 0fc3f26 | 2021-08-09 22:05:17 -0700 | [diff] [blame] | 15 | |
16 | variable asm as | ||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 17 | variable cc gcc |
18 | variable ld ld | ||||
19 | |||||
20 | variable objs {} | ||||
swissChili | 0fc3f26 | 2021-08-09 22:05:17 -0700 | [diff] [blame] | 21 | |
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 22 | # variable options |
23 | |||||
24 | variable src \$^ | ||||
25 | variable first_src \$< | ||||
26 | variable target \$@ | ||||
swissChili | 0fc3f26 | 2021-08-09 22:05:17 -0700 | [diff] [blame] | 27 | |
28 | proc init {name {target {DEFAULT_TARGET}}} { | ||||
29 | if {$target eq {DEFAULT_TARGET}} { | ||||
30 | set target $name | ||||
31 | } | ||||
32 | |||||
33 | global jmk_name | ||||
34 | global jmk_target | ||||
35 | |||||
36 | set jmk_name $name | ||||
37 | set jmk_target $target | ||||
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 38 | |
39 | puts {MAKEFILE_DEPTH ?= 1} | ||||
40 | |||||
41 | rule all $target {} | ||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 42 | |
43 | rule Makefile Jmk2 { | ||||
44 | log JMK2 "" | ||||
45 | shell "cd $::jmk_build_dir && $::jmk_build_cmd" | ||||
46 | } | ||||
swissChili | 0fc3f26 | 2021-08-09 22:05:17 -0700 | [diff] [blame] | 47 | } |
48 | |||||
49 | proc preset {p} { | ||||
50 | ::preset::$p | ||||
51 | } | ||||
52 | |||||
53 | proc presets {args} { | ||||
54 | foreach arg $args { | ||||
55 | preset $arg | ||||
56 | } | ||||
57 | } | ||||
58 | |||||
59 | proc cflag {arg} { | ||||
60 | global cflags | ||||
61 | set cflags "$cflags $arg" | ||||
62 | } | ||||
63 | |||||
64 | proc cflags {args} { | ||||
65 | foreach arg $args { | ||||
66 | cflag $arg | ||||
67 | } | ||||
68 | } | ||||
69 | |||||
70 | proc asmflag {arg} { | ||||
71 | global asmflags | ||||
72 | set asmflags "$asmflags $arg" | ||||
73 | } | ||||
74 | |||||
75 | proc asmflags {args} { | ||||
76 | foreach arg $args { | ||||
77 | asmflag $arg | ||||
78 | } | ||||
79 | } | ||||
80 | |||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 81 | proc ldflag {arg} { |
82 | global ldflags | ||||
83 | set ldflags "$ldflags $arg" | ||||
84 | } | ||||
85 | |||||
86 | proc ldflags {args} { | ||||
87 | foreach arg $args { | ||||
88 | ldflag $arg | ||||
89 | } | ||||
90 | } | ||||
91 | |||||
swissChili | 0fc3f26 | 2021-08-09 22:05:17 -0700 | [diff] [blame] | 92 | proc option {name val} { |
93 | global options | ||||
94 | if {![info exists options($name)]} { | ||||
95 | set options($name) $val | ||||
96 | } | ||||
97 | } | ||||
98 | |||||
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 99 | proc log {category message} { |
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 100 | puts "\t@printf ' \\e\[1;34m%8s\\e\[m %s\\n' '$category' '$message' > /dev/stderr" |
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 101 | } |
102 | |||||
swissChili | 9b46c90 | 2022-07-10 15:48:46 -0700 | [diff] [blame^] | 103 | proc jmk_log {message} { |
104 | puts stderr $message | ||||
105 | } | ||||
106 | |||||
107 | proc jmk_error {message} { | ||||
108 | puts stderr "\e[31mError\e[0m $message" | ||||
109 | exit 1 | ||||
110 | } | ||||
111 | |||||
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 112 | proc cc {command} { |
113 | puts "\t@$::cc $command $::cflags" | ||||
114 | } | ||||
115 | |||||
116 | proc asm {command} { | ||||
117 | puts "\t@$::asm $command $::asmflags" | ||||
118 | } | ||||
119 | |||||
120 | proc shell {command} { | ||||
121 | puts "\t@$command" | ||||
122 | } | ||||
123 | |||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 124 | proc make {command} { |
125 | shell "\$(MAKE) --no-print-directory MAKEFILE_DEPTH=\$\$((\$(MAKEFILE_DEPTH)+1)) $command" | ||||
126 | } | ||||
127 | |||||
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 128 | proc rule {target deps does} { |
129 | puts "" | ||||
130 | puts "$target: $deps" | ||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 131 | uplevel 1 $does |
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 132 | } |
133 | |||||
134 | proc type {type} { | ||||
135 | ::type::$type | ||||
136 | } | ||||
137 | |||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 138 | proc objs {args} { |
139 | foreach obj $args { | ||||
140 | set ::objs "$::objs $obj" | ||||
141 | } | ||||
142 | } | ||||
143 | |||||
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 144 | proc srcs {args} { |
145 | puts "" | ||||
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 146 | |
147 | foreach src $args { | ||||
swissChili | 9b46c90 | 2022-07-10 15:48:46 -0700 | [diff] [blame^] | 148 | set src [file join [pwd] $src] |
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 149 | variable obj [regsub -- {(.+)\.\w+} $src {\1.o}] |
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 150 | set ::objs "$::objs $obj" |
151 | } | ||||
152 | } | ||||
153 | |||||
154 | proc depends {name path {target DEFAULT_TARGET}} { | ||||
155 | if {$target eq {DEFAULT_TARGET}} { | ||||
156 | variable target "lib${name}.a" | ||||
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 157 | } |
158 | |||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 159 | set ::jmk_clean_libs "$::jmk_clean_libs $path" |
160 | set ::jmk_lib_paths($name) $path | ||||
161 | set ::jmk_lib_target($name) $target | ||||
162 | set ::jmk_phony_libs "$::jmk_phony_libs $path" | ||||
163 | |||||
164 | rule "$path/$target" {} { | ||||
165 | log "MAKE\[\$(MAKEFILE_DEPTH)\]" "Entering $name" | ||||
166 | make "-C $path $target" | ||||
167 | log "MAKE\[\$(MAKEFILE_DEPTH)\]" "Leaving $name" | ||||
168 | } | ||||
169 | } | ||||
170 | |||||
171 | proc lib {name} { | ||||
172 | return "$::jmk_lib_paths($name)/$::jmk_lib_target($name)" | ||||
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 173 | } |
174 | |||||
175 | namespace eval type { | ||||
176 | proc executable {} { | ||||
177 | global jmk_target | ||||
178 | |||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 179 | rule $jmk_target $::objs { |
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 180 | log LD $::target |
181 | cc "-o $::target $::src" | ||||
182 | } | ||||
183 | |||||
184 | helpers | ||||
185 | } | ||||
186 | |||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 187 | proc custom_link {} { |
188 | global jmk_target | ||||
189 | |||||
190 | rule $jmk_target $::objs { | ||||
191 | log LD $::target | ||||
192 | shell "$::ld $::ldflags -o $::target $::src" | ||||
193 | } | ||||
194 | |||||
195 | helpers | ||||
196 | } | ||||
197 | |||||
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 198 | proc helpers {} { |
199 | rule .c.o {} { | ||||
200 | log CC $::first_src | ||||
201 | cc "-c $::first_src -o $::target" | ||||
202 | } | ||||
203 | |||||
204 | rule .s.o {} { | ||||
205 | log ASM $::first_src | ||||
206 | asm "\$(ASMFLAGS) $::first_src -o $::target" | ||||
207 | } | ||||
208 | |||||
209 | rule clean {} { | ||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 210 | shell "rm -f **/*.o **/*.a *.so $::jmk_target $::objs" |
211 | |||||
212 | foreach lib $::jmk_clean_libs { | ||||
213 | make "-C $lib clean" | ||||
214 | } | ||||
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 215 | } |
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 216 | } |
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 217 | } |
218 | |||||
swissChili | 0fc3f26 | 2021-08-09 22:05:17 -0700 | [diff] [blame] | 219 | namespace eval preset { |
swissChili | 3555885 | 2022-07-02 18:15:45 -0700 | [diff] [blame] | 220 | proc freestanding {} { |
221 | cflags -nostdlib -nostdinc -fno-builtin -fno-stack-protector -ffreestanding | ||||
222 | } | ||||
223 | |||||
224 | proc optimize {} { | ||||
225 | cflags -O2 | ||||
226 | } | ||||
227 | |||||
swissChili | 0fc3f26 | 2021-08-09 22:05:17 -0700 | [diff] [blame] | 228 | proc 32 {} { |
229 | cflag -m32 | ||||
230 | asmflag -felf32 | ||||
231 | } | ||||
232 | |||||
233 | proc debug {} { | ||||
234 | cflag -g | ||||
235 | asmflag -Fdwarf | ||||
236 | } | ||||
237 | |||||
238 | proc warn {} { | ||||
swissChili | f3d6576 | 2022-07-03 22:34:54 -0700 | [diff] [blame] | 239 | cflags -Wall -Wno-unused-function -Wno-unused-variable -Wno-incompatible-pointer-types -Wno-sign-compare |
swissChili | 0fc3f26 | 2021-08-09 22:05:17 -0700 | [diff] [blame] | 240 | } |
241 | |||||
242 | proc nasm {} { | ||||
243 | global asm | ||||
244 | set asm nasm | ||||
245 | } | ||||
246 | } | ||||
swissChili | 9b46c90 | 2022-07-10 15:48:46 -0700 | [diff] [blame^] | 247 | |
248 | proc jmk_source {path} { | ||||
249 | variable dir [pwd] | ||||
250 | |||||
251 | if {![file exists $path]} { | ||||
252 | jmk_error "jmk_source: $dir/$path doesn't exist" | ||||
253 | } | ||||
254 | |||||
255 | lappend ::jmk_sourced "$dir/$path" | ||||
256 | |||||
257 | cd [file dirname $path] | ||||
258 | uplevel 1 source [file tail $path] | ||||
259 | cd $dir | ||||
260 | } | ||||
261 | |||||
262 | proc jmk_finalize {} { | ||||
263 | puts "Jmk2: $::jmk_sourced" | ||||
264 | } |