@ -273,8 +273,10 @@ apply { args {
set tm_additions_internal [ list ]
set tm_additions_dev [ list ]
set tm_additions_src [ list ]
set auto_path_additions_internal [ list ]
set auto_path_additions_dev [ list ]
set auto_path_additions_src [ list ]
set lc_auto_path [ string tolower $::auto_path ]
@ -357,47 +359,50 @@ apply { args {
# d e v - r e f e r s t o m o d u l e a n d l i b r a r y p a t h s r e l a t i v e t o t h e p r o j e c t ( e x e c u t a b l e p a t h )
# o s - r e f e r s t o m o d u l e s a n d l i b r a r y p a t h s g l e a n e d f r o m : : e n v ( T C L L I B P A T H a n d T C L < M A J O R > _ < M I N O R > _ T M _ P A T H )
# i n t e r n a l - r e f e r s t o m o d u l e s a n d l i b r a r i e s s u p p l i e d f r o m t h e m o u n t e d f i l e s y s t e m o f a k i t o r z i p f s b a s e d e x e c u t a b l e
# s r c - r e f e r s t o u n b u i l t m o d u l e s a n d l i b r a r i e s u n d e r t h e p r o j e c t ' s s r c / t r e e ( s r c / m o d u l e s , s r c / l i b , s r c / b o o t s u p p o r t , s r c / v e n d o r m o d u l e s )
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# N o t e t h a t u n l i k e s t a n d a r d ' p a c k a g e u n k n o w n ' p u n k : : l i b u n k n o w n d o e s n o t s t o p s e a r c h i n g f o r p a c k a g e s w h e n a . t m f i l e i s f o u n d t h a t m a t c h e s r e q u i r e m e n t s ,
# T h e a u t o _ p a t h i s s t i l l e x a m i n e d . ( a v o i d s q u i r k s w h e r e h i g h e r v e r s i o n e d p k g I n d e x b a s e d p a c k a g e n o t a l w a y s f o u n d )
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
set all_package_modes [ list dev os internal]
set all_package_modes [ list dev os internal src ]
# p a c k a g e _ m o d e i s s p e c i f i e d a s a d a s h - d e l i m i t e d o r d e r e d v a l u e e . g d e v - o s
# " i n t e r n a l " i s t h e d e f a u l t a n d i f n o t p r e s e n t i s a l w a y s a d d e d t o t h e l i s t
# i . e " d e v - o s " i s e q u i v a l e n t t o " d e v - o s - i n t e r n a l "
# " o s " i s e q u i v a l e n t t o " o s - i n t e r n a l "
# " i n t e r n a l - o s " a n d " i n t e r n a l " a r e l e f t a s i s .
# T h e e f f e c t i v e p a c k a g e _ m o d e h a s 1 2 o r 3 m e m b e r s .
# T h e e f f e c t i v e p a c k a g e _ m o d e h a s 1 2 3 o r 4 m e m b e r s .
# T h e o n l y c a s e w h e r e i t h a s 1 m e m b e r i s i f j u s t " i n t e r n a l " i s s p e c i f i e d .
# T h i s g i v e s t h e n u m b e r o f p e r m u t a t i o n s a s h o w m a n y w a y s t o c h o o s e 3 i t e m s p l u s h o w m a n y w a y s t o c h o o s e 2 o f t h e 3 i t e m s ( o n e m u s t b e ' i n t e r n a l ' ) p l u s t h e s o l e a l l o w a b l e w a y t o c h o o s e 1
# f o r a t o t a l o f 1 1 p o s s i b l e f i n a l o r d e r i n g s .
# ( 1 6 p o s s i b l e v a l u e s f o r p a c k a g e _ m o d e a r g u m e n t w h e n y o u i n c l u d e t h e s h o r t - f o r m s " " , o s , d e v , o s - d e v , d e v - o s w h i c h a l w a y s h a v e ' i n t e r n a l ' a p p e n d e d )
set test_package_mode [ lindex $args 0 ]
# p u t s s t d e r r " m a i n . t c l t e s t _ p a c k a g e _ m o d e : ' $ t e s t _ p a c k a g e _ m o d e ' "
switch - exact - - $test_package_mode {
internal -
os-internal - dev-internal - internal-os - internal-dev -
os-dev-internal - os-internal-dev - dev-os-internal - dev-internal-os - internal-os-dev - internal-dev-os {
# f u l l y s p e c i f i e d ( ' i n t e r n a l ' i s p r e s e n t )
set package_modes [ split $test_package_mode - ]
set arglist [ lrange $args 1 end]
# T o k e n - b y - t o k e n v a l i d a t i o n : i n s t e a d o f e x h a u s t i v e l y l i s t i n g a l l p e r m u t a t i o n s ,
# s p l i t t h e f i r s t a r g o n d a s h a n d v a l i d a t e e a c h t o k e n a g a i n s t t h e k n o w n m o d e s e t .
# T h i s s c a l e s t o a n y n u m b e r o f m o d e s w i t h o u t e n u m e r a t i n g e v e r y p e r m u t a t i o n .
set package_modes " "
set arglist " "
if { $test_package_mode eq " " } {
# e m p t y f i r s t a r g c o n s u m e d a s e q u i v a l e n t o f ' i n t e r n a l '
set package_modes internal
set arglist [ lrange $args 1 end]
} else {
set tokens [ split $test_package_mode - ]
set valid 1
foreach t $tokens {
if { $t ni $all_package_modes } {
set valid 0
break
}
}
os - dev - os-dev - dev-os {
# p a r t i a l l y s p e c i f i e d - ' i n t e r n a l ' o m m i t t e d b u t i m p l i e d a t t a i l
set package_modes [ list { * } [ split $test_package_mode - ] internal]
if { $valid && [ llength $tokens ] >= 1 } {
set package_modes $tokens
if { " i n t e r n a l " ni $package_modes } {
lappend package_modes internal
}
set arglist [ lrange $args 1 end]
}
default {
# e m p t y f i r s t a r g - o r s o m e u n r e l a t e d a r g
} else {
# n o t a p a c k a g e _ m o d e - t r e a t a s s u b c o m m a n d
set package_modes internal
if { $test_package_mode eq " " } {
# c o n s u m e t h e e m p t y f i r s t a r g a s a n e q u i v a l e n t o f ' i n t e r n a l '
# d o n ' t c o n s u m e a n y f i r s t a r g t h a t i s n ' t r e c o g n i s e d a s a p a c k a g e _ m o d e
set arglist [ lrange $args 1 end]
} else {
set arglist $args
}
set arglist $args
}
}
# a s s e r t : a r g l i s t h a s h a d a n y f i r s t a r g t h a t i s a p a c k a g e _ m o d e ( i n c l u d i n g e m p t y s t r i n g ) s t r i p p e d .
@ -532,6 +537,54 @@ apply { args {
}
}
# s r c m o d e : d i s c o v e r t h e p r o j e c t ' s s r c / t r e e a n d a d d u n b u i l t m o d u l e p a t h s .
# U n l i k e d e v m o d e ( w h i c h p o i n t s a t b u i l t o u t p u t i n < p r o j e c t r o o t > / m o d u l e s ) ,
# s r c m o d e p o i n t s a t t h e u n b u i l t s o u r c e i n < p r o j e c t r o o t > / s r c / m o d u l e s e t c .
if { " s r c " in $package_modes } {
# r e u s e t h e d e v - m o d e p r o j e c t r o o t d i s c o v e r y ( e x e i n b i n / - > b a c k t r a c k 1 )
set src_project_root " "
set normexe_dir_for_src [ file dirname $normexe ]
if { [ file tail $normexe_dir_for_src ] eq " b i n " } {
set src_project_root [ file dirname $normexe_dir_for_src ]
} else {
set src_project_root $normexe_dir_for_src
}
# a l s o c h e c k s y m l i n k t a r g e t
if { $src_project_root eq " " } {
set nameexe_dir_for_src [ file dirname [ file normalize [ info nameofexecutable] ] ]
if { [ file tail $nameexe_dir_for_src ] eq " b i n " } {
set src_project_root [ file dirname $nameexe_dir_for_src ]
} else {
set src_project_root $nameexe_dir_for_src
}
}
if { $src_project_root ne " " && [ file isdirectory [ file join $src_project_root src] ] } {
foreach p [ list modules modules_tcl$tclmajorv ] {
set modpath [ file join $src_project_root src $p ]
if { [ file isdirectory $modpath ] && $modpath ni $tm_additions_src } {
lappend tm_additions_src $modpath
}
}
# b o o t s u p p o r t m o d u l e s ( f o r b o o t - c r i t i c a l p a c k a g e s l i k e p u n k c h e c k , p u n k : : m i x e t c )
foreach p [ list modules modules_tcl$tclmajorv ] {
set modpath [ file join $src_project_root src bootsupport $p ]
if { [ file isdirectory $modpath ] && $modpath ni $tm_additions_src } {
lappend tm_additions_src $modpath
}
}
# v e n d o r m o d u l e s ( v e n d o r e d d e p e n d e n c i e s l i k e v o o )
foreach p [ list vendormodules vendormodules_tcl$tclmajorv ] {
set modpath [ file join $src_project_root src $p ]
if { [ file isdirectory $modpath ] && $modpath ni $tm_additions_src } {
lappend tm_additions_src $modpath
}
}
} else {
puts stderr " W a r n i n g - s r c m o d e : n o s r c / d i r e c t o r y f o u n d r e l a t i v e t o e x e c u t a b l e ( $ n o r m e x e _ d i r _ f o r _ s r c ) "
}
}
@ -595,6 +648,13 @@ apply { args {
}
}
}
src {
foreach n $tm_additions_src {
if { $n ni $new_tm_path } {
lappend new_tm_path $n
}
}
}
os {
foreach n $external_tm_dirs {
if { $n ni $new_tm_path } {
@ -698,6 +758,42 @@ apply { args {
}
}
# s r c m o d e : a d d u n b u i l t s o u r c e l i b r a r y p a t h s f r o m t h e p r o j e c t ' s s r c / t r e e .
if { " s r c " in $package_modes && [ info exists src_project_root] && $src_project_root ne " " } {
set platform [ : : punkboot : : platform_generic]
set src_lib_base [ file join $src_project_root src]
# s r c / l i b a n d s r c / l i b _ t c l < t c l m a j o r > ( e d i t a b l e l i b r a r y s o u r c e )
foreach libsub [ list lib_tcl$tclmajorv lib] {
set libfolder [ file join $src_lib_base $libsub ]
if { [ file isdirectory $libfolder ] } {
if { [ string match lib_tcl* [ file tail $libfolder ] ] } {
if { [ file exists $libfolder / allplatforms] } {
lappend auto_path_additions_src $libfolder / allplatforms
}
if { [ file exists $libfolder / $platform ] } {
lappend auto_path_additions_src $libfolder / $platform
}
} else {
lappend auto_path_additions_src $libfolder
}
}
}
# s r c / b o o t s u p p o r t / l i b ( b o o t s t r a p l i b r a r i e s )
set src_bs_lib [ file join $src_lib_base bootsupport lib]
if { [ file isdirectory $src_bs_lib ] } {
if { $src_bs_lib ni $auto_path_additions_src } {
lappend auto_path_additions_src $src_bs_lib
}
}
# s r c / b o o t s u p p o r t / l i b / t c l < t c l m a j o r > / < a r c h > ( p l a t f o r m - s p e c i f i c b o o t s t r a p l i b r a r i e s )
set src_bs_lib_arch [ file join $src_lib_base bootsupport lib tcl$tclmajorv $platform ]
if { [ file isdirectory $src_bs_lib_arch ] } {
if { $src_bs_lib_arch ni $auto_path_additions_src } {
lappend auto_path_additions_src $src_bs_lib_arch
}
}
}
# - - - - - - - - - - - - - - - - - - - - - - -
# s p l i t e x i s t i n g : : a u t o _ p a t h e n t r i e s i n t o i n t e r n a l & e x t e r n a l
set internal_ap_dirs [ list ] ; #
@ -743,6 +839,13 @@ apply { args {
}
}
}
src {
foreach n $auto_path_additions_src {
if { $n ni $new_auto_path } {
lappend new_auto_path $n
}
}
}
os {
foreach n $external_ap_dirs {
if { $n ni $new_auto_path } {
@ -900,6 +1003,84 @@ apply { args {
# a s s e r t a r g l i s t h a s h a d ' d e v | o s | o s - d e v e t c ' f i r s t a r g r e m o v e d i f i t w a s p r e s e n t .
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# s r c m o d e : r e g i s t e r # m o d p o d m o d u l e s f r o m s r c / m o d u l e s v i a p a c k a g e i f n e e d e d
# a n d s e t p a c k a g e p r e f e r l a t e s t s o 9 9 9 9 9 9 . 0 a 1 . 0 d e v m o d u l e s a r e p r e f e r r e d
# o v e r s t a b l e b o o t s u p p o r t / v e n d o r e d c o p i e s o n u n v e r s i o n e d p a c k a g e r e q u i r e .
# U s e s o n l y T c l b u i l t i n s ( g l o b , f i l e , s t r i n g ) s i n c e n o p u n k m o d u l e s a r e l o a d e d y e t .
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if { " s r c " in $package_modes && [ info exists src_project_root] && $src_project_root ne " " } {
# p a c k a g e p r e f e r l a t e s t i s s e t h e r e s o 9 9 9 9 9 9 . 0 a 1 . 0 d e v m o d u l e s a r e p r e f e r r e d
# o v e r s t a b l e b o o t s u p p o r t / v e n d o r e d c o p i e s o n u n v e r s i o n e d p a c k a g e r e q u i r e .
# T h i s m u s t b e s e t a f t e r l i b u n k n o w n : : i n i t ( w h i c h m a y r e s e t t h e p r e f e r e n c e t o s t a b l e )
# a n d b e f o r e a n y p a c k a g e r e q u i r e c a l l s i n t h e s u b c o m m a n d h a n d l e r b e l o w .
# W e s e t i t a g a i n j u s t b e f o r e s u b c o m m a n d d i s p a t c h t o e n s u r e i t i s n ' t o v e r r i d d e n .
# i n l i n e # m o d p o d s c a n n e r — e q u i v a l e n t t o p u n k : : t c l t e s t r u n : : t m _ p a t h _ a d d i t i o n a l _ i f n e e d e d
# b u t u s i n g o n l y T c l b u i l t i n s s i n c e p u n k : : p a t h i s n ' t l o a d e d a t b o o t t i m e .
set src_modules_dir [ file join $src_project_root src modules]
set modpod_count 0
if { [ file isdirectory $src_modules_dir ] } {
# r e c u r s i v e g l o b f o r # m o d p o d - * d i r e c t o r i e s ( T c l 8 . 6 + s u p p o r t s * * i n g l o b )
set modpod_dirs [ list ]
foreach found [ glob - nocomplain - type d - directory $src_modules_dir ** # modpod-* ] {
# s k i p _ b u i l d s u b d i r e c t o r i e s
if { [ string match " * _ b u i l d * " $found ] } { continue }
lappend modpod_dirs $found
}
foreach modpod_dir $modpod_dirs {
set tail [ file tail $modpod_dir ]
# d i r e c t o r y n a m e f o r m a t : # m o d p o d - < m o d n a m e > - < v e r s i o n >
# s t r i p l e a d i n g " # m o d p o d - " ( 8 c h a r s ) , t h e n s p l i t o n l a s t " - " t o s e p a r a t e m o d n a m e f r o m v e r s i o n
set rest [ string range $tail 8 end]
set last_dash [ string last " - " $rest ]
if { $last_dash < 0 } { continue }
set modname [ string range $rest 0 [ expr { $last_dash - 1 } ] ]
set modver [ string range $rest [ expr { $last_dash + 1 } ] end]
set modpath [ file join $modpod_dir " $ m o d n a m e - $ m o d v e r . t m " ]
# c o m p u t e f u l l y q u a l i f i e d m o d u l e n a m e f r o m p a t h r e l a t i v e t o s r c / m o d u l e s
# f i l e r e l a t i v e i s n ' t a v a i l a b l e i n a l l T c l b u i l d s a t b o o t t i m e , s o c o m p u t e m a n u a l l y
set reldir " "
set checkdir $modpod_dir
set base $src_modules_dir
# w a l k u p f r o m m o d p o d _ d i r u n t i l w e r e a c h s r c / m o d u l e s , c o l l e c t i n g p a t h c o m p o n e n t s
while { $checkdir ne $base && $checkdir ne " " } {
set reldir [ linsert $reldir 0 [ file tail $checkdir ] ]
set checkdir [ file dirname $checkdir ]
}
if { $reldir eq " " } {
set fullmodname $modname
} else {
set fullmodname [ join $reldir : : ] : : $modname
}
if { [ file exists $modpath ] } {
eval [ list package ifneeded $fullmodname $modver [ list source $modpath ] ]
incr modpod_count
}
}
if { $modpod_count > 0 } {
puts stderr " s r c m o d e : r e g i s t e r e d $ m o d p o d _ c o u n t # m o d p o d m o d u l e [ e x p r { $ m o d p o d _ c o u n t = = 1 ? " " : " s " } ] f r o m $ s r c _ m o d u l e s _ d i r "
}
}
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# s r c m o d e : s e t p a c k a g e p r e f e r l a t e s t a s l a t e a s p o s s i b l e ( a f t e r l i b u n k n o w n : : i n i t
# w h i c h m a y r e s e t i t t o s t a b l e ) s o 9 9 9 9 9 9 . 0 a 1 . 0 d e v m o d u l e s a r e p r e f e r r e d o v e r
# s t a b l e b o o t s u p p o r t / v e n d o r e d c o p i e s o n u n v e r s i o n e d p a c k a g e r e q u i r e .
if { " s r c " in $package_modes } {
package prefer latest
# F o r c e a s c a n o f a l l t c l : : t m : : l i s t p a t h s b y t r i g g e r i n g p a c k a g e u n k n o w n .
# T h e V F S - b u n d l e d s t a b l e v e r s i o n s ( e . g p u n k 0 . 1 . 1 ) a r e a l r e a d y r e g i s t e r e d
# f r o m T c l ' s i n i t , s o p a c k a g e r e q u i r e f o r t h o s e p a c k a g e s w o u l d n e v e r c a l l
# p a c k a g e u n k n o w n — m e a n i n g 9 9 9 9 9 9 . 0 a 1 . 0 d e v v e r s i o n s i n s r c / m o d u l e s w o u l d
# n e v e r b e d i s c o v e r e d . T h i s d u m m y r e q u i r e f o r c e s p a c k a g e u n k n o w n t o s c a n
# a l l t m p a t h s a n d r e g i s t e r a l l i f n e e d e d s c r i p t s , i n c l u d i n g t h e d e v v e r s i o n s .
# A f t e r t h i s , p a c k a g e p r e f e r l a t e s t w i l l s e l e c t 9 9 9 9 9 9 . 0 a 1 . 0 o v e r 0 . 1 . 1 .
catch { package require __src_mode_tm_scan__}
}
# t c l s h , s h e l l s p y , p u n k , s c r i p t , s h e l l
set subcommand [ lindex $arglist 0 ]
switch - - $subcommand {