blob: 64b9afd265593305af47b43266699548828f9089 [file] [log] [blame]
swissChili0fc3f262021-08-09 22:05:17 -07001# Rewrite of JMK in TCL
2
3variable jmk_name {}
4variable jmk_target {}
swissChilif3d65762022-07-03 22:34:54 -07005variable jmk_clean_libs {}
6variable jmk_phony_libs {}
7variable jmk_lib_paths
8variable jmk_lib_targets
9
swissChili9b46c902022-07-10 15:48:46 -070010variable jmk_sourced
11
swissChili0fc3f262021-08-09 22:05:17 -070012variable cflags {}
13variable asmflags {}
swissChilif3d65762022-07-03 22:34:54 -070014variable ldflags {}
swissChili0fc3f262021-08-09 22:05:17 -070015
16variable asm as
swissChilif3d65762022-07-03 22:34:54 -070017variable cc gcc
18variable ld ld
19
20variable objs {}
swissChili0fc3f262021-08-09 22:05:17 -070021
swissChili35558852022-07-02 18:15:45 -070022# variable options
23
24variable src \$^
25variable first_src \$<
26variable target \$@
swissChili0fc3f262021-08-09 22:05:17 -070027
28proc 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
swissChili35558852022-07-02 18:15:45 -070038
39 puts {MAKEFILE_DEPTH ?= 1}
40
41 rule all $target {}
swissChilif3d65762022-07-03 22:34:54 -070042
43 rule Makefile Jmk2 {
44 log JMK2 ""
45 shell "cd $::jmk_build_dir && $::jmk_build_cmd"
46 }
swissChili0fc3f262021-08-09 22:05:17 -070047}
48
49proc preset {p} {
50 ::preset::$p
51}
52
53proc presets {args} {
54 foreach arg $args {
55 preset $arg
56 }
57}
58
59proc cflag {arg} {
60 global cflags
61 set cflags "$cflags $arg"
62}
63
64proc cflags {args} {
65 foreach arg $args {
66 cflag $arg
67 }
68}
69
70proc asmflag {arg} {
71 global asmflags
72 set asmflags "$asmflags $arg"
73}
74
75proc asmflags {args} {
76 foreach arg $args {
77 asmflag $arg
78 }
79}
80
swissChilif3d65762022-07-03 22:34:54 -070081proc ldflag {arg} {
82 global ldflags
83 set ldflags "$ldflags $arg"
84}
85
86proc ldflags {args} {
87 foreach arg $args {
88 ldflag $arg
89 }
90}
91
swissChili0fc3f262021-08-09 22:05:17 -070092proc option {name val} {
93 global options
94 if {![info exists options($name)]} {
95 set options($name) $val
96 }
97}
98
swissChili35558852022-07-02 18:15:45 -070099proc log {category message} {
swissChilif3d65762022-07-03 22:34:54 -0700100 puts "\t@printf ' \\e\[1;34m%8s\\e\[m %s\\n' '$category' '$message' > /dev/stderr"
swissChili35558852022-07-02 18:15:45 -0700101}
102
swissChili9b46c902022-07-10 15:48:46 -0700103proc jmk_log {message} {
104 puts stderr $message
105}
106
107proc jmk_error {message} {
108 puts stderr "\e[31mError\e[0m $message"
109 exit 1
110}
111
swissChili35558852022-07-02 18:15:45 -0700112proc cc {command} {
113 puts "\t@$::cc $command $::cflags"
114}
115
116proc asm {command} {
117 puts "\t@$::asm $command $::asmflags"
118}
119
120proc shell {command} {
121 puts "\t@$command"
122}
123
swissChilif3d65762022-07-03 22:34:54 -0700124proc make {command} {
125 shell "\$(MAKE) --no-print-directory MAKEFILE_DEPTH=\$\$((\$(MAKEFILE_DEPTH)+1)) $command"
126}
127
swissChili35558852022-07-02 18:15:45 -0700128proc rule {target deps does} {
129 puts ""
130 puts "$target: $deps"
swissChilif3d65762022-07-03 22:34:54 -0700131 uplevel 1 $does
swissChili35558852022-07-02 18:15:45 -0700132}
133
134proc type {type} {
135 ::type::$type
136}
137
swissChilif3d65762022-07-03 22:34:54 -0700138proc objs {args} {
139 foreach obj $args {
140 set ::objs "$::objs $obj"
141 }
142}
143
swissChili35558852022-07-02 18:15:45 -0700144proc srcs {args} {
145 puts ""
swissChili35558852022-07-02 18:15:45 -0700146
147 foreach src $args {
swissChili9b46c902022-07-10 15:48:46 -0700148 set src [file join [pwd] $src]
swissChili35558852022-07-02 18:15:45 -0700149 variable obj [regsub -- {(.+)\.\w+} $src {\1.o}]
swissChilif3d65762022-07-03 22:34:54 -0700150 set ::objs "$::objs $obj"
151 }
152}
153
154proc depends {name path {target DEFAULT_TARGET}} {
155 if {$target eq {DEFAULT_TARGET}} {
156 variable target "lib${name}.a"
swissChili35558852022-07-02 18:15:45 -0700157 }
158
swissChilif3d65762022-07-03 22:34:54 -0700159 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
171proc lib {name} {
172 return "$::jmk_lib_paths($name)/$::jmk_lib_target($name)"
swissChili35558852022-07-02 18:15:45 -0700173}
174
175namespace eval type {
176 proc executable {} {
177 global jmk_target
178
swissChilif3d65762022-07-03 22:34:54 -0700179 rule $jmk_target $::objs {
swissChili35558852022-07-02 18:15:45 -0700180 log LD $::target
181 cc "-o $::target $::src"
182 }
183
184 helpers
185 }
186
swissChilif3d65762022-07-03 22:34:54 -0700187proc 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
swissChili35558852022-07-02 18:15:45 -0700198proc 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 {} {
swissChilif3d65762022-07-03 22:34:54 -0700210 shell "rm -f **/*.o **/*.a *.so $::jmk_target $::objs"
211
212 foreach lib $::jmk_clean_libs {
213 make "-C $lib clean"
214 }
swissChili35558852022-07-02 18:15:45 -0700215 }
swissChilif3d65762022-07-03 22:34:54 -0700216}
swissChili35558852022-07-02 18:15:45 -0700217}
218
swissChili0fc3f262021-08-09 22:05:17 -0700219namespace eval preset {
swissChili35558852022-07-02 18:15:45 -0700220 proc freestanding {} {
221 cflags -nostdlib -nostdinc -fno-builtin -fno-stack-protector -ffreestanding
222 }
223
224 proc optimize {} {
225 cflags -O2
226 }
227
swissChili0fc3f262021-08-09 22:05:17 -0700228 proc 32 {} {
229 cflag -m32
230 asmflag -felf32
231 }
232
233 proc debug {} {
234 cflag -g
235 asmflag -Fdwarf
236 }
237
238 proc warn {} {
swissChilif3d65762022-07-03 22:34:54 -0700239 cflags -Wall -Wno-unused-function -Wno-unused-variable -Wno-incompatible-pointer-types -Wno-sign-compare
swissChili0fc3f262021-08-09 22:05:17 -0700240 }
241
242 proc nasm {} {
243 global asm
244 set asm nasm
245 }
246}
swissChili9b46c902022-07-10 15:48:46 -0700247
248proc 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
262proc jmk_finalize {} {
263 puts "Jmk2: $::jmk_sourced"
264}