aboutsummaryrefslogtreecommitdiff
path: root/starkit.tcl.in
blob: 8ce35bbf571df6b695d03e4e224d33c66455f4e0 (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
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
#
# This script is intended to be run in the top directory
# with: tclsh starkit.tcl.
# It needs a tclkit and the sdx command as a starkit in the path.
#

set MAJOR_VERSION @MAJOR_VERSION@
set MINOR_VERSION @MINOR_VERSION@
set PATCHLEVEL @PATCHLEVEL@


#
# Starkit structure
#
# demo.tcl
# lib
#   tkimg1.3
#     files from the Tkimg starkit
#   TkzincX.Y
#     Copyright
#     demos
#       demos files and sub-directories
#     Linux-x86
#       Tkzinc.so
#     pkgIndex.tcl
#     Windows-x86
#       Tkzinc.dll
#     zincGraphics.tcl
#     zincLogo.tcl
#     zincText.tcl
# main.tcl
#

proc crossCompile {} {
    global MAJOR_VERSION MINOR_VERSION PATCHLEVEL
    global env

    #
    # Try to find the Tcl/Tk headers and stubs cache
    set kit [file normalize [file join [pwd] .. .kittmp]]
    if { ! [file exists $kit] } {
	puts "Unable to find the Tcl/Tk headers and stubs in $kit, exiting."
	exit
    }
    puts "Using Tcl/Tk headers and stubs in: $kit"

    set sources {
	libtess/dict.c libtess/geom.c libtess/memalloc.c libtess/mesh.c
	libtess/normal.c libtess/priorityq.c libtess/render.c
	libtess/sweep.c libtess/tess.c libtess/tessmono.c
	generic/Track.c generic/Tabular.c generic/Reticle.c generic/Map.c
	generic/Rectangle.c generic/Arc.c generic/Curve.c generic/Item.c
	generic/PostScript.c generic/MapInfo.c generic/Attrs.c
	generic/Draw.c generic/Geo.c generic/List.c generic/perfos.c
	generic/Transfo.c generic/Group.c generic/Icon.c generic/Text.c
	generic/Image.c generic/Color.c generic/Field.c generic/Triangles.c
	generic/Window.c generic/tkZinc.c generic/OverlapMan.c
	win/WinPort.c
    }
    set cFlags [list -I$kit -I$kit/generic -I$kit/xlib -Igeneric -Ilibtess \
		    -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 \
		    -DVERSION=\"$MAJOR_VERSION.$MINOR_VERSION.$PATCHLEVEL\" \
		    -DGL=1 -DGL_DAMAGE=1 -DOM=1 -O2 -DBUILD_Tkzinc=1 ]
    set lFlags [list -shared -s -L$kit/Windows-x86 -ltclstub -ltkstub \
		    -lopengl32 -lgdi32 -lwsock32 -luser32 ]
    set objs [list]

    set envSave $env(PATH)
    set env(PATH) $env(HOME)/cross-tools/bin:$env(PATH)
    set logFile [open starkit.log w]

    foreach f $sources {
	lappend objs [file rootname [file tail $f]].o
	set cmdLine "gcc $cFlags -c $f >&@ $logFile"
	puts $logFile $cmdLine
	catch {eval exec $cmdLine} result
	puts $logFile $result
    }
    set cmdLine "gcc $objs $lFlags -o Tkzinc$MAJOR_VERSION$MINOR_VERSION$PATCHLEVEL.dll >&@ $logFile"
    puts $logFile $cmdLine
    catch {eval exec $cmdLine} result
    puts $logFile $result

    close $logFile
    set env(PATH) $envSave
}

proc updateKit {} {
    global MAJOR_VERSION MINOR_VERSION PATCHLEVEL

    set zincPath [file join Tkzinc.vfs lib Tkzinc$MAJOR_VERSION.$MINOR_VERSION]
    set version $MAJOR_VERSION.$MINOR_VERSION.$PATCHLEVEL
    set winVersion $MAJOR_VERSION$MINOR_VERSION$PATCHLEVEL

    file copy -force [file join starkit demo.tcl] [file join starkit main.tcl] Tkzinc.vfs

    set zincPath [file join Tkzinc.vfs lib Tkzinc$MAJOR_VERSION.$MINOR_VERSION]
    file mkdir $zincPath
    file copy -force Copyright \
	[file join library zincGraphics.tcl] \
	[file join library zincLogo.tcl] \
	[file join library zincText.tcl] \
	$zincPath

    set demosPath [file join $zincPath demos]
    file mkdir $demosPath
    foreach f [glob -directory demos *.tcl] {
	file copy -force $f $demosPath
    }
    file delete -force [file join $demosPath data] [file join $demosPath images]
    file copy -force [file join demos zinc-widget] [file join demos data] [file join demos images] $demosPath

    #
    # Emit a merged pkgIndex.tcl
    #
    set fOut [open [file join $zincPath pkgIndex.tcl] w]
    puts $fOut "proc Platform {} {"
    puts -nonewline $fOut [info body Platform]
    puts $fOut "}"
    set fIn [open [file join library pkgIndex.tcl]]
    foreach line [split [read $fIn] \n] {
	if {![regexp {^\s*$|^#} $line]} {
	    puts $fOut $line
	}
    }
    close $fIn
    puts -nonewline $fOut "package ifneeded Tkzinc $version "
    puts $fOut {[list load [file join $dir [Platform] Tkzinc[info sharedlibext]]]}
    close $fOut

    #
    # Copy the platform dependent libraries
    #
    if { [file exists libTkzinc$version.so] } {
	set platformPath [file join $zincPath Linux-x86]
	file mkdir $platformPath
	file copy -force libTkzinc$version.so [file join $platformPath Tkzinc.so]
    }
    if { [file exists Tkzinc$winVersion.dll] } {
	set platformPath [file join $zincPath Windows-x86]
	file mkdir $platformPath
	file copy -force Tkzinc330.dll [file join $platformPath Tkzinc.dll]
    }

    exec sdx wrap Tkzinc.kit
}


proc Platform {} {
    global tcl_platform
    set plat [lindex $tcl_platform(os) 0]
    set mach $tcl_platform(machine)
    switch -glob -- $mach {
	sun4* { set mach sparc }
	intel -
	i*86* { set mach x86 }
	"Power Macintosh" { set mach ppc }
    }
    switch -- $plat {
	AIX   { set mach ppc }
	HP-UX { set mach hppa }
    }
    return "$plat-$mach"
}

#
# Build the Windows variant
crossCompile

#
# Build the linux variant
catch {exec make clean}
catch {exec make}

#
# If the starkit Tkzinc.kit already exist in the top directory
# simply update it else build a new one according to the layout
# above. In this later case one need to make sure there is a
# valid Tkimg.kit in the top directory's parent.
#
if { [file exists Tkzinc.kit] } {
    if { [file exists Tkzinc.vfs] } {
	file delete -force Tkzinc.vfs
    }
    exec sdx unwrap Tkzinc.kit
    updateKit
} {
    if { [file exists Tkzinc.vfs] } {
	file delete -force Tkzinc.vfs
    }
    file mkdir Tkzinc.vfs

    if { [file exists Tkimg.vfs] } {
	file delete -force Tkimg.vfs
    }
    exec sdx unwrap [file join .. Tkimg.kit]
    file copy [file join Tkimg.vfs lib] Tkzinc.vfs

    updateKit
}

file delete -force Tkimg.vfs
file delete -force Tkzinc.vfs