From 2e8b4354370397a2c1d5c7cca9f35ccef72c9ca1 Mon Sep 17 00:00:00 2001 From: Julian Noble Date: Thu, 17 Aug 2023 07:56:14 +1000 Subject: [PATCH] copy updated make.tcl to project template --- .../templates/layouts/project/src/make.tcl | 193 ++++++++++++++++-- 1 file changed, 180 insertions(+), 13 deletions(-) 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 f053cd5f..70b41b1b 100644 --- a/src/modules/punk/mix/templates/layouts/project/src/make.tcl +++ b/src/modules/punk/mix/templates/layouts/project/src/make.tcl @@ -5,32 +5,199 @@ #It is assumed the src folder has been placed somewhere where appropriate #(e.g not in /usr or c:/ - unless you intend it to directly make and place folders and files in those locations) -package require punk::mix +set hashline "# ## ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ###" +puts $hashline +puts " punkshell make script " +puts $hashline\n +namespace eval ::punkmake { + variable scriptfolder [file normalize [file dirname [info script]]] + variable foldername [file tail $scriptfolder] + variable pkg_requirements [list]; variable pkg_missing [list];variable pkg_loaded [list] + variable non_help_flags [list -k] + variable help_flags [list -help --help /?] + variable known_commands [list project get-project-info] +} +if {"::try" ni [info commands ::try]} { + puts stderr "Tcl interpreter possibly too old - 'try' command not found - aborting" + exit 1 +} +# ** *** *** *** *** *** *** *** *** *** *** *** +#*temporarily* hijack package command +# ** *** *** *** *** *** *** *** *** *** *** *** +try { + rename ::package ::punkmake::package_temp_aside + proc ::package {args} { + if {[lindex $args 0] eq "require"} { + lappend ::punkmake::pkg_requirements [lindex $args 1] + } + } + package require punk::mix + package require punk::repo +} finally { + catch {rename ::package ""} + catch {rename ::punkmake::package_temp_aside ::package} +} +# ** *** *** *** *** *** *** *** *** *** *** *** +foreach pkg $::punkmake::pkg_requirements { + if {[catch {package require $pkg} errM]} { + puts stderr "missing pkg: $pkg" + lappend ::punkmake::pkg_missing $pkg + } else { + lappend ::punkmake::pkg_loaded $pkg + } +} + + + + +proc punkmake_gethelp {args} { + set scriptname [file tail [info script]] + append h "Usage:" \n + append h "" \n + append h " $scriptname -help or $scriptname --help or $scriptname /? or just $scriptname" \n + append h " - This help." \n \n + append h " $scriptname project ?-k?" \n + append h " - this is the literal word project - and confirms you want to run the project build" \n + append h " - the optional -k flag will terminate processes running as the executable being built (if applicable)" \n \n + append h " $scriptname get-project-info" \n + append h " - show the name and base folder of the project to be built" \n + append h "" \n + if {[llength $::punkmake::pkg_missing]} { + append h "* ** NOTE ** ***" \n + append h " punkmake has detected that the following packages could not be loaded:" \n + append h " " [join $::punkmake::pkg_missing "\n "] \n + append h "* ** *** *** ***" \n + append h " These packages are required for punk make to function" \n \n + append h "* ** *** *** ***" \n\n + append h "Successfully Loaded packages:" \n + append h " " [join $::punkmake::pkg_loaded "\n "] \n + } + return $h +} +set scriptargs $::argv +set do_help 0 +if {![llength $scriptargs]} { + set do_help 1 +} else { + foreach h $::punkmake::help_flags { + if {[lsearch $scriptargs $h] >= 0} { + set do_help 1 + break + } + } +} +set commands_found [list] +foreach a $scriptargs { + if {![string match -* $a]} { + lappend commands_found $a + } else { + if {$a ni $::punkmake::non_help_flags} { + set do_help 1 + } + } +} +if {[llength $commands_found] != 1 } { + set do_help 1 +} elseif {[lindex $commands_found 0] ni $::punkmake::known_commands} { + puts stderr "Unknown command: [lindex $commands_found 0]\n\n" + set do_help 1 +} +if {$do_help} { + puts stderr [punkmake_gethelp] + exit 1 +} + +set ::punkmake::command [lindex $commands_found 0] + if {[lsearch $::argv -k] >= 0} { set forcekill 1 } else { set forcekill 0 } -puts stdout "::argv $::argv" -set sourcefolder [file normalize [file dirname [info script]]] +#puts stdout "::argv $::argv" # ---------------------------------------- -set target_modules_base [file dirname $sourcefolder]/modules -file mkdir $target_modules_base +set scriptfolder $::punkmake::scriptfolder -#external modules first - and any supporting files - no 'building' required -set copied [punk::mix::cli::lib::copy_files_from_source_to_base $sourcefolder/deps $target_modules_base -force 1] -puts stderr "Copied [llength $copied] dependencies" -set src_module_dir $sourcefolder/modules -#modules and associated files belonging to this package/app -set copied [punk::mix::cli::lib::build_modules_from_source_to_base $src_module_dir $target_modules_base -glob *.tm] ;#will only accept a glob ending in .tm -puts stderr "Copied [llength $copied] app modules" +#first look for a project root (something under fossil or git revision control AND matches punk project folder structure) +#If that fails - just look for a 'project shaped folder' ie meets minimum requirements of /src /src/lib /src/modules /lib /modules +if {![string length [set projectroot [punk::repo::find_project $scriptfolder]]]} { + if {![string length [set projectroot [punk::repo::find_candidate $scriptfolder]]]} { + puts stderr "punkmake script unable to determine an approprite project root at or above the path '$scriptfolder' ensure the make script is within a project folder structure" + puts stderr " -aborted- " + exit 2 + #todo? + #ask user for a project name and create basic structure? + #call punk::mix::cli::new $projectname on parent folder? + } else { + puts stderr "WARNING punkmake script operating in project space that is not under version control" + } +} else { + +} + +if {$::punkmake::command eq "get-project-info"} { + puts stdout "- -- --- --- --- --- --- --- --- --- ---" + puts stdout "- -- get-project-info -- -" + puts stdout "- -- --- --- --- --- --- --- --- --- ---" + puts stdout "- projectroot : $projectroot" + if {[punk::repo::find_fossil $scriptfolder] eq $projectroot} { + set vc "fossil" + set rev [punk::repo::fossil_revision $scriptfolder] + } elseif {[punk::repo::find_git $scriptfolder] eq $projectroot} { + set vc "git" + set rev [punk::repo::git_revision $scriptfolder] + } else { + set vc " - none found -" + set rev "n/a" + } + puts stdout "- version control : $vc" + puts stdout "- revision : $rev" + puts stdout "- -- --- --- --- --- --- --- --- --- ---" -set copied [punk::mix::cli::lib::copy_nonmodules_from_source_to_base $src_module_dir $target_modules_base -force 1] + exit 0 +} +if {$::punkmake::command ne "project"} { + puts stderr "Command $::punkmake::command not implemented - aborting." + exit 1 +} + + +set sourcefolder $projectroot/src + +#only a single consolidated /modules folder used for target +set target_modules_base $projectroot/modules +file mkdir $target_modules_base + +#external libs and modules first - and any supporting files - no 'building' required +if {[file exists $sourcefolder/vendorlib]} { + set copied [punk::mix::cli::lib::copy_files_from_source_to_target $sourcefolder/vendorlib $projectroot/lib -overwrite ALL-TARGETS] + puts stderr "Copied [llength $copied] vendor libs from src/vendorlib to $projectroot/lib" +} else { + puts stderr "NOTE: No src/vendorlib folder found." +} +if {[file exists $sourcefolder/vendormodules]} { + set copied [punk::mix::cli::lib::copy_files_from_source_to_target $sourcefolder/vendormodules $target_modules_base -overwrite ALL-TARGETS] + puts stderr "Copied [llength $copied] vendor modules from src/vendormodules to $target_modules_base" +} else { + puts stderr "NOTE: No src/vendormodules folder found." +} + +#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] +foreach src_module_dir $source_module_folderlist { + set dirtail [file tail $src_module_dir] + #modules and associated files belonging to this package/app + set copied [punk::mix::cli::lib::build_modules_from_source_to_base $src_module_dir $target_modules_base -glob *.tm] ;#will only accept a glob ending in .tm + puts stderr "Copied [llength $copied] tm modules from src/$dirtail to $target_modules_base " + + set copied [punk::mix::cli::lib::copy_nonmodules_from_source_to_base $src_module_dir $target_modules_base -overwrite ALL-TARGETS] +} # ----------------------------------------