Posted to tcl by hypnotoad at Thu Jan 11 20:04:53 GMT 2018view pretty
### # This file contains instructions for how to build the Odielib library # It will produce the following files in whatever directory it was called from: # # * odielibc.mk - A Makefile snippet needed to compile the odielib sources # * odielibc.c - A C file which acts as the loader for odielibc # * logicset.c/h - A c # * (several .c and .h files) - C sources that are generated on the fly by automation ### # Ad a "just in case" version or practcl we ship locally set ::CWD [pwd] set ::SRCDIR [file dirname [file normalize [info script]]] set ::SANDBOX [file dirname $::SRCDIR] if {[file exists [file join $::SRCDIR .. tclconfig practcl.tcl]]} { source [file join $::SRCDIR .. tclconfig practcl.tcl] } else { source [file join $::SRCDIR tclconfig practcl.tcl] } set ::practcl::CONFIG(sandbox) $::SANDBOX file mkdir $CWD/build set ::CWD [pwd] set dat [::practcl::config.tcl $CWD] # Handle turning on and off debugging in time to alter the # make objects if {"debug" in $argv} { dict set dat debug 1 puts "Enableing Symbols" if {[file exists $CWD/config.tcl]} { set odat [::practcl::cat $CWD/config.tcl] } dict set odat debug 1 set fout [open $CWD/config.tcl w] foreach {f v} [::practcl::sort_dict $odat] { puts $fout [list $f $v] } close $fout } if {"no-debug" in $argv} { dict set dat debug 0 puts "Disabling Symbols" if {[file exists $CWD/config.tcl]} { set odat [::practcl::cat $CWD/config.tcl] } dict set odat debug 0 set fout [open $CWD/config.tcl w] foreach {f v} [::practcl::sort_dict $odat] { puts $fout [list $f $v] } close $fout } ::practcl::tclkit create BASEKIT $dat BASEKIT define set sandbox $::SANDBOX BASEKIT define set name toadkit BASEKIT define set name toadkit BASEKIT define set version 0.1 BASEKIT define set localpath toadkit BASEKIT define set profile devel BASEKIT define set prefix /tcl BASEKIT define set installdir [file join $::CWD PKGROOT] BASEKIT define set USEMSVC [info exists env(VisualStudioVersion)] BASEKIT define set prefix_broken_destdir [file join $::SANDBOX tmp] if {[BASEKIT define get debug 0]} { BASEKIT define set tclkit_bare [file join $CWD tclkit_debug[BASEKIT define get EXEEXT]] } else { BASEKIT define set tclkit_bare [file join $CWD tclkit_bare[BASEKIT define get EXEEXT]] } BASEKIT define set output_c toadkit.c BASEKIT define set libs {} BASEKIT source [file join $::SRCDIR basekit.ini] ::practcl::target tcltk { depends {deps configure clean local-env} triggers {script-packages script-pkgindex} filename [file join $CWD config.tcl] } ::practcl::target debug { triggers toadkit } ::practcl::target no-debug { triggers toadkit } ::practcl::target clean { } ::practcl::target local-env { aliases local } ::practcl::target basekit { depends {deps tcltk practcl} triggers {} filename [file join $CWD [BASEKIT define get tclkit_bare]] } ::practcl::target odielib { triggers {basekit toadkit} } ::practcl::target packages { depends {deps tcltk practcl} } ::practcl::target upgrade { triggers {clean basekit tcltk deps packages toadkit} } ::practcl::target toadkit { aliases example depends {deps tcltk basekit packages practcl} } ::practcl::target practcl { filename [file join $::SANDBOX tclconfig practcl.tcl] } ::practcl::target distclean {} switch [lindex $argv 0] { os { puts "OS: [practcl::os]" set dat [::practcl::local_os] foreach {var val} $dat { puts "${var}: $val" } set preffile [file join [dict get $dat userhome] practcl.rc] puts "PREFS: $preffile" if {[file exists $preffile] } { set dat [::practcl::read_rc_file $preffile] foreach {f v} $dat { puts "$f: $v" } } #parray ::project exit 0 } info { puts "OS: [practcl::os]" foreach {var val} [::practcl::local_os] { puts "${var}: $val" } puts *** foreach item [BASEKIT link list core.library] { puts " [list PACKAGE [$item define get name]]" foreach {f v} [$item define dump] { puts " $f: $v" } } foreach item [BASEKIT link list package] { puts " [list PACKAGE [$item define get name]]" foreach {f v} [$item define dump] { puts " $f: $v" } } exit 0 } wrap { ::practcl::depends basekit } all { # Auto detect missing bits ::practcl::trigger toadkit } local { # Build local packages set prefix [lindex $argv 1] if {$prefix eq {}} { set prefix [file normalize [file join ~ tcl]] } } package-get { foreach {package version} [lrange $argv 1 end] { set obj [BASEKIT project $package] $obj define set scm_tag $version $obj update } exit 0 } package { ::practcl::trigger packages } default { ::practcl::trigger {*}$argv } } if {[catch { if {$make(clean) || $make(distclean) || $make(upgrade)} { set triggers {} foreach {item value} [array get make] { if {$value} { lappend triggers $item } } foreach fname {PKGROOT pkg toadkit.c toadkit.h toadkit.vfs kitcrypt.c} { if {[file exists [file join $CWD $fname]]} { file delete -force [file join $CWD $fname] } } foreach file [glob -nocomplain $CWD/pkg/*] { file delete -force $file } foreach file [glob -nocomplain $CWD/build/*] { file delete -force $file } foreach file [glob -nocomplain $CWD/objs/*] { file delete -force $file } #foreach {item fname} [array get ::target] { # if {[file exists $fname]} { # file delete $fname # } #} # Re-apply triggers ::practcl::trigger {*}$triggers } if {$make(distclean)} { # Clean all source code back to it's pristine state from fossil foreach item [BASEKIT link list package] { $item go set projdir [$item define get localsrcdir] if {$projdir ne {} && [file exists $projdir]} { fossil $projdir clean -force } } } file mkdir [file join $CWD build] if {$make(upgrade)} { set INSTALLDIR [BASEKIT define get installdir] foreach item {tclconfig tcl tk critcl sqlite} { set obj [::practcl::LOCAL tool $item] $obj update } foreach item [BASEKIT link list package] { puts [list Updating $item [$item define get srcdir]] $item update } } if {$make(local-env)} { puts "BUILDING LOCAL TCL ENVIRONMENT" foreach item {tclconfig tcl tk critcl sqlite} { set obj [::practcl::LOCAL tool $item] puts [list $item $obj] if {[catch {$obj env-install} err errdat]} { puts *** puts [dict get $errdat -errorinfo] puts *** } } } if {$make(tcltk)} { BASEKIT build-tclcore } if {$make(practcl)} { set tclConfigObj [::practcl::LOCAL tool tclconfig] $tclConfigObj env-load } if {$make(odielib)} { BASEKIT project odielib clean BASEKIT project odielib compile } if {[lindex $argv 0] eq "package"} { #set result {} set INSTALLDIR [BASEKIT define get installdir] foreach item [lrange $argv 1 end] { set obj [BASEKIT project $item] puts [list build $item [$obj define get static] [info object class $obj]] if {[string is true [$obj define get static]]} { $obj compile } if {[string is true [$obj define get vfsinstall]]} { $obj install $INSTALLDIR } } #puts "RESULT: $result" } elseif {$make(packages)} { puts "CHECKING PACKAGE LIST" set INSTALLDIR [BASEKIT define get installdir] foreach item [BASEKIT link list package] { puts [list GENERATING $item [$item define get srcdir]] if {[string is true [$item define get static 0]]} { $item compile } if {[string is true [$item define get vfsinstall 1]]} { if {[catch {$item install $INSTALLDIR} error errdat]} { puts stderr "BUILD FAILURE $item" puts "FAILED TO INSTALL package $item" puts [dict get $errdat -errorinfo] exit 1 } } } } if {$make(basekit)} { BASEKIT implement $CWD if {![file exists [file join $CWD make.tcl]]} { set fout [open [file join $CWD make.tcl] w] puts $fout [list source [file join $::SRCDIR make.tcl]] close $fout } BASEKIT build-tclsh $target(basekit) BASEKIT } if {[lindex $argv 0] eq "wrap"} { BASEKIT wrap $CWD {*}[lrange $argv 1 end] } if {$make(toadkit)} { puts [list DEBUG: [BASEKIT define get debug 0]] set VFS [file join $CWD toadkit.vfs] file mkdir $VFS # Copy in our "secret squirrel" code #set SCMCOPY [list ::exec [BASEKIT define get tclkit_bare] [file join $::SRCDIR scripts scm-copy.tcl]] set SCMCOPY ::practcl::copyDir {*}$SCMCOPY [file join $::SRCDIR src] ${VFS} if {[BASEKIT define get debug 0]} { BASEKIT wrap $CWD toadkit_debug $VFS [file join $CWD PKGROOT] } else { BASEKIT wrap $CWD toadkit $VFS [file join $CWD PKGROOT] } } } err errdat]} { set logfile [file join $::CWD practcl.log] ::practcl::log $logfile "###\n# Error Trace\n###" ::practcl::log $logfile [dict get $errdat -errorinfo] ::practcl::log $logfile "###\n# DEBUG INFO\n###" ::practcl::log $logfile $::DEBUG_INFO puts stderr $err puts stderr "Failure logged to $logfile" exit 1 }