diff --git a/src/vfs/_vfscommon.vfs/modules/punk-0.2.6.tm b/src/vfs/_vfscommon.vfs/modules/punk-0.2.7.tm similarity index 99% rename from src/vfs/_vfscommon.vfs/modules/punk-0.2.6.tm rename to src/vfs/_vfscommon.vfs/modules/punk-0.2.7.tm index c623c2e3..aac58c5f 100644 --- a/src/vfs/_vfscommon.vfs/modules/punk-0.2.6.tm +++ b/src/vfs/_vfscommon.vfs/modules/punk-0.2.7.tm @@ -8983,10 +8983,77 @@ namespace eval punk { return $chunks } - register topics {help} "List help topics" - register tcl {} "Tcl version warnings" - register env {environment} "punkshell environment vars" - register console {term terminal} "Some console behaviour tests and warnings" + punk::args::define { + @id -id ::punk::helptopic::platforms + @cmd -name "help platforms"\ + -summary\ + "Canonical punkshell platform names."\ + -help\ + "Show the canonical punkshell platform-dir names + (punk::platform::platforms) with status, the artifact-tree + tiers each name serves, and the buildsuite axis (whether the + punkshell zig buildsuites produce runtimes for the platform - + separate from hosting: punkbin-structured repos can carry + runtimes built by any mechanism), marking the running + interpreter's own platform. These names organize the punkbin + artifact repo's platform folders, bin/runtime// + (punk-runtime fetch/list/use -platform), the lib_tclX / + vendorlib_tclX auto_path dirs wired by the boot, and the + runtime-artifact metadata target field. The raw Tcl + platform-package identifiers are shown for comparison + (punk::platform::normalize folds their version-dependent + aliases - amd64/aarch64/macos - into the canonical names)." + @values -min 0 -max 0 + } + proc platforms {context args} { + if {[catch {package require punk::platform} errM]} { + return [list [list stderr "help platforms: punk::platform package not available ($errM)\n"]] + } + set frametype [dict get $context frametype] + set chunks [list] + set local_lib [punk::platform::local -tier lib] + set local_runtime [punk::platform::local -tier runtime] + set title "[a+ brightgreen] Canonical punkshell platform names: " + set t [textblock::class::table new -show_seps 0] + $t configure -frametype $frametype + $t add_column -headers [list "Platform"] + $t add_column -headers [list "Status"] + $t add_column -headers [list "Tiers"] + $t add_column -headers [list "Buildsuite"] + $t add_column -headers [list "Notes"] + dict for {p pinfo} [punk::platform::platforms] { + set pshown $p + if {$p eq $local_lib || $p eq $local_runtime} { + set pshown "* $p" + } + $t add_row [list $pshown [dict get $pinfo status] [join [dict get $pinfo tiers] ,] [dict get $pinfo buildsuite] [dict get $pinfo notes]] + } + foreach c {0 1 2 3} { + $t configure_column $c -minwidth [expr {[$t column_datawidth $c] + 2}] + } + $t configure -title $title + set text [$t print] + $t destroy + lappend chunks [list stdout $text] + set detail "* = this interpreter. local: lib-tier $local_lib" + if {$local_runtime ne $local_lib} { + append detail " runtime-tier $local_runtime" + } + append detail "\ntiers: runtime = punkbin + bin/runtime folders; lib = lib_tclX/vendorlib_tclX auto_path dirs" + append detail "\nbuildsuite: whether the punkshell zig buildsuites produce runtimes for the platform" + append detail "\n(a separate axis - punkbin-structured repos can host runtimes built by any mechanism)" + catch { + append detail "\nraw Tcl platform package ([package present platform]): generic [platform::generic] identify [platform::identify]" + } + lappend chunks [list stdout $detail\n] + return $chunks + } + + register topics {help} "List help topics" + register tcl {} "Tcl version warnings" + register env {environment} "punkshell environment vars" + register console {term terminal} "Some console behaviour tests and warnings" + register platforms {platform} "Canonical punkshell platform names" } #return list of {chan chunk} elements @@ -9438,7 +9505,7 @@ punkcheck::cli set_alias punkcheck package provide punk [namespace eval punk { #FUNCTL variable version - set version 0.2.6 + set version 0.2.7 }] diff --git a/src/vfs/_vfscommon.vfs/modules/punk/mix/templates-0.2.0.tm b/src/vfs/_vfscommon.vfs/modules/punk/mix/templates-0.2.0.tm index 5a593227..2a452ae9 100644 Binary files a/src/vfs/_vfscommon.vfs/modules/punk/mix/templates-0.2.0.tm and b/src/vfs/_vfscommon.vfs/modules/punk/mix/templates-0.2.0.tm differ diff --git a/src/vfs/_vfscommon.vfs/modules/punk/mod-0.1.1.tm b/src/vfs/_vfscommon.vfs/modules/punk/mod-0.1.1.tm index 35559708..ac781c3c 100644 --- a/src/vfs/_vfscommon.vfs/modules/punk/mod-0.1.1.tm +++ b/src/vfs/_vfscommon.vfs/modules/punk/mod-0.1.1.tm @@ -71,12 +71,16 @@ namespace eval punk::mod::cli { } } dict set appinfo versions $versions - #todo - natsort! - set sorted_versions [lsort $versions] - set latest [lindex $sorted_versions 0] - if {$latest eq "" && [llength $sorted_versions] > 1} { - set latest [lindex $sorted_versions 1] + #version-aware selection (2026-07-22 audit): was a plain lexical lsort + #(1.10 sorts before 1.9) with lindex 0 - the LOWEST - as 'latest'. + #Empty version (unversioned main) is excluded from comparison (package + #vcompare errors on empty operands); latest = highest by vcompare. + set realversions {} + foreach v $versions { + if {$v ne ""} {lappend realversions $v} } + set sorted_versions [lsort -command {package vcompare} $realversions] + set latest [lindex $sorted_versions end] ;#"" when only an unversioned main exists dict set appinfo latest $latest dict set appinfo bases $bases diff --git a/src/vfs/_vfscommon.vfs/modules/punk/platform-0.1.0.tm b/src/vfs/_vfscommon.vfs/modules/punk/platform-0.1.0.tm new file mode 100644 index 00000000..41b41736 --- /dev/null +++ b/src/vfs/_vfscommon.vfs/modules/punk/platform-0.1.0.tm @@ -0,0 +1,237 @@ +# -*- 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) 2026 +# +# @@ Meta Begin +# Application punk::platform 0.1.0 +# Meta platform tcl +# Meta license BSD +# @@ Meta End + + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Requirements +package require platform ;#Tcl's own platform package (vendored 1.0.19 in kits; 1.1.x in tcl9 core) - the RAW identifier underneath this module's normalization + + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +namespace eval punk::platform { + #punk::platform - the CANONICAL punkshell platform naming layer (2026-07-22 + #platform-folder synchronization; groundwork for the G-105 cross-target arc). + # + #punkshell artifact trees are organized by PLATFORM-DIR names of the form + #- (e.g win32-x86_64), used by: the punkbin artifact repo's top-level + #folders, bin/runtime// (the runtime store punk-runtime manages), + #lib_tclX/ + vendorlib_tclX/ auto_path dirs (wired by the + #boot machinery), and the G-103 runtime artifact metadata 'target' field. + # + #Tcl's platform package remains the raw identifier (platform::generic / + #platform::identify) but its outputs vary by version and pass some machine + #names through unmapped - the differences this module's normalize absorbs: + # - cpu 'amd64' (BSD machine names) -> x86_64 + # - cpu 'aarch64' (linux arm64) -> arm64 + # - os 'macos' (platform 1.1.x on osVersion>19; older versions and the + # boot's snipped copy say 'macosx') -> macosx + # - macosx cpu 'arm' -> arm64 (platform::generic's 'arm*' glob collapses + # the darwin 'arm64' machine name to 'arm'; Apple silicon is 64-bit only, + # so the arm token on macosx always means arm64. Elsewhere 'arm' is a + # genuine 32-bit token and is preserved.) + #The special name 'macosx' (no cpu suffix) is the RUNTIME-tier convention for + #universal (multi-arch) macOS binaries - punkbin and bin/runtime keep one + #universal folder; the per-arch macosx-x86_64/macosx-arm64 names serve the + #lib-tree tier where per-arch payloads are the norm. + # + #The boot machinery (punkboot::lib in src/vfs/_config/punk_main.tcl / + #project_main.tcl and src/make.tcl) cannot 'package require' at its stage and + #carries a snipped platform::generic plus an inline copy of THIS module's + #normalization mapping - if the mapping here changes, those copies must + #change with it (each carries a pointer comment to this module). + + namespace eval argdoc { + variable PUNKARGS + } + + #canonical platform records. status: + # supported - a punkshell target: artifact trees exist or are planned and + # tooling/build arcs (G-103/G-105) treat it as a real target + # dormant - recognized and folders may exist, but utility is under review + # recognized - a name the naming scheme reserves; no artifacts or tooling yet + #tiers: which artifact-tree tiers use the name - + # runtime = punkbin platform folders + bin/runtime// + # lib = lib_tclX/ + vendorlib_tclX/ auto_path dirs + #buildsuite: whether OUR zig buildsuite system (src/buildsuites; G-103 kit + #family, G-105 cross-target) produces runtimes for the platform. A SEPARATE + #AXIS from tiers deliberately: punkbin (or a third-party repo using the same + #structure) can host runtimes built by any mechanism - a platform can be + #runtime-tier hosted while buildsuite=none (we may never build it ourselves). + # supported - a tracked suite produces family artifacts today + # planned - named in an active/proposed goal (e.g G-105 linux-first) + # candidate - plausible zig target, no committed goal + # none - no build intention; hosted/third-party runtimes only + variable platforms { + win32-x86_64 {status supported tiers {runtime lib} buildsuite supported notes "primary development platform (suite_tcl90)"} + win32-ix86 {status supported tiers {runtime lib} buildsuite candidate notes "32-bit x86; hosting for available third-party runtimes/libs - zig can target it but a buildsuite is undetermined"} + linux-x86_64 {status supported tiers {runtime lib} buildsuite planned notes "G-105 first cross-target, WSL-verified"} + linux-arm64 {status supported tiers {runtime lib} buildsuite candidate notes "aarch64; punkbin's existing arm kit predates the arm64 name and sits in linux-arm"} + linux-arm {status supported tiers {runtime lib} buildsuite candidate notes "32-bit arm"} + macosx {status supported tiers {runtime} buildsuite candidate notes "universal (multi-arch) macOS binaries - runtime tier keeps one folder; zig darwin cross needs SDK work"} + macosx-x86_64 {status supported tiers {lib} buildsuite none notes "would follow a macosx runtime arc"} + macosx-arm64 {status supported tiers {lib} buildsuite none notes "Apple silicon; would follow a macosx runtime arc"} + freebsd-x86_64 {status supported tiers {runtime lib} buildsuite candidate notes ""} + freebsd-arm64 {status supported tiers {runtime lib} buildsuite candidate notes "no artifacts yet"} + msys-x86_64 {status dormant tiers {lib} buildsuite none notes "msys/cygwin-built tclsh runtimes; utility under review"} + openbsd-x86_64 {status recognized tiers {runtime} buildsuite none notes "hosted third-party runtimes possible"} + netbsd-x86_64 {status recognized tiers {runtime} buildsuite none notes "hosted third-party runtimes possible"} + dragonflybsd-x86_64 {status recognized tiers {runtime} buildsuite none notes "hosted third-party runtimes possible"} + } + + namespace eval argdoc { + variable PUNKARGS + lappend PUNKARGS [list { + @id -id ::punk::platform::platforms + @cmd -name punk::platform::platforms\ + -summary\ + "Canonical punkshell platform records."\ + -help\ + "Return the canonical punkshell platform-name records as a dict + keyed by platform-dir name (e.g win32-x86_64). Each value is a + dict with keys: + status supported|dormant|recognized + tiers which artifact-tree tiers use the name + (runtime = punkbin + bin/runtime folders, + lib = lib_tclX/vendorlib_tclX auto_path dirs) + buildsuite supported|planned|candidate|none - whether the + punkshell zig buildsuite system produces + runtimes for the platform. Deliberately a + separate axis from tiers: punkbin-structured + repos can host runtimes built by any mechanism, + so a platform can be runtime-tier hosted while + buildsuite=none. + notes free-text qualifiers + These names are the contract for punkbin platform folders, + bin/runtime//, lib_tclX/vendorlib_tclX platform + dirs and the G-103 runtime-artifact metadata target field. + See also 'help platforms' in the punk shell." + @values -min 0 -max 0 + }] + } + proc platforms {} { + variable platforms + return $platforms + } + + namespace eval argdoc { + variable PUNKARGS + lappend PUNKARGS [list { + @id -id ::punk::platform::normalize + @cmd -name punk::platform::normalize\ + -summary\ + "Normalize a platform identifier to the canonical punkshell name."\ + -help\ + "Normalize a platform::generic-style - identifier (or an + already-canonical punkshell name) to the canonical punkshell + platform-dir name: + cpu amd64 -> x86_64, aarch64 -> arm64 + os macos -> macosx (Tcl platform 1.1.x renamed modern macOS) + macosx cpu arm -> arm64 (platform::generic's arm* glob folds + the darwin arm64 machine name to arm; Apple silicon is + 64-bit only - non-macosx 'arm' stays 32-bit arm) + Unrecognized os/cpu tokens pass through unchanged - normalize + never invents names, it only folds known aliases." + @values -min 1 -max 1 + platform -type string -help\ + "Platform identifier, e.g the result of platform::generic." + }] + } + proc normalize {platform} { + set parts [split $platform -] + if {[llength $parts] < 2} { + #single-token names (e.g the universal 'macosx') - fold macos only + if {$platform eq "macos"} { + return macosx + } + return $platform + } + #os may itself contain a dash in principle - treat last token as cpu + set cpu [lindex $parts end] + set os [join [lrange $parts 0 end-1] -] + switch -- $os { + macos {set os macosx} + } + switch -- $cpu { + amd64 {set cpu x86_64} + aarch64 {set cpu arm64} + i386 - i486 - i586 - i686 {set cpu ix86} + arm { + if {$os eq "macosx"} { + set cpu arm64 + } + } + } + return "${os}-${cpu}" + } + + namespace eval argdoc { + variable PUNKARGS + lappend PUNKARGS [list { + @id -id ::punk::platform::local + @cmd -name punk::platform::local\ + -summary\ + "Canonical punkshell platform name of the running interpreter."\ + -help\ + "Return the canonical punkshell platform-dir name for the running + interpreter: platform::generic normalized per + punk::platform::normalize. + With -tier runtime, macosx per-arch names collapse to the + universal 'macosx' (the runtime-store convention: punkbin and + bin/runtime keep one universal macOS folder; the same collapse + src/make.tcl applies when locating bin/runtime/). + -tier lib (the default) returns the per-arch name used by the + lib_tclX/vendorlib_tclX auto_path dirs." + @opts + -tier -type string -default lib -choices {lib runtime} -help\ + "Artifact-tree tier the name is for." + @values -min 0 -max 0 + }] + } + proc local {args} { + set tier lib + foreach {k v} $args { + switch -- $k { + -tier { + if {$v ni {lib runtime}} { + error "punk::platform::local - invalid -tier '$v' (expected lib|runtime)" + } + set tier $v + } + default { + error "punk::platform::local - unknown option '$k' (known: -tier)" + } + } + } + set p [normalize [::platform::generic]] + if {$tier eq "runtime" && [string match macosx-* $p]} { + return macosx + } + return $p + } +} + + +namespace eval ::punk::args::register { + #use fully qualified so 8.6 doesn't find existing var in global namespace + lappend ::punk::args::register::NAMESPACES ::punk::platform +} + + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Ready +package provide punk::platform [namespace eval punk::platform { + variable version + set version 0.1.0 +}] +return