You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
4.1 KiB
100 lines
4.1 KiB
#puts stdout "launching punk" |
|
set dirname [file dirname [file normalize [info script]]] |
|
if {[file tail $dirname] eq "bin"} { |
|
lassign [split [info tclversion] .] tclmajorv tclminorv |
|
#we shouldn't try to call into the ../src/vfs/* folders - as they are 'partials' |
|
#instead we call into one of the ../src/_build/exename.vfs folders |
|
|
|
if {"windows" eq $::tcl_platform(platform)} { |
|
set ext ".exe" |
|
} else { |
|
set ext "" |
|
} |
|
switch -- $tclmajorv { |
|
8 { |
|
set vfsfolder [file normalize [file join $dirname "../src/_build/punk86${ext}.vfs"]] |
|
} |
|
9 { |
|
set vfsfolder [file normalize [file join $dirname "../src/_build/punk9cook${ext}.vfs"]] |
|
} |
|
default { |
|
error "no vfs available for tcl major version $tclmajorv" |
|
} |
|
} |
|
set launchpath [file join $vfsfolder main.tcl] |
|
if {[file exists [file join $dirname $launchpath]]} { |
|
#tclsh [file join $dirname $launchpath] {*}$::argv |
|
namespace eval ::punkboot { |
|
#this drop-box style interaction is not pretty.. |
|
#variable vfs_entry_point |
|
#set vfs_entry_point $launchpath ;#tell a cooperating main.tcl what's going on |
|
variable internal_paths |
|
#set internal_paths [list [info library] $vfscommonfolder $vfsfolder] |
|
set internal_paths [list [file dirname [file dirname [info nameofexecutable]]]] |
|
} |
|
source [file join $dirname $launchpath] |
|
} else { |
|
#todo - tidy up - we don't use fauxlinks in src/vfs/xxx.vfs anymore |
|
# - but we may want to fauxlink the active exe vfs above? REVIEW |
|
set failed 1 |
|
set tried_list [list $launchpath] |
|
set fauxlinks [glob -nocomplain -dir $vfsfolder -type f main.tcl#*.fxlnk main.tcl#*.fauxlink] |
|
#puts stderr "globbed in $vfsfolder result: $fauxlinks" |
|
if {[llength $fauxlinks] >= 1} { |
|
set vfscommonfolder [file join [file dirname $vfsfolder] _vfscommon.vfs] |
|
#review - we don't know what other vfs folder might make up the unbuild vfs |
|
#_vfscommon.vfs is standard - REVIEW |
|
foreach vfs [list $vfscommonfolder $vfsfolder] { |
|
if {[file exists $vfs/modules]} { |
|
tcl::tm::add $vfs/modules |
|
} |
|
if {[file exists $vfs/modules_tcl${tclmajorv}]} { |
|
tcl::tm::add $vfs/modules_tcl${tclmajorv} |
|
} |
|
if {[file exists $vfs/lib]} { |
|
lappend ::auto_path $vfs/lib |
|
} |
|
} |
|
if {![catch {package require fauxlink} errM]} { |
|
set maintcl_fauxlink [lindex $fauxlinks 0] |
|
set fdict [fauxlink::resolve $maintcl_fauxlink] |
|
set tags [dict get $fdict tags] |
|
#puts stdout "trying fauxlink: $fdict" |
|
if {[dict get $fdict name] eq "main.tcl" && "punk::boot,merge_over" in "$tags"} { |
|
set target [dict get $fdict targetpath] |
|
if {[file pathtype $target] eq "relative"} { |
|
set targetfile [file join $vfsfolder $target] |
|
} else { |
|
set targetfile $target |
|
} |
|
set targetfile [file normalize $targetfile] |
|
puts stdout "trying fauxlinked file: $targetfile" |
|
if {[file exists $targetfile]} { |
|
namespace eval ::punkboot { |
|
#this drop-box style interaction is not pretty.. |
|
variable vfs_entry_point |
|
set vfs_entry_point $launchpath ;#tell a cooperating main.tcl what's going on |
|
variable internal_paths |
|
set internal_paths [list $vfscommonfolder $vfsfolder] |
|
} |
|
set failed 0 |
|
source $targetfile |
|
} else { |
|
puts "fauxlink target: $targetfile doesn't seem to exist" |
|
} |
|
} |
|
} else { |
|
puts stderr "Couldn't load fauxlink package. Tried tm paths [list $vfscommonfolder/modules $vfsfolder/modules]" |
|
} |
|
} else { |
|
puts stderr "Couldn't find a fauxlink file as a fallback" |
|
} |
|
if {$failed} { |
|
puts stderr "Unable to locate punk${tclmajorv} entry-point main.tcl tried:[join $tried_list \n]" |
|
} |
|
} |
|
} else { |
|
puts stderr "punk launch script must be located in the punk bin folder" |
|
} |
|
#puts stdout "-done-" |
|
|
|
|