diff --git a/src/bootsupport/modules/punk/mix/templates-0.2.0.tm b/src/bootsupport/modules/punk/mix/templates-0.2.0.tm index 449b65a6..42e47414 100644 Binary files a/src/bootsupport/modules/punk/mix/templates-0.2.0.tm and b/src/bootsupport/modules/punk/mix/templates-0.2.0.tm differ diff --git a/src/bootsupport/modules/punk/platform-0.1.0.tm b/src/bootsupport/modules/punk/platform-0.1.0.tm new file mode 100644 index 00000000..41b41736 --- /dev/null +++ b/src/bootsupport/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