From f16733c0cc6f912acb1182fdf3e230d940f793fa Mon Sep 17 00:00:00 2001 From: Julian Noble Date: Thu, 7 Dec 2023 08:51:21 +1100 Subject: [PATCH] template layouts --- .../layouts/minimal/.fossil-custom/mainmenu | 1 + .../minimal/.fossil-settings/crlf-glob | 1 + .../minimal/.fossil-settings/ignore-glob | 10 + .../layouts/minimal/.fossil-settings/manifest | 1 + .../layouts/project/.fossil-custom/mainmenu | 1 + .../project/.fossil-settings/crlf-glob | 1 + .../project/.fossil-settings/ignore-glob | 8 + .../layouts/project/.fossil-settings/manifest | 1 + .../project/src/doc/include/changes.inc | 3 + .../project/src/doc/include/changes_0.1.inc | 25 ++ .../project/src/doc/include/feedback.inc | 18 ++ .../project/src/doc/include/general.inc | 2 +- .../project/src/doc/include/punkshell.inc | 3 + .../project/src/doc/include/welcome.inc | 2 +- .../layouts/project/src/doc/main.man | 3 + .../project/src/doc/project_changes.man | 13 + .../layouts/project/src/doc/project_intro.man | 15 + .../templates/layouts/project/src/make.tcl | 262 ++++++++++-------- .../modules/template_module-0.0.1.tm | 102 +++---- .../layouts/project/src/runtime/mapvfs.config | 12 + .../sample.vfs/lib/app-sample/pkgIndex.tcl | 2 +- .../src/sample.vfs/lib/app-sample/sample.tcl | 16 +- .../lib/app-sampleshell/pkgIndex.tcl | 4 +- .../sample.vfs/lib/app-sampleshell/repl.tcl | 222 +++++++-------- .../layouts/project/src/sample.vfs/main.tcl | 46 +-- 25 files changed, 465 insertions(+), 309 deletions(-) create mode 100644 src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/crlf-glob create mode 100644 src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/manifest create mode 100644 src/modules/punk/mix/templates/layouts/project/.fossil-settings/crlf-glob create mode 100644 src/modules/punk/mix/templates/layouts/project/.fossil-settings/manifest create mode 100644 src/modules/punk/mix/templates/layouts/project/src/doc/include/changes.inc create mode 100644 src/modules/punk/mix/templates/layouts/project/src/doc/include/changes_0.1.inc create mode 100644 src/modules/punk/mix/templates/layouts/project/src/doc/include/feedback.inc create mode 100644 src/modules/punk/mix/templates/layouts/project/src/doc/include/punkshell.inc create mode 100644 src/modules/punk/mix/templates/layouts/project/src/doc/project_changes.man create mode 100644 src/modules/punk/mix/templates/layouts/project/src/doc/project_intro.man create mode 100644 src/modules/punk/mix/templates/layouts/project/src/runtime/mapvfs.config diff --git a/src/modules/punk/mix/templates/layouts/minimal/.fossil-custom/mainmenu b/src/modules/punk/mix/templates/layouts/minimal/.fossil-custom/mainmenu index 8bee6e7..bb38af3 100644 --- a/src/modules/punk/mix/templates/layouts/minimal/.fossil-custom/mainmenu +++ b/src/modules/punk/mix/templates/layouts/minimal/.fossil-custom/mainmenu @@ -7,6 +7,7 @@ Forum /forum {@2 3 4 5 6} wideonly Chat /chat C wideonly Tickets /ticket r wideonly Wiki /wiki j wideonly +Doc /doc/tip/src/embedded/md/toc.md * {} Download /download * {} Admin /setup {a s} desktoponly Logout /logout L wideonly diff --git a/src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/crlf-glob b/src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/crlf-glob new file mode 100644 index 0000000..eaa1c66 --- /dev/null +++ b/src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/crlf-glob @@ -0,0 +1 @@ +src/embedded/* diff --git a/src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/ignore-glob b/src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/ignore-glob index 170a4f6..3c2ac85 100644 --- a/src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/ignore-glob +++ b/src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/ignore-glob @@ -3,6 +3,8 @@ bin lib #The directory for compiled/built Tcl modules modules +#The buildsuites output folder +builds #Temporary files e.g from tests tmp @@ -27,3 +29,11 @@ tcl*.exe *.swp todo.txt + +zig-cache +zig-out +release +debug +build +build-* +docgen_tmp diff --git a/src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/manifest b/src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/manifest new file mode 100644 index 0000000..50cc10d --- /dev/null +++ b/src/modules/punk/mix/templates/layouts/minimal/.fossil-settings/manifest @@ -0,0 +1 @@ +rut \ No newline at end of file diff --git a/src/modules/punk/mix/templates/layouts/project/.fossil-custom/mainmenu b/src/modules/punk/mix/templates/layouts/project/.fossil-custom/mainmenu index 8bee6e7..bb38af3 100644 --- a/src/modules/punk/mix/templates/layouts/project/.fossil-custom/mainmenu +++ b/src/modules/punk/mix/templates/layouts/project/.fossil-custom/mainmenu @@ -7,6 +7,7 @@ Forum /forum {@2 3 4 5 6} wideonly Chat /chat C wideonly Tickets /ticket r wideonly Wiki /wiki j wideonly +Doc /doc/tip/src/embedded/md/toc.md * {} Download /download * {} Admin /setup {a s} desktoponly Logout /logout L wideonly diff --git a/src/modules/punk/mix/templates/layouts/project/.fossil-settings/crlf-glob b/src/modules/punk/mix/templates/layouts/project/.fossil-settings/crlf-glob new file mode 100644 index 0000000..eaa1c66 --- /dev/null +++ b/src/modules/punk/mix/templates/layouts/project/.fossil-settings/crlf-glob @@ -0,0 +1 @@ +src/embedded/* diff --git a/src/modules/punk/mix/templates/layouts/project/.fossil-settings/ignore-glob b/src/modules/punk/mix/templates/layouts/project/.fossil-settings/ignore-glob index 2e5d201..3c2ac85 100644 --- a/src/modules/punk/mix/templates/layouts/project/.fossil-settings/ignore-glob +++ b/src/modules/punk/mix/templates/layouts/project/.fossil-settings/ignore-glob @@ -29,3 +29,11 @@ tcl*.exe *.swp todo.txt + +zig-cache +zig-out +release +debug +build +build-* +docgen_tmp diff --git a/src/modules/punk/mix/templates/layouts/project/.fossil-settings/manifest b/src/modules/punk/mix/templates/layouts/project/.fossil-settings/manifest new file mode 100644 index 0000000..50cc10d --- /dev/null +++ b/src/modules/punk/mix/templates/layouts/project/.fossil-settings/manifest @@ -0,0 +1 @@ +rut \ No newline at end of file diff --git a/src/modules/punk/mix/templates/layouts/project/src/doc/include/changes.inc b/src/modules/punk/mix/templates/layouts/project/src/doc/include/changes.inc new file mode 100644 index 0000000..61b7abc --- /dev/null +++ b/src/modules/punk/mix/templates/layouts/project/src/doc/include/changes.inc @@ -0,0 +1,3 @@ +[section Changes] +[include changes_0.1.inc] + diff --git a/src/modules/punk/mix/templates/layouts/project/src/doc/include/changes_0.1.inc b/src/modules/punk/mix/templates/layouts/project/src/doc/include/changes_0.1.inc new file mode 100644 index 0000000..08788e2 --- /dev/null +++ b/src/modules/punk/mix/templates/layouts/project/src/doc/include/changes_0.1.inc @@ -0,0 +1,25 @@ +[subsection {Changes for version 0.1}] +[vset punkshell_project https://www.gitea1.intx.com.au/jn/punkshell] + +This release 0.1 of project %project% + +[para] In detail: + +[list_begin enumerated] +[comment {- - -- --- ----- -------- ------------- ---------------------}] +[enum] %project% requires Tcl 8.6 or higher. Tcl 8.5 or less is not + supported. +[comment {- - -- --- ----- -------- ------------- ---------------------}] +[comment {Please consider retaining a link to PunkShell to support the project}] +[enum] This project uses [uri [vset punkshell_project] {PunkShell}] as a deployment management and documentation tool. +[comment {- - -- --- ----- -------- ------------- ---------------------}] + + +[para] Summary +[list_begin enumerated] +[enum] feature 1 +[enum] feature 2 +[list_end] + +[comment {- - -- --- ----- -------- ------------- ---------------------}] +[list_end] diff --git a/src/modules/punk/mix/templates/layouts/project/src/doc/include/feedback.inc b/src/modules/punk/mix/templates/layouts/project/src/doc/include/feedback.inc new file mode 100644 index 0000000..20f3efa --- /dev/null +++ b/src/modules/punk/mix/templates/layouts/project/src/doc/include/feedback.inc @@ -0,0 +1,18 @@ +[comment {-*- tcl -*- --- !doctools --- manpage}] +[comment {- - -- --- ----- -------- ------------- ---------------------}] +[section {Bugs, Ideas, Feedback}] +[vset project_tracker https://example.com/tracker] +[vset project_email dev@example.com] + +This document, and the package it describes, will undoubtedly contain +bugs and other problems. + +Please report such at the +[uri [vset project_tracker] {%project% tracker}]. + +Please also report any ideas for enhancements you may have for either +package and/or documentation. + +Contact: [uri [vset project_email] [vset project_email]] + + diff --git a/src/modules/punk/mix/templates/layouts/project/src/doc/include/general.inc b/src/modules/punk/mix/templates/layouts/project/src/doc/include/general.inc index 69ac59e..58a2496 100644 --- a/src/modules/punk/mix/templates/layouts/project/src/doc/include/general.inc +++ b/src/modules/punk/mix/templates/layouts/project/src/doc/include/general.inc @@ -2,5 +2,5 @@ [comment {- -- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---}] [moddesc {%project% - a Tcl project}] [category {unspecified}] -[keywords {keyword1 keyword2}] +[keywords module %project%] [require Tcl 8.6] diff --git a/src/modules/punk/mix/templates/layouts/project/src/doc/include/punkshell.inc b/src/modules/punk/mix/templates/layouts/project/src/doc/include/punkshell.inc new file mode 100644 index 0000000..3cd21ba --- /dev/null +++ b/src/modules/punk/mix/templates/layouts/project/src/doc/include/punkshell.inc @@ -0,0 +1,3 @@ +[comment {Please consider retaining a link to PunkShell to support the project}] +[vset punkshell_project https://www.gitea1.intx.com.au/jn/punkshell] +[para] This project uses [uri [vset punkshell_project] {PunkShell}] as a deployment management and documentation tool. diff --git a/src/modules/punk/mix/templates/layouts/project/src/doc/include/welcome.inc b/src/modules/punk/mix/templates/layouts/project/src/doc/include/welcome.inc index 36241a5..ac42906 100644 --- a/src/modules/punk/mix/templates/layouts/project/src/doc/include/welcome.inc +++ b/src/modules/punk/mix/templates/layouts/project/src/doc/include/welcome.inc @@ -2,5 +2,5 @@ [comment {- -- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---}] [include welcome_basic.inc] -[para] Please read the document [term {%project% - Introduction to %project%}], +[para] Please read the document [term {Introduction to %project%}], if you have not done so already, to get an overview of the whole system. diff --git a/src/modules/punk/mix/templates/layouts/project/src/doc/main.man b/src/modules/punk/mix/templates/layouts/project/src/doc/main.man index 5c2f40e..cf2d528 100644 --- a/src/modules/punk/mix/templates/layouts/project/src/doc/main.man +++ b/src/modules/punk/mix/templates/layouts/project/src/doc/main.man @@ -9,5 +9,8 @@ This document is the reference to all commands provided by %project% +[include include/feedback.inc] +[comment {Please consider retaining a link to PunkShell to support the project}] +[include include/punkshell.inc] [manpage_end] \ No newline at end of file diff --git a/src/modules/punk/mix/templates/layouts/project/src/doc/project_changes.man b/src/modules/punk/mix/templates/layouts/project/src/doc/project_changes.man new file mode 100644 index 0000000..ee03b09 --- /dev/null +++ b/src/modules/punk/mix/templates/layouts/project/src/doc/project_changes.man @@ -0,0 +1,13 @@ +[comment {-*- tcl -*- doctools manpage}] +[manpage_begin project_changes n 8] +[include include/general.inc] +[titledesc {%project% Changes}] +[description] +[include include/welcome_basic.inc] +[para] +This document provides an overview of the changes [package %project%] +underwent from version to version. + +[include include/changes.inc] +[include include/feedback.inc] +[manpage_end] diff --git a/src/modules/punk/mix/templates/layouts/project/src/doc/project_intro.man b/src/modules/punk/mix/templates/layouts/project/src/doc/project_intro.man new file mode 100644 index 0000000..164649e --- /dev/null +++ b/src/modules/punk/mix/templates/layouts/project/src/doc/project_intro.man @@ -0,0 +1,15 @@ +[comment {-*- tcl -*- doctools manpage}] +[manpage_begin project_intro n 8] +[include include/general.inc] +[titledesc {Introduction to %project%}] +[description] +[include include/welcome_basic.inc] +[para] +Introduction to %project% + +[include include/feedback.inc] + +[comment {Please consider retaining a link to PunkShell to support the project}] +[include include/punkshell.inc] +[manpage_end] + diff --git a/src/modules/punk/mix/templates/layouts/project/src/make.tcl b/src/modules/punk/mix/templates/layouts/project/src/make.tcl index 64b1794..30dc928 100644 --- a/src/modules/punk/mix/templates/layouts/project/src/make.tcl +++ b/src/modules/punk/mix/templates/layouts/project/src/make.tcl @@ -290,37 +290,21 @@ if {[file exists $sourcefolder/vendorlib]} { README.md\ ] + puts stdout "VENDORLIB: copying from $sourcefolder/vendorlib to $projectroot/lib (if source file changed)" set resultdict [punkcheck::install $sourcefolder/vendorlib $projectroot/lib -overwrite installedsourcechanged-targets -unpublish_paths $unpublish] - set copied [dict get $resultdict files_copied] - set sources_unchanged [dict get $resultdict sources_unchanged] - puts stdout "--------------------------" - flush stdout - puts stderr "Copied [llength $copied] vendor lib files from src/vendorlib to $projectroot/lib" - foreach f $copied { - puts stdout "COPIED $f" - } - puts stdout "[llength $sources_unchanged] unchanged source files" - puts stdout "--------------------------" + puts stdout [punkcheck::summarize_install_resultdict $resultdict] + } else { - puts stderr "NOTE: No src/vendorlib folder found." + puts stderr "VENDORLIB: No src/vendorlib folder found." } - if {[file exists $sourcefolder/vendormodules]} { #install .tm *and other files* + puts stdout "VENDORMODULES: copying from $sourcefolder/vendormodules to $target_modules_base (if source file changed)" set resultdict [punkcheck::install $sourcefolder/vendormodules $target_modules_base -installer make.tcl -overwrite installedsourcechanged-targets -unpublish_paths {README.md}] - set copied [dict get $resultdict files_copied] - set sources_unchanged [dict get $resultdict sources_unchanged] - puts stdout "--------------------------" - flush stdout - puts stderr "Copied [llength $copied] vendor module files from src/vendormodules to $target_modules_base" - foreach f $copied { - puts stdout "COPIED $f" - } - puts stdout "[llength $sources_unchanged] unchanged source files" - puts stdout "--------------------------" + puts stdout [punkcheck::summarize_install_resultdict $resultdict] } else { - puts stderr "NOTE: No src/vendormodules folder found." + puts stderr "VENDORMODULES: No src/vendormodules folder found." } ######################################################## @@ -354,6 +338,7 @@ foreach layoutinfo $layout_update_list { foreach filepair $pairs { lassign $filepair srcfile tgtfile + file mkdir [file dirname $tgtfile] #---------- $tpl_event targetset_init INSTALL $tgtfile $tpl_event targetset_addsource $srcfile @@ -386,8 +371,6 @@ foreach layoutinfo $layout_update_list { ######################################################## - - #default source module folder is at projectroot/src/modules #There may be multiple other src module folders at same level (e.g folder not being other special-purpose folder and not matching name vendor* that contains at least one .tm file in its root) set source_module_folderlist [punk::mix::cli::lib::find_source_module_paths $projectroot] @@ -403,19 +386,54 @@ foreach src_module_dir $source_module_folderlist { set overwrite "installedsourcechanged-targets" #set overwrite "ALL-TARGETS" + puts stdout "MODULEFOLDER non_tm_files $src_module_dir - copying to $target_modules_base (if source file changed)" set resultdict [punkcheck::install_non_tm_files $src_module_dir $target_modules_base -installer make.tcl -overwrite $overwrite -unpublish_paths {README.md}] - set copied [dict get $resultdict files_copied] - set sources_unchanged [dict get $resultdict sources_unchanged] - puts stdout "--------------------------" - flush stdout - puts stderr "Copied [llength $copied] non-tm source files from $src_module_dir to $target_modules_base" - puts stderr "[llength $sources_unchanged] unchanged source files" - flush stderr - puts stdout "--------------------------" + puts stdout [punkcheck::summarize_install_resultdict $resultdict] } +set installername "make.tcl" + # ---------------------------------------- +if {[punk::repo::is_fossil_root $projectroot]} { + set config [dict create\ + -make-step configure_fossil\ + ] + #---------- + set installer [punkcheck::installtrack new $installername $projectroot/.punkcheck] + $installer set_source_target $projectroot $projectroot + set event [$installer start_event $config] + $event targetset_init VIRTUAL fossil_settings_mainmenu ;#VIRTUAL - since there is no actual target file + set menufile $projectroot/.fossil-custom/mainmenu + $event targetset_addsource $menufile + #---------- + + if {\ + [llength [dict get [$event targetset_source_changes] changed]]\ + } { + $event targetset_started + # -- --- --- --- --- --- + puts stdout "Configuring fossil setting: mainmenu from: $menufile" + if {[catch { + set fd [open $menufile r] + fconfigure $fd -translation binary + set data [read $fd] + close $fd + exec fossil settings mainmenu $data + } errM]} { + $event targetset_end FAILED -note "fossil update failed: $errM" + } else { + $event targetset_end OK + } + # -- --- --- --- --- --- + } else { + puts stderr "." + $event targetset_end SKIPPED + } + $event end + $event destroy + $installer destroy +} set buildfolder [punk::mix::cli::lib::get_build_workdir $sourcefolder] if {$buildfolder ne "$sourcefolder/_build"} { @@ -430,7 +448,8 @@ set rtfolder $sourcefolder/runtime set runtimes [glob -nocomplain -dir $rtfolder -types {f x} -tail *] if {![llength $runtimes]} { puts stderr "No executable runtimes found in $rtfolder - unable to build any .vfs folders into executables." - exit 2 + puts stderr "Add runtimes to $sourcefolder/runtime if required" + exit 0 } if {[catch {exec sdx help} errM]} { @@ -465,13 +484,15 @@ if {[file exists $mapfile]} { #drop windows .exe suffix so same config can work cross platform - extension will be re-added if necessary later set runtime [string range $runtime 0 end-4] } - set runtime_test $runtime - if {"windows" eq $::tcl_platform(platform)} { - set runtime_test $runtime.exe - } - if {![file exists [file join $rtfolder $runtime_test]]} { - puts stderr "WARNING: Missing runtime file $rtfolder/$runtime_test (line in mapvfs.config: $ln)" - lappend missing $runtime + if {$runtime ne "-"} { + set runtime_test $runtime + if {"windows" eq $::tcl_platform(platform)} { + set runtime_test $runtime.exe + } + if {![file exists [file join $rtfolder $runtime_test]]} { + puts stderr "WARNING: Missing runtime file $rtfolder/$runtime_test (line in mapvfs.config: $ln)" + lappend missing $runtime + } } foreach vfs $vfspaths { if {![file isdirectory [file join $sourcefolder $vfs]]} { @@ -511,7 +532,6 @@ if {![llength $vfs_folders]} { set vfs_folder_changes [dict create] ;#cache whether each .vfs folder has changes so we don't re-run tests if building from same .vfs with multiple runtime executables -set installername "make.tcl" # -- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- #set runtimefile [lindex $runtimes 0] foreach runtimefile $runtimes { @@ -593,7 +613,7 @@ foreach vfs $vfs_folders { set runtimes_raw $runtimes set runtimes [list] foreach rt $runtimes_raw { - if {![string match *.exe $rt]} { + if {![string match *.exe $rt] && $rt ne "-"} { set rt $rt.exe } lappend runtimes $rt @@ -615,27 +635,36 @@ foreach vfs $vfs_folders { #assert $runtimes is a list of executable names suffixed with .exe if on windows - whether or not specified with .exe in the mapvfs.config + #todo - non kit based - zipkit? + # $runtimes may now include a dash entry "-" (from mapvfs.config file) foreach rtname $runtimes { + #rtname of "-" indicates build a kit without a runtime #first configured runtime will be the one to use the same name as .vfs folder for output executable. Additional runtimes on this .vfs will need to suffix the runtime name to disambiguate. #review: This mechanism may not be great for multiplatform builds ? We may be better off consistently combining vfsname and rtname and letting a later platform-specific step choose ones to install in bin with simpler names. - if {$::tcl_platform(platform) eq "windows"} { - set targetexe ${vfsname}.exe + if {$rtname eq "-"} { + set targetkit $vfsname.kit } else { - set targetexe $vfsname - } - if {$targetexe in $exe_names_seen} { - #more than one runtime for this .vfs - set targetexe ${vfsname}_$rtname + if {$::tcl_platform(platform) eq "windows"} { + set targetkit ${vfsname}.exe + } else { + set targetkit $vfsname + } + if {$targetkit in $exe_names_seen} { + #more than one runtime for this .vfs + set targetkit ${vfsname}_$rtname + } } - lappend exe_names_seen $targetexe + lappend exe_names_seen $targetkit # -- ---------- set vfs_installer [punkcheck::installtrack new $installername $basedir/.punkcheck] $vfs_installer set_source_target $sourcefolder $buildfolder set vfs_event [$vfs_installer start_event {-make-step build_vfs}] - $vfs_event targetset_init INSTALL $buildfolder/$targetexe + $vfs_event targetset_init INSTALL $buildfolder/$targetkit $vfs_event targetset_addsource $sourcefolder/$vfs - $vfs_event targetset_addsource $buildfolder/build_$rtname + if {$rtname ne "-"} { + $vfs_event targetset_addsource $buildfolder/build_$rtname + } # -- ---------- set changed_unchanged [$vfs_event targetset_source_changes] @@ -655,9 +684,17 @@ foreach vfs $vfs_folders { if {[catch { - exec sdx wrap $buildfolder/$vfsname.new -vfs $sourcefolder/$vfs -runtime $buildfolder/build_$rtname -verbose + if {$rtname ne "-"} { + exec sdx wrap $buildfolder/$vfsname.new -vfs $sourcefolder/$vfs -runtime $buildfolder/build_$rtname -verbose + } else { + exec sdx wrap $buildfolder/$vfsname.new -vfs $sourcefolder/$vfs -verbose + } } result]} { - puts stderr "sdx wrap $buildfolder/$vfsname.new -vfs $sourcefolder/$vfs -runtime $buildfolder/build_$rtname -verbose failed with msg: $result" + if {$rtname ne "-"} { + puts stderr "sdx wrap $buildfolder/$vfsname.new -vfs $sourcefolder/$vfs -runtime $buildfolder/build_$rtname -verbose failed with msg: $result" + } else { + puts stderr "sdx wrap $buildfolder/$vfsname.new -vfs $sourcefolder/$vfs -verbose failed with msg: $result" + } } else { puts stdout "ok - finished sdx" set separator [string repeat = 40] @@ -678,65 +715,68 @@ foreach vfs $vfs_folders { } else { set pscmd "ps" } - - if {![catch { - exec $pscmd | grep $vfsname - } still_running]} { - - puts stdout "found $vfsname instances still running\n" - set count_killed 0 - foreach ln [split $still_running \n] { - puts stdout " $ln" - - if {$::tcl_platform(platform) eq "windows"} { - set pid [lindex $ln 1] - if {$forcekill} { - set killcmd [list taskkill /F /PID $pid] + + #killing process doesn't apply to .kit build + if {$rtname ne "-"} { + if {![catch { + exec $pscmd | grep $vfsname + } still_running]} { + + puts stdout "found $vfsname instances still running\n" + set count_killed 0 + foreach ln [split $still_running \n] { + puts stdout " $ln" + + if {$::tcl_platform(platform) eq "windows"} { + set pid [lindex $ln 1] + if {$forcekill} { + set killcmd [list taskkill /F /PID $pid] + } else { + set killcmd [list taskkill /PID $pid] + } } else { - set killcmd [list taskkill /PID $pid] + set pid [lindex $ln 0] + #review! + if {$forcekill} { + set killcmd [list kill -9 $pid] + } else { + set killcmd [list kill $pid] + } } - } else { - set pid [lindex $ln 0] - #review! - if {$forcekill} { - set killcmd [list kill -9 $pid] + puts stdout " pid: $pid (attempting to kill now using '$killcmd')" + if {[catch { + exec {*}$killcmd + } errMsg]} { + puts stderr "$killcmd returned an error:" + puts stderr $errMsg + puts stderr "(try '[info script] -k' option to force kill)" + exit 4 } else { - set killcmd [list kill $pid] + puts stderr "$killcmd ran without error" + incr count_killed } } - puts stdout " pid: $pid (attempting to kill now using '$killcmd')" - if {[catch { - exec {*}$killcmd - } errMsg]} { - puts stderr "$killcmd returned an error:" - puts stderr $errMsg - puts stderr "(try '[info script] -k' option to force kill)" - exit 4 - } else { - puts stderr "$killcmd ran without error" - incr count_killed + if {$count_killed > 0} { + puts stderr "\nKilled $count_killed processes. Waiting a short time before attempting to delete executable" + after 1000 } + } else { + puts stderr "Ok.. no running '$vfsname' processes found" } - if {$count_killed > 0} { - puts stderr "\nKilled $count_killed processes. Waiting a short time before attempting to delete executable" - after 1000 - } - } else { - puts stderr "Ok.. no running '$vfsname' processes found" } - if {[file exists $buildfolder/$targetexe]} { - puts stderr "deleting existing $buildfolder/$targetexe" + if {[file exists $buildfolder/$targetkit]} { + puts stderr "deleting existing $buildfolder/$targetkit" if {[catch { - file delete $buildfolder/$targetexe + file delete $buildfolder/$targetkit } msg]} { - puts stderr "Failed to delete $buildfolder/$targetexe" + puts stderr "Failed to delete $buildfolder/$targetkit" exit 4 } } - #WINDOWS filesystem 'tunneling' (file replacement within 15secs) could cause targetexe to copy ctime & shortname metadata from previous file! + #WINDOWS filesystem 'tunneling' (file replacement within 15secs) could cause targetkit to copy ctime & shortname metadata from previous file! #This is probably harmless - but worth being aware of. - file rename $buildfolder/$vfsname.new $buildfolder/$targetexe + file rename $buildfolder/$vfsname.new $buildfolder/$targetkit # -- --- --- --- --- --- $vfs_event targetset_end OK @@ -748,36 +788,36 @@ foreach vfs $vfs_folders { # -- ---------- set bin_installer [punkcheck::installtrack new "make.tcl" $deployment_folder/.punkcheck] $bin_installer set_source_target $buildfolder $deployment_folder - set bin_event [$bin_installer start_event {-make-step final_exe_install}] - $bin_event targetset_init INSTALL $deployment_folder/$targetexe - $bin_event targetset_addsource $buildfolder/$targetexe + set bin_event [$bin_installer start_event {-make-step final_kit_install}] + $bin_event targetset_init INSTALL $deployment_folder/$targetkit + $bin_event targetset_addsource $buildfolder/$targetkit $bin_event targetset_started # -- ---------- set delete_failed 0 - if {[file exists $deployment_folder/$targetexe]} { - puts stderr "deleting existing deployed at $deployment_folder/$targetexe" + if {[file exists $deployment_folder/$targetkit]} { + puts stderr "deleting existing deployed at $deployment_folder/$targetkit" if {[catch { - file delete $deployment_folder/$targetexe + file delete $deployment_folder/$targetkit } errMsg]} { - puts stderr "deletion of deployed version at $deployment_folder/$targetexe failed: $errMsg" + puts stderr "deletion of deployed version at $deployment_folder/$targetkit failed: $errMsg" #exit 5 set delete_failed 1 } } if {!$delete_failed} { puts stdout "copying.." - puts stdout "$buildfolder/$targetexe" + puts stdout "$buildfolder/$targetkit" puts stdout "to:" - puts stdout "$deployment_folder/$targetexe" + puts stdout "$deployment_folder/$targetkit" after 300 - file copy $buildfolder/$targetexe $deployment_folder/$targetexe + file copy $buildfolder/$targetkit $deployment_folder/$targetkit # -- ---------- $bin_event targetset_end OK # -- ---------- } else { - $bin_event targetset_end FAILED -note "could not delete + $bin_event targetset_end FAILED -note "could not delete" } $bin_event destroy $bin_installer destroy @@ -785,7 +825,7 @@ foreach vfs $vfs_folders { } else { set skipped_vfs_build 1 puts stderr "." - puts stdout "Skipping build for vfs $vfs - no change detected" + puts stdout "Skipping build for vfs $vfs with runtime $rtname - no change detected" $vfs_event targetset_end SKIPPED } $vfs_event destroy diff --git a/src/modules/punk/mix/templates/layouts/project/src/mixtemplates/modules/template_module-0.0.1.tm b/src/modules/punk/mix/templates/layouts/project/src/mixtemplates/modules/template_module-0.0.1.tm index 65547b4..f6b9cbd 100644 --- a/src/modules/punk/mix/templates/layouts/project/src/mixtemplates/modules/template_module-0.0.1.tm +++ b/src/modules/punk/mix/templates/layouts/project/src/mixtemplates/modules/template_module-0.0.1.tm @@ -1,52 +1,52 @@ -# -*- tcl -*- -# Maintenance Instruction: leave the 999999.xxx.x as is and use 'pmix make' or src/make.tcl to update from -buildversion.txt -# -# Please consider using a BSD or MIT style license for greatest compatibility with the Tcl ecosystem. -# Code using preferred Tcl licenses can be eligible for inclusion in Tcllib, Tklib and the punk package repository. -# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ -# (C) %year% -# -# @@ Meta Begin -# Application %pkg% 999999.0a1.0 -# Meta platform tcl -# Meta license %license% -# @@ Meta End - - - -# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ -## Requirements -##e.g package require frobz - - - - -# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ -namespace eval %pkg% { - - - - -} - - - - - - - - - - - - - - -# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ -## Ready -package provide %pkg% [namespace eval %pkg% { - variable pkg %pkg% - variable version - set version 999999.0a1.0 -}] +# -*- tcl -*- +# Maintenance Instruction: leave the 999999.xxx.x as is and use 'pmix make' or src/make.tcl to update from -buildversion.txt +# +# Please consider using a BSD or MIT style license for greatest compatibility with the Tcl ecosystem. +# Code using preferred Tcl licenses can be eligible for inclusion in Tcllib, Tklib and the punk package repository. +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +# (C) %year% +# +# @@ Meta Begin +# Application %pkg% 999999.0a1.0 +# Meta platform tcl +# Meta license %license% +# @@ Meta End + + + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Requirements +##e.g package require frobz + + + + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +namespace eval %pkg% { + + + + +} + + + + + + + + + + + + + + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Ready +package provide %pkg% [namespace eval %pkg% { + variable pkg %pkg% + variable version + set version 999999.0a1.0 +}] return \ No newline at end of file diff --git a/src/modules/punk/mix/templates/layouts/project/src/runtime/mapvfs.config b/src/modules/punk/mix/templates/layouts/project/src/runtime/mapvfs.config new file mode 100644 index 0000000..55e44e8 --- /dev/null +++ b/src/modules/punk/mix/templates/layouts/project/src/runtime/mapvfs.config @@ -0,0 +1,12 @@ +##single line per runtime executable. Name of runtime followed by list of .vfs folders with path relative to src folder. +##if runtime has no entry - it will only match a .vfs folder with a matching filename e.g runtime1.exe runtime1.vfs +##Use a runtime with a name of dash (-) to build a .kit file from the .vfs folder using no runtime +##examples: +#- myproject.vfs +## will produce myproject.kit +#tclkit86bi.exe project1.vfs project2.vfs +## will produce executables project1.exe & project2.exe (on windows) or project1 & project2 on other platforms +#tclkit87bi.exe project1.vfs +## will produce project1_tclkit87bi.exe or project1_tclkit87bi because the project1 name was already taken above +## +## All kits whether directly executable or not will deploy to the projects /bin folder diff --git a/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sample/pkgIndex.tcl b/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sample/pkgIndex.tcl index 62ef2c5..4239556 100644 --- a/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sample/pkgIndex.tcl +++ b/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sample/pkgIndex.tcl @@ -1 +1 @@ -package ifneeded app-sample 0.1 [list source [file join $dir sample.tcl]] +package ifneeded app-sample 0.1 [list source [file join $dir sample.tcl]] diff --git a/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sample/sample.tcl b/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sample/sample.tcl index 45be7e4..8e4dc09 100644 --- a/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sample/sample.tcl +++ b/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sample/sample.tcl @@ -1,8 +1,8 @@ -namespace eval sample { - proc main {} { - puts stdout "[namespace current] argc $::argc argv $::argv" - puts stdout "[namespace current] done" - } - main -} -package provide app-sample 0.1 +namespace eval sample { + proc main {} { + puts stdout "[namespace current] argc $::argc argv $::argv" + puts stdout "[namespace current] done" + } + main +} +package provide app-sample 0.1 diff --git a/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sampleshell/pkgIndex.tcl b/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sampleshell/pkgIndex.tcl index 0bb9fda..b1b5469 100644 --- a/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sampleshell/pkgIndex.tcl +++ b/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sampleshell/pkgIndex.tcl @@ -1,2 +1,2 @@ -package ifneeded app-sampleshell 0.1 [list source [file join $dir repl.tcl]] - +package ifneeded app-sampleshell 0.1 [list source [file join $dir repl.tcl]] + diff --git a/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sampleshell/repl.tcl b/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sampleshell/repl.tcl index ea63b45..cf74a72 100644 --- a/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sampleshell/repl.tcl +++ b/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/lib/app-sampleshell/repl.tcl @@ -1,111 +1,111 @@ -package provide app-punk 1.0 - - -#punk linerepl launcher - - - -#------------------------------------------------------------------------------ -#Module loading -#------------------------------------------------------------------------------ -#If the current directory contains .tm files when the punk repl starts - then it will attempt to preference them -# - but first add our other known relative modules paths - as it won't make sense to use current directory as a modulpath if it's an ancestor of one of these.. - -set original_tm_list [tcl::tm::list] -tcl::tm::remove {*}$original_tm_list - -#tm list first added end up later in the list - and then override earlier ones if version the same - so add pwd-relative 1st to give higher priority -#1 -if {[file exists [pwd]/modules]} { - catch {tcl::tm::add [pwd]/modules} -} - -#2) -if {[string match "*.vfs/*" [info script]]} { - #src/xxx.vfs/lib/app-punk/repl.tcl - #we assume if calling directly into .vfs that the user would prefer to use src/modules - so go up 4 levels - set modulefolder [file dirname [file dirname [file dirname [file dirname [info script]]]]]/modules - -} else { - # .../bin/punkXX.exe look for ../modules (i.e modules folder at same level as bin folder) - set modulefolder [file dirname [file dirname [info nameofexecutable]]]/modules -} - -if {[file exists $modulefolder]} { - tcl::tm::add $modulefolder -} else { - puts stderr "Warning unable to find module folder at: $modulefolder" -} - -#libs are appended to end - so add higher prioriy libraries last (opposite to modules) -#auto_path - add exe-relative after exe-relative path -set libfolder [file dirname [file dirname [info nameofexecutable]]]/lib -if {[file exists $libfolder]} { - lappend ::auto_path $libfolder -} -if {[file exists [pwd]/lib]} { - lappend ::auto_path [pwd]/lib -} - - -#2) -#now add current dir (if no conflict with above) -set currentdir_modules [glob -nocomplain -dir [pwd] -type f -tail *.tm] -set tcl_core_packages [list tcl::zlib zlib tcl::oo TclOO tcl::tommath tcl::zipfs Tcl Tk] -if {[llength $currentdir_modules]} { - #only forget all *unloaded* package names if we are started in a .tm containing folder - foreach pkg [package names] { - if {$pkg in $tcl_core_packages} { - continue - } - if {![llength [package versions $pkg]]} { - #puts stderr "Got no versions for pkg $pkg" - continue - } - if {![string length [package provide $pkg]]} { - package forget $pkg - } - } - catch {tcl::tm::add [pwd]} -} - - -#puts stdout "$::auto_path" -package require Thread -#These are strong dependencies -# - the repl requires Threading and punk,shellfilter,shellrun to call and display properly. -# tm list already indexed - need 'package forget' to find modules based on current tcl::tm::list -set required [list\ - shellfilter - shellrun\ - punk\ - ] - -catch { - foreach pkg $required { - package forget $pkg - package require $pkg - } -} - - -#restore module paths -set tm_list_now [tcl::tm::list] -foreach p $original_tm_list { - if {$p ni $tm_list_now} { - #the prior tm paths go to the head of the list. - #They are processed first.. but an item of same version later in the list will override one at the head. - tcl::tm::add $p - } -} -#------------------------------------------------------------------------------ - -foreach pkg $required { - package require $pkg -} - -package require punk::repl -repl::start stdin - - - +package provide app-punk 1.0 + + +#punk linerepl launcher + + + +#------------------------------------------------------------------------------ +#Module loading +#------------------------------------------------------------------------------ +#If the current directory contains .tm files when the punk repl starts - then it will attempt to preference them +# - but first add our other known relative modules paths - as it won't make sense to use current directory as a modulpath if it's an ancestor of one of these.. + +set original_tm_list [tcl::tm::list] +tcl::tm::remove {*}$original_tm_list + +#tm list first added end up later in the list - and then override earlier ones if version the same - so add pwd-relative 1st to give higher priority +#1 +if {[file exists [pwd]/modules]} { + catch {tcl::tm::add [pwd]/modules} +} + +#2) +if {[string match "*.vfs/*" [info script]]} { + #src/xxx.vfs/lib/app-punk/repl.tcl + #we assume if calling directly into .vfs that the user would prefer to use src/modules - so go up 4 levels + set modulefolder [file dirname [file dirname [file dirname [file dirname [info script]]]]]/modules + +} else { + # .../bin/punkXX.exe look for ../modules (i.e modules folder at same level as bin folder) + set modulefolder [file dirname [file dirname [info nameofexecutable]]]/modules +} + +if {[file exists $modulefolder]} { + tcl::tm::add $modulefolder +} else { + puts stderr "Warning unable to find module folder at: $modulefolder" +} + +#libs are appended to end - so add higher prioriy libraries last (opposite to modules) +#auto_path - add exe-relative after exe-relative path +set libfolder [file dirname [file dirname [info nameofexecutable]]]/lib +if {[file exists $libfolder]} { + lappend ::auto_path $libfolder +} +if {[file exists [pwd]/lib]} { + lappend ::auto_path [pwd]/lib +} + + +#2) +#now add current dir (if no conflict with above) +set currentdir_modules [glob -nocomplain -dir [pwd] -type f -tail *.tm] +set tcl_core_packages [list tcl::zlib zlib tcl::oo TclOO tcl::tommath tcl::zipfs Tcl Tk] +if {[llength $currentdir_modules]} { + #only forget all *unloaded* package names if we are started in a .tm containing folder + foreach pkg [package names] { + if {$pkg in $tcl_core_packages} { + continue + } + if {![llength [package versions $pkg]]} { + #puts stderr "Got no versions for pkg $pkg" + continue + } + if {![string length [package provide $pkg]]} { + package forget $pkg + } + } + catch {tcl::tm::add [pwd]} +} + + +#puts stdout "$::auto_path" +package require Thread +#These are strong dependencies +# - the repl requires Threading and punk,shellfilter,shellrun to call and display properly. +# tm list already indexed - need 'package forget' to find modules based on current tcl::tm::list +set required [list\ + shellfilter + shellrun\ + punk\ + ] + +catch { + foreach pkg $required { + package forget $pkg + package require $pkg + } +} + + +#restore module paths +set tm_list_now [tcl::tm::list] +foreach p $original_tm_list { + if {$p ni $tm_list_now} { + #the prior tm paths go to the head of the list. + #They are processed first.. but an item of same version later in the list will override one at the head. + tcl::tm::add $p + } +} +#------------------------------------------------------------------------------ + +foreach pkg $required { + package require $pkg +} + +package require punk::repl +repl::start stdin + + + diff --git a/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/main.tcl b/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/main.tcl index 04b77e5..7220e9f 100644 --- a/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/main.tcl +++ b/src/modules/punk/mix/templates/layouts/project/src/sample.vfs/main.tcl @@ -1,23 +1,23 @@ - -if {[catch {package require starkit}]} { - #presumably running the xxx.vfs/main.tcl script using a non-starkit tclsh that doesn't have starkit lib available.. lets see if we can move forward anyway - lappend ::auto_path [file join [file dirname [info script]] lib] -} else { - starkit::startup -} - -#when run as a tclkit - the exe is mounted as a dir and Tcl's auto_execok doesn't find it -set thisexe [file tail [info nameofexecutable]] -set thisexeroot [file rootname $thisexe] -set ::auto_execs($thisexeroot) [info nameofexecutable] -if {$thisexe ne $thisexeroot} { - set ::auto_execs($thisexe) [info nameofexecutable] -} - -if {[llength $::argv]} { - package require app-sample -} else { - package require app-sampleshell - repl::start stdin -} - + +if {[catch {package require starkit}]} { + #presumably running the xxx.vfs/main.tcl script using a non-starkit tclsh that doesn't have starkit lib available.. lets see if we can move forward anyway + lappend ::auto_path [file join [file dirname [info script]] lib] +} else { + starkit::startup +} + +#when run as a tclkit - the exe is mounted as a dir and Tcl's auto_execok doesn't find it +set thisexe [file tail [info nameofexecutable]] +set thisexeroot [file rootname $thisexe] +set ::auto_execs($thisexeroot) [info nameofexecutable] +if {$thisexe ne $thisexeroot} { + set ::auto_execs($thisexe) [info nameofexecutable] +} + +if {[llength $::argv]} { + package require app-sample +} else { + package require app-sampleshell + repl::start stdin +} +