|
|
|
@ -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] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# ---------------------------------------- |
|
|
|
|
|
|
|
|
|