Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Comment: | New version of practcl. This version eliminates the separate family of classes for "tool" vs. "subproject". Now tools are subprojects of ::practcl::LOCAL, but environment interactions are handled through a separate env-* family of methods that track with the classes independently of the normal build methods. All tools inhabit the same global namespace (::practcl::OBJECT). Tools are installed to the prefix specified by the prefix define for ::practcl::LOCAL |
---|---|
Timelines: | family | ancestors | descendants | both | hypnotoad |
Files: | files | file ages | folders |
SHA3-256: |
c433cbd5e92fa26b05682ff245dc8c65 |
User & Date: | tne 2017-11-04 05:58:51 |
Original Comment: | New version of practcl. This version eliminates the seperate family of classes for "tool" vs. "subprojectt". Now tools are subprojects of ::practcl::LOCAL, but environment interactions are handled through a separate env-* family of methods that track with the classes independantly of the normal build methods. All tools inhabit the same global namespace (::practcl::OBJECT). Tools are installed to the prefix specified by the prefix define for ::practcl::LOCAL |
2017-11-04
| ||
09:26 | Practcl improvements: Better logging API. Local prefs file now affects behavior. Overhaul of how packages loaded to the local environment are dealt with. check-in: 54d2027e5a user: tne tags: hypnotoad | |
05:58 | New version of practcl. This version eliminates the separate family of classes for "tool" vs. "subproject". Now tools are subprojects of ::practcl::LOCAL, but environment interactions are handled through a separate env-* family of methods that track with the classes independently of the normal build methods. All tools inhabit the same global namespace (::practcl::OBJECT). Tools are installed to the prefix specified by the prefix define for ::practcl::LOCAL check-in: c433cbd5e9 user: tne tags: hypnotoad | |
2017-11-03
| ||
19:19 | Modifications to fix file path handing for MSYS Kit building check-in: e8ee0468c2 user: tne tags: hypnotoad | |
Changes to modules/practcl/practcl.tcl.
︙ | ︙ | |||
85 86 87 88 89 90 91 92 93 94 95 96 97 98 | set tclib_path $path lappend ::auto_path $path break } if {$tcllib_path ne {}} break } namespace eval ::practcl {} ### # END: setup.tcl ### ### # START: buildutil.tcl ### | > | 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | set tclib_path $path lappend ::auto_path $path break } if {$tcllib_path ne {}} break } namespace eval ::practcl {} namespace eval ::practcl::OBJECT {} ### # END: setup.tcl ### ### # START: buildutil.tcl ### |
︙ | ︙ | |||
1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 | ### ### # START: class metaclass.tcl ### ::oo::class create ::practcl::metaclass { superclass ::oo::object method define {submethod args} { my variable define switch $submethod { dump { return [array get define] } add { | > > > > | 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 | ### ### # START: class metaclass.tcl ### ::oo::class create ::practcl::metaclass { superclass ::oo::object method _MorphPatterns {} { return {{@name@} {::practcl::@name@} {::practcl::*@name@} {::practcl::*@name@*}} } method define {submethod args} { my variable define switch $submethod { dump { return [array get define] } add { |
︙ | ︙ | |||
1325 1326 1327 1328 1329 1330 1331 | } } method morph classname { my variable define if {$classname ne {}} { set map [list @name@ $classname] | | < < < < < < < < | 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 | } } method morph classname { my variable define if {$classname ne {}} { set map [list @name@ $classname] foreach pattern [string map $map [my _MorphPatterns]] { set pattern [string trim $pattern] set matches [info commands $pattern] if {![llength $matches]} continue set class [lindex $matches 0] break } set mixinslot {} |
︙ | ︙ | |||
1579 1580 1581 1582 1583 1584 1585 | } else { set PREFIX [my <project> define get prefix] } if {[my <project> define get CONFIG_SITE] != {}} { lappend opts --host=[my <project> define get HOST] } lappend opts --with-tclsh=[info nameofexecutable] | | | | 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 | } else { set PREFIX [my <project> define get prefix] } if {[my <project> define get CONFIG_SITE] != {}} { lappend opts --host=[my <project> define get HOST] } lappend opts --with-tclsh=[info nameofexecutable] set obj [my <project> tclcore] if {$obj ne {}} { lappend opts --with-tcl=[::practcl::file_relative [file normalize $builddir] [$obj define get builddir]] } if {[my define get tk 0]} { set obj [my <project> tkcore] if {$obj ne {}} { lappend opts --with-tk=[::practcl::file_relative [file normalize $builddir] [$obj define get builddir]] } } lappend opts {*}[my define get config_opts] if {![regexp -- "--prefix" $opts]} { lappend opts --prefix=$PREFIX --exec-prefix=$PREFIX |
︙ | ︙ | |||
1609 1610 1611 1612 1613 1614 1615 | #--disable-stubs # } else { lappend opts --enable-shared } return $opts } | | | 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 | #--disable-stubs # } else { lappend opts --enable-shared } return $opts } #method unpack {} { # ::practcl::distribution select [self] # my Unpack #} } |
︙ | ︙ | |||
1926 1927 1928 1929 1930 1931 1932 | } ### # Produce a static executable ### method build-tclsh {outfile PROJECT} { puts " BUILDING STATIC TCLSH " | | | | 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 | } ### # Produce a static executable ### method build-tclsh {outfile PROJECT} { puts " BUILDING STATIC TCLSH " set TCLOBJ [$PROJECT project tclcore] ::practcl::toolset select $TCLOBJ set PKG_OBJS {} foreach item [$PROJECT link list core.library] { if {[string is true [$item define get static]]} { lappend PKG_OBJS $item } } foreach item [$PROJECT link list package] { if {[string is true [$item define get static]]} { lappend PKG_OBJS $item } } array set TCL [$TCLOBJ config.sh] set TKOBJ [$PROJECT project tkcore] if {[info command $TKOBJ] eq {}} { set TKOBJ ::noop $PROJECT define set static_tk 0 } else { ::practcl::toolset select $TKOBJ array set TK [$TKOBJ config.sh] set do_tk [$TKOBJ define get static] |
︙ | ︙ | |||
2041 2042 2043 2044 2045 2046 2047 | set RCMAN [file join [$TCLOBJ define get builddir] tclsh.exe.manifest] } } foreach item [${PROJECT} define get resource_include] { lappend cmd --include [::practcl::file_relative $path [file normalize $item]] } lappend cmd [file tail $RCSRC] | > | > > | > | 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 | set RCMAN [file join [$TCLOBJ define get builddir] tclsh.exe.manifest] } } foreach item [${PROJECT} define get resource_include] { lappend cmd --include [::practcl::file_relative $path [file normalize $item]] } lappend cmd [file tail $RCSRC] if {![file exists [file join $path [file tail $RCSRC]]]} { file copy -force $RCSRC [file join $path [file tail $RCSRC]] } if {![file exists [file join $path [file tail $RCMAN]]]} { file copy -force $RCMAN [file join $path [file tail $RCMAN]] } ::practcl::doexec {*}$cmd lappend OBJECTS $RSOBJ set LDFLAGS_CONSOLE {-mconsole -pipe -static-libgcc} set LDFLAGS_WINDOW {-mwindows -pipe -static-libgcc} } else { set LDFLAGS_CONSOLE {} set LDFLAGS_WINDOW {} |
︙ | ︙ | |||
2229 2230 2231 2232 2233 2234 2235 | array set define [uplevel 1 [list subst $args]] my select } my initialize } | < < < < < < < < < < < < < < < < | 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 | array set define [uplevel 1 [list subst $args]] my select } my initialize } method child {method} { return {} } method go {} { ::practcl::debug [list [self] [self method] [self class] -- [my define get filename] [info object class [self]]] my variable links foreach {linktype objs} [array get links] { foreach obj $objs { $obj go } } ::practcl::debug [list /[self] [self method] [self class]] } } ### # END: class object.tcl ### ### # START: class dynamic.tcl |
︙ | ︙ | |||
2289 2290 2291 2292 2293 2294 2295 | foreach {f v} $argdat { dict set cstruct $name $f $v } if {![dict exists $cstruct $name public]} { dict set cstruct $name public 1 } } | | > > > > > > > | 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 | foreach {f v} $argdat { dict set cstruct $name $f $v } if {![dict exists $cstruct $name public]} { dict set cstruct $name public 1 } } method include header { my define add include $header } method include_dir args { my define add include_dir {*}$args } method include_directory args { my define add include_dir {*}$args } method c_header body { my variable code ::practcl::cputs code(header) $body } method c_code body { |
︙ | ︙ | |||
3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 | # In the end, all C code must be loaded into a module # This will either be a dynamically loaded library implementing # a tcl extension, or a compiled in segment of a custom shell/app ### ::oo::class create ::practcl::module { superclass ::practcl::object ::practcl::product.dynamic method add args { my variable links set object [::practcl::object new [self] {*}$args] foreach linktype [$object linktype] { lappend links($linktype) $object } return $object | > > > > | 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 | # In the end, all C code must be loaded into a module # This will either be a dynamically loaded library implementing # a tcl extension, or a compiled in segment of a custom shell/app ### ::oo::class create ::practcl::module { superclass ::practcl::object ::practcl::product.dynamic method _MorphPatterns {} { return {{@name@} {::practcl::module.@name@} ::practcl::module} } method add args { my variable links set object [::practcl::object new [self] {*}$args] foreach linktype [$object linktype] { lappend links($linktype) $object } return $object |
︙ | ︙ | |||
3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 | ### # START: class project baseclass.tcl ### ::oo::class create ::practcl::project { superclass ::practcl::module constructor args { my variable define if {[llength $args] == 1} { set rawcontents [lindex $args 0] } else { set rawcontents $args } | > > > > | 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 | ### # START: class project baseclass.tcl ### ::oo::class create ::practcl::project { superclass ::practcl::module method _MorphPatterns {} { return {{@name@} {::practcl::@name@} {::practcl::project.@name@} {::practcl::project}} } constructor args { my variable define if {[llength $args] == 1} { set rawcontents [lindex $args 0] } else { set rawcontents $args } |
︙ | ︙ | |||
3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 | my graft module [self] array set define $contents ::practcl::toolset select [self] my initialize } method add_project {pkg info {oodefine {}}} { set os [my define get TEACUP_OS] if {$os eq {}} { set os [::practcl::os] my define set os $os } set fossilinfo [list download [my define get download] tag trunk sandbox [my define get sandbox]] if {[dict exists $info os] && ($os ni [dict get $info os])} return | > | 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 | my graft module [self] array set define $contents ::practcl::toolset select [self] my initialize } method add_project {pkg info {oodefine {}}} { ::practcl::debug [self] add_project $pkg $info set os [my define get TEACUP_OS] if {$os eq {}} { set os [::practcl::os] my define set os $os } set fossilinfo [list download [my define get download] tag trunk sandbox [my define get sandbox]] if {[dict exists $info os] && ($os ni [dict get $info os])} return |
︙ | ︙ | |||
3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 | oo::objdefine $obj $oodefine $obj define set masterpath $::CWD $obj go return $obj } method add_tool {pkg info {oodefine {}}} { set info [dict merge [::practcl::local_os] $info] set os [dict get $info TEACUP_OS] set fossilinfo [list download [my define get download] tag trunk sandbox [my define get sandbox]] if {[dict exists $info os] && ($os ni [dict get $info os])} return # Select which tag to use here. # For production builds: tag-release set profile [my define get profile release]: if {[dict exists $info profile $profile]} { dict set info tag [dict get $info profile $profile] } | > > | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 | oo::objdefine $obj $oodefine $obj define set masterpath $::CWD $obj go return $obj } method add_tool {pkg info {oodefine {}}} { ::practcl::debug [self] add_tool $pkg $info set info [dict merge [::practcl::local_os] $info] set os [dict get $info TEACUP_OS] set fossilinfo [list download [my define get download] tag trunk sandbox [my define get sandbox]] if {[dict exists $info os] && ($os ni [dict get $info os])} return # Select which tag to use here. # For production builds: tag-release set profile [my define get profile release]: if {[dict exists $info profile $profile]} { dict set info tag [dict get $info profile $profile] } set obj ::practcl::OBJECT::TOOL.$pkg if {[info command $obj] eq {}} { set obj [::practcl::subproject create $obj [self] [dict merge $fossilinfo [list name $pkg pkg_name $pkg static 0] $info]] } my link add tool $obj oo::objdefine $obj $oodefine $obj define set masterpath $::CWD $obj go return $obj } method build-tclcore {} { set os [my define get TEACUP_OS] set tcl_config_opts [::practcl::platform::tcl_core_options $os] set tk_config_opts [::practcl::platform::tk_core_options $os] lappend tcl_config_opts --prefix [my define get prefix] --exec-prefix [my define get prefix] set tclobj [my tclcore] if {[my define get debug 0]} { $tclobj define set debug 1 lappend tcl_config_opts --enable-symbols=true } $tclobj define set config_opts $tcl_config_opts $tclobj go $tclobj compile set _TclSrcDir [$tclobj define get localsrcdir] my define set tclsrcdir $_TclSrcDir set tkobj [my tkcore] lappend tk_config_opts --with-tcl=[::practcl::file_relative [$tkobj define get builddir] [$tclobj define get builddir]] if {[my define get debug 0]} { $tkobj define set debug 1 lappend tk_config_opts --enable-symbols=true } $tkobj define set config_opts $tk_config_opts $tkobj compile } method child which { switch $which { organs { # A library can be a project, it can be a module. Any # subordinate modules will indicate their existance return [list project [self] module [self]] } |
︙ | ︙ | |||
3884 3885 3886 3887 3888 3889 3890 3891 | set obj [namespace current]::PROJECT.$pkg if {[llength $args]==0} { return $obj } ${obj} {*}$args } method tool {pkg args} { | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 | set obj [namespace current]::PROJECT.$pkg if {[llength $args]==0} { return $obj } ${obj} {*}$args } method tclcore {} { if {[info commands [set obj [my organ tclcore]]] ne {}} { return $obj } if {[info commands [set obj [my project TCLCORE]]] ne {}} { my graft tclcore $obj return $obj } if {[info commands [set obj [my project tcl]]] ne {}} { my graft tclcore $obj return $obj } if {[info commands [set obj [my tool tcl]]] ne {}} { my graft tclcore $obj return $obj } # Provide a fallback set obj [my add_tool tcl { tag release class subproject.core fossil_url http://core.tcl.tk/tcl }] my graft tclcore $obj return $obj } method tkcore {} { if {[set obj [my organ tkcore]] ne {}} { return $obj } if {[set obj [my project tk]] ne {}} { my graft tkcore $obj return $obj } if {[set obj [my tool tk]] ne {}} { my graft tkcore $obj return $obj } # Provide a fallback set obj [my add_tool tk { tag release class tool.core fossil_url http://core.tcl.tk/tk }] my graft tkcore $obj return $obj } method tool {pkg args} { set obj ::practcl::OBJECT::TOOL.$pkg if {[llength $args]==0} { return $obj } ${obj} {*}$args } } |
︙ | ︙ | |||
4432 4433 4434 4435 4436 4437 4438 | set PROJECT [self] set os [$PROJECT define get TEACUP_OS] if {[my define get SHARED_BUILD]} { puts [list BUILDING TCLSH FOR OS $os] } else { puts [list BUILDING KIT FOR OS $os] } | | | 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 | set PROJECT [self] set os [$PROJECT define get TEACUP_OS] if {[my define get SHARED_BUILD]} { puts [list BUILDING TCLSH FOR OS $os] } else { puts [list BUILDING KIT FOR OS $os] } set TCLOBJ [$PROJECT tclcore] ::practcl::toolset select $TCLOBJ set TCLSRCDIR [$TCLOBJ define get srcdir] set PKG_OBJS {} foreach item [$PROJECT link list core.library] { if {[string is true [$item define get static]]} { lappend PKG_OBJS $item |
︙ | ︙ | |||
4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 | ### ### # START: class subproject baseclass.tcl ### oo::class create ::practcl::subproject { superclass ::practcl::module method child which { switch $which { organs { # A library can be a project, it can be a module. Any # subordinate modules will indicate their existance return [list project [self] module [self]] } | > > > > | 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 | ### ### # START: class subproject baseclass.tcl ### oo::class create ::practcl::subproject { superclass ::practcl::module method _MorphPatterns {} { return {{::practcl::subproject.@name@} {::practcl::@name@} {@name@} {::practcl::subproject}} } method child which { switch $which { organs { # A library can be a project, it can be a module. Any # subordinate modules will indicate their existance return [list project [self] module [self]] } |
︙ | ︙ | |||
5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 | method linker-products {configdict} {} method linker-external {configdict} { if {[dict exists $configdict PRACTCL_PKG_LIBS]} { return [dict get $configdict PRACTCL_PKG_LIBS] } } method sources {} {} method unpack {} { ::practcl::distribution select [self] my Unpack ::practcl::toolset select [self] | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 | method linker-products {configdict} {} method linker-external {configdict} { if {[dict exists $configdict PRACTCL_PKG_LIBS]} { return [dict get $configdict PRACTCL_PKG_LIBS] } } ### # Methods for packages/tools that can be downloaded # possibly built and used internally by this Practcl # process ### ### # Load the facility into the interpreter ### method env-bootstrap {} { set pkg [my define get pkg_name [my define get name]] package require $pkg } ### # Return a file path that exec can call ### method env-exec {} {} ### # Install the tool into the local environment ### method env-install {} { my unpack } ### # Do whatever is necessary to get the tool # into the local environment ### method env-load {} { my variable loaded if {[info exists loaded]} { return 0 } if {![my env-present]} { my env-install } my env-bootstrap set loaded 1 } ### # Check if tool is available for load/already loaded ### method env-present {} { set pkg [my define get pkg_name [my define get name]] if {[catch [list package require $pkg]]} { return 0 } return 1 } method sources {} {} method unpack {} { ::practcl::distribution select [self] my Unpack ::practcl::toolset select [self] |
︙ | ︙ | |||
5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 | ### # A project which the kit compiles and integrates # the source for itself ### oo::class create ::practcl::subproject.source { superclass ::practcl::subproject ::practcl::library method linktype {} { return {subordinate package source} } } # a copy from the teapot oo::class create ::practcl::subproject.teapot { superclass ::practcl::subproject | > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > > < < < < < < < < | > | > > > > > > > > > > | | 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 | ### # A project which the kit compiles and integrates # the source for itself ### oo::class create ::practcl::subproject.source { superclass ::practcl::subproject ::practcl::library method env-bootstrap {} { set LibraryRoot [file join [my define get srcdir] [my define get module_root modules]] if {[file exists $LibraryRoot] && $LibraryRoot ni $::auto_path} { set ::auto_path [linsert $::auto_path 0 $LibraryRoot] } } method env-present {} { return [file exists [my define get srcdir]] } method linktype {} { return {subordinate package source} } } # a copy from the teapot oo::class create ::practcl::subproject.teapot { superclass ::practcl::subproject method env-bootstrap {} { set pkg [my define get pkg_name [my define get name]] package require $pkg } method env-install {} { set pkg [my define get pkg_name [my define get name]] set download [my <project> define get download] my unpack set prefix [string trimleft [my <project> define get prefix] /] ::practcl::tcllib_require zipfile::decode ::zipfile::decode::unzipfile [file join $download $pkg.zip] [file join $prefix lib $pkg] } method env-present {} { set pkg [my define get pkg_name [my define get name]] if {[catch [list package require $pkg]]} { return 0 } return 1 } method install DEST { set pkg [my define get pkg_name [my define get name]] set download [my <project> define get download] my unpack set prefix [string trimleft [my <project> define get prefix] /] ::practcl::tcllib_require zipfile::decode ::zipfile::decode::unzipfile [file join $download $pkg.zip] [file join $DEST $prefix lib $pkg] } } oo::class create ::practcl::subproject.kettle { superclass ::practcl::subproject method kettle {path args} { my variable kettle if {![info exists kettle]} { ::pratcl::LOCAL tool kettle load set kettle [file join [::pratcl::LOCAL tool kettle define get srcdir] kettle] } set srcdir [my SourceRoot] ::pratcl::dotclexec $kettle -f [file join $srcdir build.tcl] {*}$args } method install DEST { my kettle reinstall --prefix $DEST } } oo::class create ::practcl::subproject.critcl { superclass ::practcl::subproject method install DEST { my critcl -pkg [my define get name] set srcdir [my SourceRoot] ::pratcl::copyDir [file join $srcdir [my define get name]] [file join $DEST lib [my define get name]] } } oo::class create ::practcl::subproject.sak { superclass ::practcl::subproject method env-install {} { ### # Handle teapot installs ### set pkg [my define get pkg_name [my define get name]] my unpack set prefix [my <project> define get prefix [file normalize [file join ~ tcl]]] set srcdir [my define get srcdir] ::practcl::dotclexec [file join $srcdir installer.tcl] \ -apps -app-path [file join $prefix apps] \ -html -html-path [file join $prefix doc html $pkg] \ -pkg-path [file join $prefix lib $pkg] \ -no-nroff -no-wait -no-gui } method install DEST { ### # Handle teapot installs ### set pkg [my define get pkg_name [my define get name]] my unpack set prefix [string trimleft [my <project> define get prefix] /] |
︙ | ︙ | |||
5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 | ### ### # A binary package ### oo::class create ::practcl::subproject.binary { superclass ::practcl::subproject method clean {} { set builddir [file normalize [my define get builddir]] if {![file exists $builddir]} return if {[file exists [file join $builddir make.tcl]]} { ::practcl::domake.tcl $builddir clean } else { ::practcl::domake $builddir clean } } method project-compile-products {} {} method ComputeInstall {} { if {[my define exists install]} { switch [my define get install] { static { | > > > > > > > > > > > > > > > > > > > | 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 | ### ### # A binary package ### oo::class create ::practcl::subproject.binary { superclass ::practcl::subproject method clean {} { set builddir [file normalize [my define get builddir]] if {![file exists $builddir]} return if {[file exists [file join $builddir make.tcl]]} { ::practcl::domake.tcl $builddir clean } else { ::practcl::domake $builddir clean } } method env-install {} { ### # Handle tea installs ### set pkg [my define get pkg_name [my define get name]] set os [::practcl::local_os] my define set os $os my unpack set prefix [my <project> define get prefix [file normalize [file join ~ tcl]]] set srcdir [my define get srcdir] lappend options --prefix $prefix --exec-prefix $prefix my define set config_opts $options my go my clean my compile ::practcl::domake [my define get builddir] install } method project-compile-products {} {} method ComputeInstall {} { if {[my define exists install]} { switch [my define get install] { static { |
︙ | ︙ | |||
5211 5212 5213 5214 5215 5216 5217 5218 | } return $result } method BuildDir {PWD} { set name [my define get name] set debug [my define get debug 0] if {$debug} { | > > > > | | | 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 | } return $result } method BuildDir {PWD} { set name [my define get name] set debug [my define get debug 0] set project [my organ project] if {[$project define get LOCAL 0]} { return [my define get builddir [file join $PWD local $name]] } if {$debug} { return [my define get builddir [file join $PWD debug $name]] } else { return [my define get builddir [file join $PWD pkg $name]] } } method compile {} { set name [my define get name] set PWD $::CWD cd $PWD |
︙ | ︙ | |||
5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 | puts "autoconf -f $input > [file join $srcdir configure]" exec autoconf -f $input > [file join $srcdir configure] } } cd $pwd } } oo::class create ::practcl::subproject.library { superclass ::practcl::subproject.binary ::practcl::library method install DEST { my compile } } | > > > > > | 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 | puts "autoconf -f $input > [file join $srcdir configure]" exec autoconf -f $input > [file join $srcdir configure] } } cd $pwd } } oo::class create ::practcl::subproject.tea { superclass ::practcl::subproject.binary } oo::class create ::practcl::subproject.library { superclass ::practcl::subproject.binary ::practcl::library method install DEST { my compile } } |
︙ | ︙ | |||
5421 5422 5423 5424 5425 5426 5427 | superclass ::practcl::subproject.binary # On the windows platform MinGW must build # from the platform directory in the source repo #method BuildDir {PWD} { # return [my define get localsrcdir] #} | < < < < < < < | < | 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 | superclass ::practcl::subproject.binary # On the windows platform MinGW must build # from the platform directory in the source repo #method BuildDir {PWD} { # return [my define get localsrcdir] #} method Configure {} { if {[my define get USEMSVC 0]} { return } set opts [my ConfigureOpts] set builddir [file normalize [my define get builddir]] set localsrcdir [file normalize [my define get localsrcdir]] |
︙ | ︙ | |||
5461 5462 5463 5464 5465 5466 5467 | if {![regexp -- "--prefix" $opts]} { lappend opts --prefix=$PREFIX } #--exec_prefix=$PREFIX lappend opts --disable-shared return $opts } | | > > > > > > > > > > > > > > > > > > > > > > > > > > > | 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 | if {![regexp -- "--prefix" $opts]} { lappend opts --prefix=$PREFIX } #--exec_prefix=$PREFIX lappend opts --disable-shared return $opts } method env-present {} { return 0 } method env-install {} { my unpack set os [::practcl::local_os] switch [my define get name] { tcl { set options [::practcl::platform::tcl_core_options $os] } tk { set options [::practcl::platform::tk_core_options $os] } default { set options {} } } set prefix [my <project> define get prefix [file normalize [file join ~ tcl]]] lappend options --prefix $prefix --exec-prefix $prefix my define set config_opts $options my go my compile ::practcl::domake [my define get builddir] install } method go {} { set name [my define get name] set os [my <project> define get TEACUP_OS] ::practcl::distribution select [self] my ComputeInstall set srcdir [my SrcDir] |
︙ | ︙ | |||
5510 5511 5512 5513 5514 5515 5516 | ### # END: class subproject core.tcl ### ### # START: class tool.tcl ### | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | | | | > > > > > > | > | | | > > > > > > | 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 | ### # END: class subproject core.tcl ### ### # START: class tool.tcl ### ### # Create an object to represent the local environment ### set ::practcl::MAIN ::practcl::LOCAL # Defer the creation of the ::pratcl::LOCAL object until it is called # in order to allow packages to set ::auto_index(::practcl::LOCAL) { ::practcl::project create ::practcl::LOCAL ::practcl::LOCAL define set [::practcl::local_os] ::practcl::LOCAL define set prefix [file normalize [file join ~ tcl]] ::practcl::LOCAL define set LOCAL 1 # Until something better comes along, use ::practcl::LOCAL # as our main project # Add tclconfig as a project of record ::practcl::LOCAL add_tool tclconfig { name tclconfig tag practcl class subproject.source fossil_url http://core.tcl.tk/tclconfig } # Add tcllib as a project of record ::practcl::LOCAL add_tool tcllib { tag trunk class sak fossil_url http://core.tcl.tk/tcllib } ::practcl::LOCAL add_tool kettle { tag trunk class sak fossil_url http://fossil.etoyoc.com/fossil/kettle } ::practcl::LOCAL add_tool tclvfs { tag trunk class tea fossil_url http://fossil.etoyoc.com/fossil/tclvfs } ::practcl::LOCAL add_tool critcl { tag master class subproject.binary git_url http://github.com/andreas-kupries/critcl modules lib } { method env-install {} { my unpack set prefix [my <project> define get prefix [file join [file normalize ~] tcl]] set srcdir [my define get srcdir] ::practcl::dotclexec [file join $srcdir build.tcl] install [file join $prefix lib] } } ::practcl::LOCAL add_tool odie { tag trunk class subproject.source fossil_url http://fossil.etoyoc.com/fossil/odie } ::practcl::LOCAL add_tool tcl { tag release class subproject.core fossil_url http://core.tcl.tk/tcl } ::practcl::LOCAL add_tool tk { tag release class subproject.core fossil_url http://core.tcl.tk/tcl } ::practcl::LOCAL add_tool sqlite { tag practcl class subproject.tea pkg_name sqlite3 fossil_url http://fossil.etoyoc.com/fossil/sqlite } } ### # END: class tool.tcl ### namespace eval ::practcl { namespace export * } |
Changes to modules/practcl/src/class/dynamic.tcl.
︙ | ︙ | |||
16 17 18 19 20 21 22 | foreach {f v} $argdat { dict set cstruct $name $f $v } if {![dict exists $cstruct $name public]} { dict set cstruct $name public 1 } } | | > > > > > > > | 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 | foreach {f v} $argdat { dict set cstruct $name $f $v } if {![dict exists $cstruct $name public]} { dict set cstruct $name public 1 } } method include header { my define add include $header } method include_dir args { my define add include_dir {*}$args } method include_directory args { my define add include_dir {*}$args } method c_header body { my variable code ::practcl::cputs code(header) $body } method c_code body { |
︙ | ︙ |
Changes to modules/practcl/src/class/metaclass.tcl.
1 2 3 4 5 6 7 8 9 10 | ::oo::class create ::practcl::metaclass { superclass ::oo::object method define {submethod args} { my variable define switch $submethod { dump { return [array get define] } add { | > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ::oo::class create ::practcl::metaclass { superclass ::oo::object method _MorphPatterns {} { return {{@name@} {::practcl::@name@} {::practcl::*@name@} {::practcl::*@name@*}} } method define {submethod args} { my variable define switch $submethod { dump { return [array get define] } add { |
︙ | ︙ | |||
136 137 138 139 140 141 142 | } } method morph classname { my variable define if {$classname ne {}} { set map [list @name@ $classname] | | < < < < < < < < | 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | } } method morph classname { my variable define if {$classname ne {}} { set map [list @name@ $classname] foreach pattern [string map $map [my _MorphPatterns]] { set pattern [string trim $pattern] set matches [info commands $pattern] if {![llength $matches]} continue set class [lindex $matches 0] break } set mixinslot {} |
︙ | ︙ |
Changes to modules/practcl/src/class/module.tcl.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ### # In the end, all C code must be loaded into a module # This will either be a dynamically loaded library implementing # a tcl extension, or a compiled in segment of a custom shell/app ### ::oo::class create ::practcl::module { superclass ::practcl::object ::practcl::product.dynamic method add args { my variable links set object [::practcl::object new [self] {*}$args] foreach linktype [$object linktype] { lappend links($linktype) $object } return $object | > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ### # In the end, all C code must be loaded into a module # This will either be a dynamically loaded library implementing # a tcl extension, or a compiled in segment of a custom shell/app ### ::oo::class create ::practcl::module { superclass ::practcl::object ::practcl::product.dynamic method _MorphPatterns {} { return {{@name@} {::practcl::module.@name@} ::practcl::module} } method add args { my variable links set object [::practcl::object new [self] {*}$args] foreach linktype [$object linktype] { lappend links($linktype) $object } return $object |
︙ | ︙ |
Changes to modules/practcl/src/class/object.tcl.
︙ | ︙ | |||
19 20 21 22 23 24 25 | array set define [uplevel 1 [list subst $args]] my select } my initialize } | < < < < < < < < < < < < < < < < | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | array set define [uplevel 1 [list subst $args]] my select } my initialize } method child {method} { return {} } method go {} { ::practcl::debug [list [self] [self method] [self class] -- [my define get filename] [info object class [self]]] my variable links foreach {linktype objs} [array get links] { foreach obj $objs { $obj go } } ::practcl::debug [list /[self] [self method] [self class]] } } |
Changes to modules/practcl/src/class/project/baseclass.tcl.
1 2 3 4 5 6 7 8 9 10 11 | ::oo::class create ::practcl::project { superclass ::practcl::module constructor args { my variable define if {[llength $args] == 1} { set rawcontents [lindex $args 0] } else { set rawcontents $args } | > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ::oo::class create ::practcl::project { superclass ::practcl::module method _MorphPatterns {} { return {{@name@} {::practcl::@name@} {::practcl::project.@name@} {::practcl::project}} } constructor args { my variable define if {[llength $args] == 1} { set rawcontents [lindex $args 0] } else { set rawcontents $args } |
︙ | ︙ | |||
31 32 33 34 35 36 37 38 39 40 41 42 43 44 | my graft module [self] array set define $contents ::practcl::toolset select [self] my initialize } method add_project {pkg info {oodefine {}}} { set os [my define get TEACUP_OS] if {$os eq {}} { set os [::practcl::os] my define set os $os } set fossilinfo [list download [my define get download] tag trunk sandbox [my define get sandbox]] if {[dict exists $info os] && ($os ni [dict get $info os])} return | > | 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | my graft module [self] array set define $contents ::practcl::toolset select [self] my initialize } method add_project {pkg info {oodefine {}}} { ::practcl::debug [self] add_project $pkg $info set os [my define get TEACUP_OS] if {$os eq {}} { set os [::practcl::os] my define set os $os } set fossilinfo [list download [my define get download] tag trunk sandbox [my define get sandbox]] if {[dict exists $info os] && ($os ni [dict get $info os])} return |
︙ | ︙ | |||
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | oo::objdefine $obj $oodefine $obj define set masterpath $::CWD $obj go return $obj } method add_tool {pkg info {oodefine {}}} { set info [dict merge [::practcl::local_os] $info] set os [dict get $info TEACUP_OS] set fossilinfo [list download [my define get download] tag trunk sandbox [my define get sandbox]] if {[dict exists $info os] && ($os ni [dict get $info os])} return # Select which tag to use here. # For production builds: tag-release set profile [my define get profile release]: if {[dict exists $info profile $profile]} { dict set info tag [dict get $info profile $profile] } | > > | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | oo::objdefine $obj $oodefine $obj define set masterpath $::CWD $obj go return $obj } method add_tool {pkg info {oodefine {}}} { ::practcl::debug [self] add_tool $pkg $info set info [dict merge [::practcl::local_os] $info] set os [dict get $info TEACUP_OS] set fossilinfo [list download [my define get download] tag trunk sandbox [my define get sandbox]] if {[dict exists $info os] && ($os ni [dict get $info os])} return # Select which tag to use here. # For production builds: tag-release set profile [my define get profile release]: if {[dict exists $info profile $profile]} { dict set info tag [dict get $info profile $profile] } set obj ::practcl::OBJECT::TOOL.$pkg if {[info command $obj] eq {}} { set obj [::practcl::subproject create $obj [self] [dict merge $fossilinfo [list name $pkg pkg_name $pkg static 0] $info]] } my link add tool $obj oo::objdefine $obj $oodefine $obj define set masterpath $::CWD $obj go return $obj } method build-tclcore {} { set os [my define get TEACUP_OS] set tcl_config_opts [::practcl::platform::tcl_core_options $os] set tk_config_opts [::practcl::platform::tk_core_options $os] lappend tcl_config_opts --prefix [my define get prefix] --exec-prefix [my define get prefix] set tclobj [my tclcore] if {[my define get debug 0]} { $tclobj define set debug 1 lappend tcl_config_opts --enable-symbols=true } $tclobj define set config_opts $tcl_config_opts $tclobj go $tclobj compile set _TclSrcDir [$tclobj define get localsrcdir] my define set tclsrcdir $_TclSrcDir set tkobj [my tkcore] lappend tk_config_opts --with-tcl=[::practcl::file_relative [$tkobj define get builddir] [$tclobj define get builddir]] if {[my define get debug 0]} { $tkobj define set debug 1 lappend tk_config_opts --enable-symbols=true } $tkobj define set config_opts $tk_config_opts $tkobj compile } method child which { switch $which { organs { # A library can be a project, it can be a module. Any # subordinate modules will indicate their existance return [list project [self] module [self]] } |
︙ | ︙ | |||
103 104 105 106 107 108 109 110 | set obj [namespace current]::PROJECT.$pkg if {[llength $args]==0} { return $obj } ${obj} {*}$args } method tool {pkg args} { | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | 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 | set obj [namespace current]::PROJECT.$pkg if {[llength $args]==0} { return $obj } ${obj} {*}$args } method tclcore {} { if {[info commands [set obj [my organ tclcore]]] ne {}} { return $obj } if {[info commands [set obj [my project TCLCORE]]] ne {}} { my graft tclcore $obj return $obj } if {[info commands [set obj [my project tcl]]] ne {}} { my graft tclcore $obj return $obj } if {[info commands [set obj [my tool tcl]]] ne {}} { my graft tclcore $obj return $obj } # Provide a fallback set obj [my add_tool tcl { tag release class subproject.core fossil_url http://core.tcl.tk/tcl }] my graft tclcore $obj return $obj } method tkcore {} { if {[set obj [my organ tkcore]] ne {}} { return $obj } if {[set obj [my project tk]] ne {}} { my graft tkcore $obj return $obj } if {[set obj [my tool tk]] ne {}} { my graft tkcore $obj return $obj } # Provide a fallback set obj [my add_tool tk { tag release class tool.core fossil_url http://core.tcl.tk/tk }] my graft tkcore $obj return $obj } method tool {pkg args} { set obj ::practcl::OBJECT::TOOL.$pkg if {[llength $args]==0} { return $obj } ${obj} {*}$args } } |
Changes to modules/practcl/src/class/project/tclkit.tcl.
︙ | ︙ | |||
210 211 212 213 214 215 216 | set PROJECT [self] set os [$PROJECT define get TEACUP_OS] if {[my define get SHARED_BUILD]} { puts [list BUILDING TCLSH FOR OS $os] } else { puts [list BUILDING KIT FOR OS $os] } | | | 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 | set PROJECT [self] set os [$PROJECT define get TEACUP_OS] if {[my define get SHARED_BUILD]} { puts [list BUILDING TCLSH FOR OS $os] } else { puts [list BUILDING KIT FOR OS $os] } set TCLOBJ [$PROJECT tclcore] ::practcl::toolset select $TCLOBJ set TCLSRCDIR [$TCLOBJ define get srcdir] set PKG_OBJS {} foreach item [$PROJECT link list core.library] { if {[string is true [$item define get static]]} { lappend PKG_OBJS $item |
︙ | ︙ |
Changes to modules/practcl/src/class/subproject/baseclass.tcl.
1 2 3 4 5 6 7 8 9 10 | oo::class create ::practcl::subproject { superclass ::practcl::module method child which { switch $which { organs { # A library can be a project, it can be a module. Any # subordinate modules will indicate their existance return [list project [self] module [self]] } | > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | oo::class create ::practcl::subproject { superclass ::practcl::module method _MorphPatterns {} { return {{::practcl::subproject.@name@} {::practcl::@name@} {@name@} {::practcl::subproject}} } method child which { switch $which { organs { # A library can be a project, it can be a module. Any # subordinate modules will indicate their existance return [list project [self] module [self]] } |
︙ | ︙ | |||
33 34 35 36 37 38 39 40 41 42 43 44 45 46 | method linker-products {configdict} {} method linker-external {configdict} { if {[dict exists $configdict PRACTCL_PKG_LIBS]} { return [dict get $configdict PRACTCL_PKG_LIBS] } } method sources {} {} method unpack {} { ::practcl::distribution select [self] my Unpack ::practcl::toolset select [self] | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | method linker-products {configdict} {} method linker-external {configdict} { if {[dict exists $configdict PRACTCL_PKG_LIBS]} { return [dict get $configdict PRACTCL_PKG_LIBS] } } ### # Methods for packages/tools that can be downloaded # possibly built and used internally by this Practcl # process ### ### # Load the facility into the interpreter ### method env-bootstrap {} { set pkg [my define get pkg_name [my define get name]] package require $pkg } ### # Return a file path that exec can call ### method env-exec {} {} ### # Install the tool into the local environment ### method env-install {} { my unpack } ### # Do whatever is necessary to get the tool # into the local environment ### method env-load {} { my variable loaded if {[info exists loaded]} { return 0 } if {![my env-present]} { my env-install } my env-bootstrap set loaded 1 } ### # Check if tool is available for load/already loaded ### method env-present {} { set pkg [my define get pkg_name [my define get name]] if {[catch [list package require $pkg]]} { return 0 } return 1 } method sources {} {} method unpack {} { ::practcl::distribution select [self] my Unpack ::practcl::toolset select [self] |
︙ | ︙ | |||
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | ### # A project which the kit compiles and integrates # the source for itself ### oo::class create ::practcl::subproject.source { superclass ::practcl::subproject ::practcl::library method linktype {} { return {subordinate package source} } } # a copy from the teapot oo::class create ::practcl::subproject.teapot { superclass ::practcl::subproject | > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > > < < < < < < < < | > | > > > > > > > > > > | | 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 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 | ### # A project which the kit compiles and integrates # the source for itself ### oo::class create ::practcl::subproject.source { superclass ::practcl::subproject ::practcl::library method env-bootstrap {} { set LibraryRoot [file join [my define get srcdir] [my define get module_root modules]] if {[file exists $LibraryRoot] && $LibraryRoot ni $::auto_path} { set ::auto_path [linsert $::auto_path 0 $LibraryRoot] } } method env-present {} { return [file exists [my define get srcdir]] } method linktype {} { return {subordinate package source} } } # a copy from the teapot oo::class create ::practcl::subproject.teapot { superclass ::practcl::subproject method env-bootstrap {} { set pkg [my define get pkg_name [my define get name]] package require $pkg } method env-install {} { set pkg [my define get pkg_name [my define get name]] set download [my <project> define get download] my unpack set prefix [string trimleft [my <project> define get prefix] /] ::practcl::tcllib_require zipfile::decode ::zipfile::decode::unzipfile [file join $download $pkg.zip] [file join $prefix lib $pkg] } method env-present {} { set pkg [my define get pkg_name [my define get name]] if {[catch [list package require $pkg]]} { return 0 } return 1 } method install DEST { set pkg [my define get pkg_name [my define get name]] set download [my <project> define get download] my unpack set prefix [string trimleft [my <project> define get prefix] /] ::practcl::tcllib_require zipfile::decode ::zipfile::decode::unzipfile [file join $download $pkg.zip] [file join $DEST $prefix lib $pkg] } } oo::class create ::practcl::subproject.kettle { superclass ::practcl::subproject method kettle {path args} { my variable kettle if {![info exists kettle]} { ::pratcl::LOCAL tool kettle load set kettle [file join [::pratcl::LOCAL tool kettle define get srcdir] kettle] } set srcdir [my SourceRoot] ::pratcl::dotclexec $kettle -f [file join $srcdir build.tcl] {*}$args } method install DEST { my kettle reinstall --prefix $DEST } } oo::class create ::practcl::subproject.critcl { superclass ::practcl::subproject method install DEST { my critcl -pkg [my define get name] set srcdir [my SourceRoot] ::pratcl::copyDir [file join $srcdir [my define get name]] [file join $DEST lib [my define get name]] } } oo::class create ::practcl::subproject.sak { superclass ::practcl::subproject method env-install {} { ### # Handle teapot installs ### set pkg [my define get pkg_name [my define get name]] my unpack set prefix [my <project> define get prefix [file normalize [file join ~ tcl]]] set srcdir [my define get srcdir] ::practcl::dotclexec [file join $srcdir installer.tcl] \ -apps -app-path [file join $prefix apps] \ -html -html-path [file join $prefix doc html $pkg] \ -pkg-path [file join $prefix lib $pkg] \ -no-nroff -no-wait -no-gui } method install DEST { ### # Handle teapot installs ### set pkg [my define get pkg_name [my define get name]] my unpack set prefix [string trimleft [my <project> define get prefix] /] |
︙ | ︙ |
Changes to modules/practcl/src/class/subproject/binary.tcl.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ### # A binary package ### oo::class create ::practcl::subproject.binary { superclass ::practcl::subproject method clean {} { set builddir [file normalize [my define get builddir]] if {![file exists $builddir]} return if {[file exists [file join $builddir make.tcl]]} { ::practcl::domake.tcl $builddir clean } else { ::practcl::domake $builddir clean } } method project-compile-products {} {} method ComputeInstall {} { if {[my define exists install]} { switch [my define get install] { static { | > > > > > > > > > > > > > > > > > > > | 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 | ### # A binary package ### oo::class create ::practcl::subproject.binary { superclass ::practcl::subproject method clean {} { set builddir [file normalize [my define get builddir]] if {![file exists $builddir]} return if {[file exists [file join $builddir make.tcl]]} { ::practcl::domake.tcl $builddir clean } else { ::practcl::domake $builddir clean } } method env-install {} { ### # Handle tea installs ### set pkg [my define get pkg_name [my define get name]] set os [::practcl::local_os] my define set os $os my unpack set prefix [my <project> define get prefix [file normalize [file join ~ tcl]]] set srcdir [my define get srcdir] lappend options --prefix $prefix --exec-prefix $prefix my define set config_opts $options my go my clean my compile ::practcl::domake [my define get builddir] install } method project-compile-products {} {} method ComputeInstall {} { if {[my define exists install]} { switch [my define get install] { static { |
︙ | ︙ | |||
94 95 96 97 98 99 100 101 | } return $result } method BuildDir {PWD} { set name [my define get name] set debug [my define get debug 0] if {$debug} { | > > > > | | | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | } return $result } method BuildDir {PWD} { set name [my define get name] set debug [my define get debug 0] set project [my organ project] if {[$project define get LOCAL 0]} { return [my define get builddir [file join $PWD local $name]] } if {$debug} { return [my define get builddir [file join $PWD debug $name]] } else { return [my define get builddir [file join $PWD pkg $name]] } } method compile {} { set name [my define get name] set PWD $::CWD cd $PWD |
︙ | ︙ | |||
272 273 274 275 276 277 278 279 280 281 282 283 284 285 | if {[file exists $input]} { puts "autoconf -f $input > [file join $srcdir configure]" exec autoconf -f $input > [file join $srcdir configure] } } cd $pwd } } oo::class create ::practcl::subproject.library { superclass ::practcl::subproject.binary ::practcl::library method install DEST { my compile } | > > > > > | 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 | if {[file exists $input]} { puts "autoconf -f $input > [file join $srcdir configure]" exec autoconf -f $input > [file join $srcdir configure] } } cd $pwd } } oo::class create ::practcl::subproject.tea { superclass ::practcl::subproject.binary } oo::class create ::practcl::subproject.library { superclass ::practcl::subproject.binary ::practcl::library method install DEST { my compile } |
︙ | ︙ |
Changes to modules/practcl/src/class/subproject/core.tcl.
1 2 3 4 5 6 7 8 9 | oo::class create ::practcl::subproject.core { superclass ::practcl::subproject.binary # On the windows platform MinGW must build # from the platform directory in the source repo #method BuildDir {PWD} { # return [my define get localsrcdir] #} | < < < < < < < | < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | oo::class create ::practcl::subproject.core { superclass ::practcl::subproject.binary # On the windows platform MinGW must build # from the platform directory in the source repo #method BuildDir {PWD} { # return [my define get localsrcdir] #} method Configure {} { if {[my define get USEMSVC 0]} { return } set opts [my ConfigureOpts] set builddir [file normalize [my define get builddir]] set localsrcdir [file normalize [my define get localsrcdir]] |
︙ | ︙ | |||
43 44 45 46 47 48 49 | if {![regexp -- "--prefix" $opts]} { lappend opts --prefix=$PREFIX } #--exec_prefix=$PREFIX lappend opts --disable-shared return $opts } | | > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | if {![regexp -- "--prefix" $opts]} { lappend opts --prefix=$PREFIX } #--exec_prefix=$PREFIX lappend opts --disable-shared return $opts } method env-present {} { return 0 } method env-install {} { my unpack set os [::practcl::local_os] switch [my define get name] { tcl { set options [::practcl::platform::tcl_core_options $os] } tk { set options [::practcl::platform::tk_core_options $os] } default { set options {} } } set prefix [my <project> define get prefix [file normalize [file join ~ tcl]]] lappend options --prefix $prefix --exec-prefix $prefix my define set config_opts $options my go my compile ::practcl::domake [my define get builddir] install } method go {} { set name [my define get name] set os [my <project> define get TEACUP_OS] ::practcl::distribution select [self] my ComputeInstall set srcdir [my SrcDir] |
︙ | ︙ |
Changes to modules/practcl/src/class/tool.tcl.
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | | | | > > > > > > | > | | | > > > > > | > | 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 | ### # Create an object to represent the local environment ### set ::practcl::MAIN ::practcl::LOCAL # Defer the creation of the ::pratcl::LOCAL object until it is called # in order to allow packages to set ::auto_index(::practcl::LOCAL) { ::practcl::project create ::practcl::LOCAL ::practcl::LOCAL define set [::practcl::local_os] ::practcl::LOCAL define set prefix [file normalize [file join ~ tcl]] ::practcl::LOCAL define set LOCAL 1 # Until something better comes along, use ::practcl::LOCAL # as our main project # Add tclconfig as a project of record ::practcl::LOCAL add_tool tclconfig { name tclconfig tag practcl class subproject.source fossil_url http://core.tcl.tk/tclconfig } # Add tcllib as a project of record ::practcl::LOCAL add_tool tcllib { tag trunk class sak fossil_url http://core.tcl.tk/tcllib } ::practcl::LOCAL add_tool kettle { tag trunk class sak fossil_url http://fossil.etoyoc.com/fossil/kettle } ::practcl::LOCAL add_tool tclvfs { tag trunk class tea fossil_url http://fossil.etoyoc.com/fossil/tclvfs } ::practcl::LOCAL add_tool critcl { tag master class subproject.binary git_url http://github.com/andreas-kupries/critcl modules lib } { method env-install {} { my unpack set prefix [my <project> define get prefix [file join [file normalize ~] tcl]] set srcdir [my define get srcdir] ::practcl::dotclexec [file join $srcdir build.tcl] install [file join $prefix lib] } } ::practcl::LOCAL add_tool odie { tag trunk class subproject.source fossil_url http://fossil.etoyoc.com/fossil/odie } ::practcl::LOCAL add_tool tcl { tag release class subproject.core fossil_url http://core.tcl.tk/tcl } ::practcl::LOCAL add_tool tk { tag release class subproject.core fossil_url http://core.tcl.tk/tcl } ::practcl::LOCAL add_tool sqlite { tag practcl class subproject.tea pkg_name sqlite3 fossil_url http://fossil.etoyoc.com/fossil/sqlite } } |
Changes to modules/practcl/src/class/toolset/baseclass.tcl.
︙ | ︙ | |||
136 137 138 139 140 141 142 | } else { set PREFIX [my <project> define get prefix] } if {[my <project> define get CONFIG_SITE] != {}} { lappend opts --host=[my <project> define get HOST] } lappend opts --with-tclsh=[info nameofexecutable] | | | | 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | } else { set PREFIX [my <project> define get prefix] } if {[my <project> define get CONFIG_SITE] != {}} { lappend opts --host=[my <project> define get HOST] } lappend opts --with-tclsh=[info nameofexecutable] set obj [my <project> tclcore] if {$obj ne {}} { lappend opts --with-tcl=[::practcl::file_relative [file normalize $builddir] [$obj define get builddir]] } if {[my define get tk 0]} { set obj [my <project> tkcore] if {$obj ne {}} { lappend opts --with-tk=[::practcl::file_relative [file normalize $builddir] [$obj define get builddir]] } } lappend opts {*}[my define get config_opts] if {![regexp -- "--prefix" $opts]} { lappend opts --prefix=$PREFIX --exec-prefix=$PREFIX |
︙ | ︙ | |||
166 167 168 169 170 171 172 | #--disable-stubs # } else { lappend opts --enable-shared } return $opts } | | | 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | #--disable-stubs # } else { lappend opts --enable-shared } return $opts } #method unpack {} { # ::practcl::distribution select [self] # my Unpack #} } |
︙ | ︙ |
Changes to modules/practcl/src/class/toolset/gcc.tcl.
︙ | ︙ | |||
274 275 276 277 278 279 280 | } ### # Produce a static executable ### method build-tclsh {outfile PROJECT} { puts " BUILDING STATIC TCLSH " | | | | 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 | } ### # Produce a static executable ### method build-tclsh {outfile PROJECT} { puts " BUILDING STATIC TCLSH " set TCLOBJ [$PROJECT project tclcore] ::practcl::toolset select $TCLOBJ set PKG_OBJS {} foreach item [$PROJECT link list core.library] { if {[string is true [$item define get static]]} { lappend PKG_OBJS $item } } foreach item [$PROJECT link list package] { if {[string is true [$item define get static]]} { lappend PKG_OBJS $item } } array set TCL [$TCLOBJ config.sh] set TKOBJ [$PROJECT project tkcore] if {[info command $TKOBJ] eq {}} { set TKOBJ ::noop $PROJECT define set static_tk 0 } else { ::practcl::toolset select $TKOBJ array set TK [$TKOBJ config.sh] set do_tk [$TKOBJ define get static] |
︙ | ︙ | |||
389 390 391 392 393 394 395 | set RCMAN [file join [$TCLOBJ define get builddir] tclsh.exe.manifest] } } foreach item [${PROJECT} define get resource_include] { lappend cmd --include [::practcl::file_relative $path [file normalize $item]] } lappend cmd [file tail $RCSRC] | > | > > | > | 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 | set RCMAN [file join [$TCLOBJ define get builddir] tclsh.exe.manifest] } } foreach item [${PROJECT} define get resource_include] { lappend cmd --include [::practcl::file_relative $path [file normalize $item]] } lappend cmd [file tail $RCSRC] if {![file exists [file join $path [file tail $RCSRC]]]} { file copy -force $RCSRC [file join $path [file tail $RCSRC]] } if {![file exists [file join $path [file tail $RCMAN]]]} { file copy -force $RCMAN [file join $path [file tail $RCMAN]] } ::practcl::doexec {*}$cmd lappend OBJECTS $RSOBJ set LDFLAGS_CONSOLE {-mconsole -pipe -static-libgcc} set LDFLAGS_WINDOW {-mwindows -pipe -static-libgcc} } else { set LDFLAGS_CONSOLE {} set LDFLAGS_WINDOW {} |
︙ | ︙ |
Changes to modules/practcl/src/setup.tcl.
︙ | ︙ | |||
13 14 15 16 17 18 19 | set tclib_path $path lappend ::auto_path $path break } if {$tcllib_path ne {}} break } namespace eval ::practcl {} | > | 13 14 15 16 17 18 19 20 | set tclib_path $path lappend ::auto_path $path break } if {$tcllib_path ne {}} break } namespace eval ::practcl {} namespace eval ::practcl::OBJECT {} |