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
|
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
|
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
|
<?
package require sha1
load_response args
set sourcedir "/web/rkeene/devel/kitcreator/all"
set queue "/home/rkeene/devel/kitcreator/build/web/queue"
set secretfile "/home/rkeene/etc/kitcreator-web-secret"
foreach file [glob -tails -nocomplain -directory $sourcedir "kitcreator-*.tar.gz"] {
regexp {^kitcreator-(.*).tar.gz$} $file -> vers
set kitcreator_versions($vers) $vers
}
set kitcreator_version_selected [lindex [lsort -dictionary [array names kitcreator_versions]] end]
set kitcreator_versions(trunk) "Fossil Trunk Tip"
set tcl_versions(8.4.19) 8.4.19
set tcl_versions(8.5.9) 8.5.9
set tcl_versions(cvs_HEAD) "Fossil Trunk Tip"
set tcl_versions(8.5.15) 8.5.15
set tcl_versions(8.6.1) 8.6.1
set tcl_versions(8.6.2) 8.6.2
set tcl_versions(fossil_trunk) "Fossil Trunk Tip"
set platforms(android-arm) "Android/ARM"
set platforms(freebsd-amd64) "FreeBSD/amd64"
set platforms(hpux-hppa64) "HP-UX/PA-RISC 2.0"
set platforms(linux-x86) "Linux on x86"
set platforms(linux-amd64) "Linux on amd64"
set platforms(linux-mipsel) "Linux on MIPSEL"
set platforms(windows-x86) "Windows on x86"
set platforms(linux-amd64) "Linux/amd64"
set platforms(linux-arm) "Linux/ARM"
set platforms(linux-i386) "Linux/i386"
set platforms(linux-mipsel) "Linux/MIPS"
set platforms(netbsd-amd64) "NetBSD/amd64"
set platforms(netbsd-i386) "NetBSD/i386"
set platforms(solaris-amd64) "Solaris/amd64"
set platforms(solaris-i386) "Solaris/i386"
set platforms(solaris-sparc) "Solaris/SPARC"
set platforms(solaris-sparc64) "Solaris/SPARC64"
set platforms(win32) "Windows/i386"
set platforms(win64) "Windows/amd64"
set packages(tk) "Tk"
set packages(mk4tcl) "Metakit"
set packages(tcc4tcl) "tcc4tcl"
set packages(tls) TLS
set packages(dbus) D-BUS
set packages(tclx) TclX
set disable {
platform linux-amd64 tk
platform linux-mipsel tk
platform linux-mipsel {tk tcc4tcl}
platform android-arm tk
platform netbsd-amd64 {tk tcc4tcl}
platform netbsd-i386 {tk tcc4tcl}
platform solaris-sparc tcc4tcl
platform solaris-sparc64 tcc4tcl
platform hpux-hppa64 tcc4tcl
platform linux-arm tk
}
set specific {
platform windows-x86 file icon {Kit Icon}
platform windows-x86 text description {Description}
platform win32 file icon {Kit Icon}
platform win32 text description {Description}
platform win64 file icon {Kit Icon}
platform win64 text description {Description}
}
if {[info exists args(platform)] && [info exists args(tcl_version)] && [info exist args(kitcreator_version)]} {
# Read in arguments
## Mandatory arguments
set build_platform $args(platform)
set build_tcl_version $args(tcl_version)
set build_kitcreator_version $args(kitcreator_version)
## Optional Arguments
set build_packages [list]
set build_options(threaded) 0
set build_options(kitdll) 0
set build_options(debug) 0
foreach arg [array names args] {
switch -glob -- $arg {
"option_package_*" {
set package [join [lrange [split $arg _] 2 end] _]
lappend build_packages $package
}
"option_threaded" {
set build_options(threaded) 1
}
"option_kitdll" {
set build_options(kitdll) 1
}
"option_debug" {
set build_options(debug) 1
}
"option_storage" {
switch -- $args($arg) {
"mk4" - "zip" - "cvfs" {
set build_options(storage) $args($arg)
}
}
}
}
}
set build_packages [lsort -dictionary $build_packages]
# Validate arguments
if {![info exists platforms($build_platform)]} {
unset build_platform
}
if {![info exists tcl_versions($build_tcl_version)]} {
unset build_tcl_version
}
if {![info exists kitcreator_versions($build_kitcreator_version)]} {
unset build_kitcreator_version
}
foreach package $build_packages {
if {![info exists packages($package)]} {
unset build_packages
break
}
}
# Resolve version numbers to checkin IDs
## XXX: TODO
set cache_tcl_version $build_tcl_version
if {$build_tcl_version == "fossil_trunk"} {
set cache_tcl_version [clock format [clock seconds] -format {%Y%m%d}]
}
set cache_kitcreator_version $build_kitcreator_version
if {$build_kitcreator_version == "trunk"} {
set cache_kitcreator_version [clock format [clock seconds] -format {%Y%m%d}]
}
# Generate a serialized hash that represents the state of the build
## Load a secret so keys cannot be pre-computed (but remain consistent)
set secretfd [open $secretfile "r"]
set secret [gets $secretfd]
close $secretfd
## Compute basic key
set key [list $secret $build_platform $cache_tcl_version $cache_kitcreator_version $build_packages]
## Update key with options in deterministic order
foreach option [lsort -dictionary [array names build_options]] {
switch -- $option {
"threaded" - "kitdll" - "debug" {
# For boolean options, skip them if they are not enabled
if {!$build_options($option)} {
continue
}
}
}
lappend key [list "option:$option" $build_options($option)]
}
## Convert key to a user-consumable string via hashing
set key [string tolower [sha1::sha1 -hex $key]]
# Determine filename
if {$build_options(kitdll)} {
set extension "so"
switch -- $build_platform {
"win32" - "win64" {
set extension "dll"
}
"hpux-hppa64" {
set extension "sl"
}
}
## XXX: TODO: The version here needs to match what's in the SONAME
set filename "libtclkit[string map [list "." ""] ${cache_tcl_version}].${extension}"
} else {
set filename "tclkit"
switch -- $build_platform {
"win32" - "win64" {
append filename ".exe"
}
}
}
# Queue build up and wait for it to complete
set fd [open $queue a+]
puts $fd [list filename $filename key $key platform $build_platform tcl_version $build_tcl_version kitcreator_version $build_kitcreator_version packages $build_packages options [array get build_options]]
close $fd
set url "http://kitcreator.rkeene.org/kits/building/$key/"
headers redirect $url
?><html>
<head>
<title>KitCreator, Web Interface</title>
</head>
<body>
<h1>KitCreator Web Interface</h1>
<p>Build in progress, see <a href="<? puts -nonewline $url ?>"><? puts -nonewline $url ?></a> for build information</p>
</body>
</html>
<?
} else {
?><html>
<head>
<title>KitCreator, Web Interface</title>
<script>
<!--
function enablePackage(package) {
var obj;
obj = document.getElementById('option_package_' + package);
obj.disabled = false;
}
function disablePackage(package) {
var obj;
obj = document.getElementById('option_package_' + package);
obj.checked = false;
obj.disabled = true;
}
function verifyOptions() {
var kitcreator_version;
var tcl_version;
var platform;
kitcreator_version = document.getElementsByName('kitcreator_version')[0].value;
tcl_version = document.getElementsByName('tcl_version')[0].value;
platform = document.getElementsByName('platform')[0].value;
<?
set alldisabledpackages [list]
foreach {keyword value disablepackages} $disable {
foreach package $disablepackages {
if {[lsearch -exact $alldisabledpackages $package] == -1} {
lappend alldisabledpackages $package
}
}
}
foreach package $alldisabledpackages {
puts "\t\tenablePackage(\"$package\");"
}
foreach {keyword value disablepackages} $disable {
puts "\t\tif ($keyword == \"$value\") \{"
foreach package $disablepackages {
puts "\t\t\tdisablePackage(\"$package\");"
}
puts "\t\t\}"
}
?>
}
-->
</script>
</head>
<body>
<body onLoad="verifyOptions();">
<h1>KitCreator Web Interface</h1>
<form method="post" enctype="multipart/form-data">
<table>
<tr>
<td>KitCreator Version:</td>
<td>
<select name="kitcreator_version" onChange="verifyOptions();">
|
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
|
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
|
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
-
+
|
?>
</select>
</td>
</tr>
<tr>
<td>Kit Options:</td>
<td>
<? foreach package [lsort -dictionary [array names packages]] { ?>
<input type="checkbox" name="option_package_tk">Tk<br>
<input type="checkbox" name="option_package_itcl">[incr Tcl]<br>
<input type="checkbox" name="option_package_mk4tcl">Metakit<br>
<input type="checkbox" name="option_threaded">Threaded<br>
<input type="checkbox" name="option_kitdll">Build Library (KitDLL)<br>
</td>
</tr>
<input type="checkbox" name="option_package_<? puts -nonewline $package ?>" id="option_package_<? puts -nonewline $package ?>">Package: <? puts -nonewline $packages($package) ?><br>
<? } ?>
<input type="checkbox" name="option_threaded">Kit: Threaded<br>
<input type="checkbox" name="option_debug">Kit: Debugging Build<br>
<input type="checkbox" name="option_kitdll">Kit: Build Library (KitDLL)<br>
</td>
</tr>
<tr>
<td>Kit Storage:</td>
<td>
<select name="option_storage">
<option value="auto">Automatically Determined</option>
<option value="mk4">Metakit</option>
<option value="zip">Zip</option>
<option value="cvfs">C-VFS</option>
</select>
</td>
</tr>
<!--
<tr>
<td>Kit Icon:</td>
<td>
<input type="file" name="platform-windows-x86-icon">
<input type="file" name="option_icon">
</td>
</tr>
<tr>
<td>Description:</td>
<td>
<input type="text" name="platform-windows-x86-desc">
<input type="text" name="option_desc">
</td>
</tr>
-->
</table>
<input type="submit" name="submit" value="Create">
</form>
</body>
</html>
</html><? } ?>
|