Posted to tcl by hypnotoad at Thu Jan 11 20:04:53 GMT 2018view raw

  1. ###
  2. # This file contains instructions for how to build the Odielib library
  3. # It will produce the following files in whatever directory it was called from:
  4. #
  5. # * odielibc.mk - A Makefile snippet needed to compile the odielib sources
  6. # * odielibc.c - A C file which acts as the loader for odielibc
  7. # * logicset.c/h - A c
  8. # * (several .c and .h files) - C sources that are generated on the fly by automation
  9. ###
  10. # Ad a "just in case" version or practcl we ship locally
  11.  
  12. set ::CWD [pwd]
  13. set ::SRCDIR [file dirname [file normalize [info script]]]
  14. set ::SANDBOX [file dirname $::SRCDIR]
  15.  
  16. if {[file exists [file join $::SRCDIR .. tclconfig practcl.tcl]]} {
  17. source [file join $::SRCDIR .. tclconfig practcl.tcl]
  18. } else {
  19. source [file join $::SRCDIR tclconfig practcl.tcl]
  20. }
  21. set ::practcl::CONFIG(sandbox) $::SANDBOX
  22.  
  23. file mkdir $CWD/build
  24.  
  25. set ::CWD [pwd]
  26. set dat [::practcl::config.tcl $CWD]
  27. # Handle turning on and off debugging in time to alter the
  28. # make objects
  29. if {"debug" in $argv} {
  30. dict set dat debug 1
  31. puts "Enableing Symbols"
  32. if {[file exists $CWD/config.tcl]} {
  33. set odat [::practcl::cat $CWD/config.tcl]
  34. }
  35. dict set odat debug 1
  36. set fout [open $CWD/config.tcl w]
  37. foreach {f v} [::practcl::sort_dict $odat] {
  38. puts $fout [list $f $v]
  39. }
  40. close $fout
  41. }
  42. if {"no-debug" in $argv} {
  43. dict set dat debug 0
  44. puts "Disabling Symbols"
  45. if {[file exists $CWD/config.tcl]} {
  46. set odat [::practcl::cat $CWD/config.tcl]
  47. }
  48. dict set odat debug 0
  49. set fout [open $CWD/config.tcl w]
  50. foreach {f v} [::practcl::sort_dict $odat] {
  51. puts $fout [list $f $v]
  52. }
  53. close $fout
  54. }
  55. ::practcl::tclkit create BASEKIT $dat
  56.  
  57. BASEKIT define set sandbox $::SANDBOX
  58. BASEKIT define set name toadkit
  59. BASEKIT define set name toadkit
  60. BASEKIT define set version 0.1
  61. BASEKIT define set localpath toadkit
  62. BASEKIT define set profile devel
  63. BASEKIT define set prefix /tcl
  64. BASEKIT define set installdir [file join $::CWD PKGROOT]
  65. BASEKIT define set USEMSVC [info exists env(VisualStudioVersion)]
  66. BASEKIT define set prefix_broken_destdir [file join $::SANDBOX tmp]
  67. if {[BASEKIT define get debug 0]} {
  68. BASEKIT define set tclkit_bare [file join $CWD tclkit_debug[BASEKIT define get EXEEXT]]
  69. } else {
  70. BASEKIT define set tclkit_bare [file join $CWD tclkit_bare[BASEKIT define get EXEEXT]]
  71. }
  72. BASEKIT define set output_c toadkit.c
  73. BASEKIT define set libs {}
  74. BASEKIT source [file join $::SRCDIR basekit.ini]
  75.  
  76. ::practcl::target tcltk {
  77. depends {deps configure clean local-env}
  78. triggers {script-packages script-pkgindex}
  79. filename [file join $CWD config.tcl]
  80. }
  81. ::practcl::target debug {
  82. triggers toadkit
  83. }
  84. ::practcl::target no-debug {
  85. triggers toadkit
  86. }
  87. ::practcl::target clean {
  88. }
  89. ::practcl::target local-env {
  90. aliases local
  91. }
  92. ::practcl::target basekit {
  93. depends {deps tcltk practcl}
  94. triggers {}
  95. filename [file join $CWD [BASEKIT define get tclkit_bare]]
  96. }
  97. ::practcl::target odielib {
  98. triggers {basekit toadkit}
  99. }
  100. ::practcl::target packages {
  101. depends {deps tcltk practcl}
  102. }
  103. ::practcl::target upgrade {
  104. triggers {clean basekit tcltk deps packages toadkit}
  105. }
  106. ::practcl::target toadkit {
  107. aliases example
  108. depends {deps tcltk basekit packages practcl}
  109. }
  110. ::practcl::target practcl {
  111. filename [file join $::SANDBOX tclconfig practcl.tcl]
  112. }
  113. ::practcl::target distclean {}
  114.  
  115. switch [lindex $argv 0] {
  116. os {
  117. puts "OS: [practcl::os]"
  118. set dat [::practcl::local_os]
  119. foreach {var val} $dat {
  120. puts "${var}: $val"
  121. }
  122. set preffile [file join [dict get $dat userhome] practcl.rc]
  123. puts "PREFS: $preffile"
  124. if {[file exists $preffile] } {
  125. set dat [::practcl::read_rc_file $preffile]
  126. foreach {f v} $dat {
  127. puts "$f: $v"
  128. }
  129. }
  130. #parray ::project
  131. exit 0
  132. }
  133. info {
  134. puts "OS: [practcl::os]"
  135. foreach {var val} [::practcl::local_os] {
  136. puts "${var}: $val"
  137. }
  138. puts ***
  139. foreach item [BASEKIT link list core.library] {
  140. puts " [list PACKAGE [$item define get name]]"
  141. foreach {f v} [$item define dump] {
  142. puts " $f: $v"
  143. }
  144. }
  145. foreach item [BASEKIT link list package] {
  146. puts " [list PACKAGE [$item define get name]]"
  147. foreach {f v} [$item define dump] {
  148. puts " $f: $v"
  149. }
  150. }
  151. exit 0
  152. }
  153. wrap {
  154. ::practcl::depends basekit
  155. }
  156. all {
  157. # Auto detect missing bits
  158. ::practcl::trigger toadkit
  159. }
  160. local {
  161. # Build local packages
  162. set prefix [lindex $argv 1]
  163. if {$prefix eq {}} {
  164. set prefix [file normalize [file join ~ tcl]]
  165. }
  166.  
  167. }
  168. package-get {
  169. foreach {package version} [lrange $argv 1 end] {
  170. set obj [BASEKIT project $package]
  171. $obj define set scm_tag $version
  172. $obj update
  173. }
  174. exit 0
  175. }
  176. package {
  177. ::practcl::trigger packages
  178. }
  179. default {
  180. ::practcl::trigger {*}$argv
  181. }
  182. }
  183.  
  184. if {[catch {
  185. if {$make(clean) || $make(distclean) || $make(upgrade)} {
  186. set triggers {}
  187. foreach {item value} [array get make] {
  188. if {$value} { lappend triggers $item }
  189. }
  190. foreach fname {PKGROOT pkg toadkit.c toadkit.h toadkit.vfs kitcrypt.c} {
  191. if {[file exists [file join $CWD $fname]]} {
  192. file delete -force [file join $CWD $fname]
  193. }
  194. }
  195. foreach file [glob -nocomplain $CWD/pkg/*] {
  196. file delete -force $file
  197. }
  198. foreach file [glob -nocomplain $CWD/build/*] {
  199. file delete -force $file
  200. }
  201. foreach file [glob -nocomplain $CWD/objs/*] {
  202. file delete -force $file
  203. }
  204. #foreach {item fname} [array get ::target] {
  205. # if {[file exists $fname]} {
  206. # file delete $fname
  207. # }
  208. #}
  209. # Re-apply triggers
  210. ::practcl::trigger {*}$triggers
  211. }
  212.  
  213. if {$make(distclean)} {
  214. # Clean all source code back to it's pristine state from fossil
  215. foreach item [BASEKIT link list package] {
  216. $item go
  217. set projdir [$item define get localsrcdir]
  218. if {$projdir ne {} && [file exists $projdir]} {
  219. fossil $projdir clean -force
  220. }
  221. }
  222. }
  223.  
  224. file mkdir [file join $CWD build]
  225. if {$make(upgrade)} {
  226. set INSTALLDIR [BASEKIT define get installdir]
  227. foreach item {tclconfig tcl tk critcl sqlite} {
  228. set obj [::practcl::LOCAL tool $item]
  229. $obj update
  230. }
  231. foreach item [BASEKIT link list package] {
  232. puts [list Updating $item [$item define get srcdir]]
  233. $item update
  234. }
  235. }
  236.  
  237. if {$make(local-env)} {
  238. puts "BUILDING LOCAL TCL ENVIRONMENT"
  239. foreach item {tclconfig tcl tk critcl sqlite} {
  240. set obj [::practcl::LOCAL tool $item]
  241. puts [list $item $obj]
  242. if {[catch {$obj env-install} err errdat]} {
  243. puts ***
  244. puts [dict get $errdat -errorinfo]
  245. puts ***
  246. }
  247. }
  248. }
  249.  
  250. if {$make(tcltk)} {
  251. BASEKIT build-tclcore
  252. }
  253.  
  254. if {$make(practcl)} {
  255. set tclConfigObj [::practcl::LOCAL tool tclconfig]
  256. $tclConfigObj env-load
  257. }
  258.  
  259. if {$make(odielib)} {
  260. BASEKIT project odielib clean
  261. BASEKIT project odielib compile
  262. }
  263.  
  264. if {[lindex $argv 0] eq "package"} {
  265. #set result {}
  266. set INSTALLDIR [BASEKIT define get installdir]
  267. foreach item [lrange $argv 1 end] {
  268. set obj [BASEKIT project $item]
  269. puts [list build $item [$obj define get static] [info object class $obj]]
  270. if {[string is true [$obj define get static]]} {
  271. $obj compile
  272. }
  273. if {[string is true [$obj define get vfsinstall]]} {
  274. $obj install $INSTALLDIR
  275. }
  276. }
  277. #puts "RESULT: $result"
  278. } elseif {$make(packages)} {
  279. puts "CHECKING PACKAGE LIST"
  280. set INSTALLDIR [BASEKIT define get installdir]
  281. foreach item [BASEKIT link list package] {
  282. puts [list GENERATING $item [$item define get srcdir]]
  283. if {[string is true [$item define get static 0]]} {
  284. $item compile
  285. }
  286. if {[string is true [$item define get vfsinstall 1]]} {
  287. if {[catch {$item install $INSTALLDIR} error errdat]} {
  288. puts stderr "BUILD FAILURE $item"
  289. puts "FAILED TO INSTALL package $item"
  290. puts [dict get $errdat -errorinfo]
  291. exit 1
  292. }
  293. }
  294. }
  295. }
  296.  
  297. if {$make(basekit)} {
  298. BASEKIT implement $CWD
  299. if {![file exists [file join $CWD make.tcl]]} {
  300. set fout [open [file join $CWD make.tcl] w]
  301. puts $fout [list source [file join $::SRCDIR make.tcl]]
  302. close $fout
  303. }
  304. BASEKIT build-tclsh $target(basekit) BASEKIT
  305. }
  306.  
  307. if {[lindex $argv 0] eq "wrap"} {
  308. BASEKIT wrap $CWD {*}[lrange $argv 1 end]
  309. }
  310.  
  311. if {$make(toadkit)} {
  312. puts [list DEBUG: [BASEKIT define get debug 0]]
  313. set VFS [file join $CWD toadkit.vfs]
  314. file mkdir $VFS
  315. # Copy in our "secret squirrel" code
  316. #set SCMCOPY [list ::exec [BASEKIT define get tclkit_bare] [file join $::SRCDIR scripts scm-copy.tcl]]
  317. set SCMCOPY ::practcl::copyDir
  318. {*}$SCMCOPY [file join $::SRCDIR src] ${VFS}
  319. if {[BASEKIT define get debug 0]} {
  320. BASEKIT wrap $CWD toadkit_debug $VFS [file join $CWD PKGROOT]
  321. } else {
  322. BASEKIT wrap $CWD toadkit $VFS [file join $CWD PKGROOT]
  323. }
  324. }
  325. } err errdat]} {
  326. set logfile [file join $::CWD practcl.log]
  327. ::practcl::log $logfile "###\n# Error Trace\n###"
  328. ::practcl::log $logfile [dict get $errdat -errorinfo]
  329. ::practcl::log $logfile "###\n# DEBUG INFO\n###"
  330. ::practcl::log $logfile $::DEBUG_INFO
  331. puts stderr $err
  332. puts stderr "Failure logged to $logfile"
  333. exit 1
  334. }
  335.