You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
10 KiB
219 lines
10 KiB
# -*- tcl -*- |
|
# Maintenance Instruction: leave the 999999.xxx.x as is and use 'pmix make' or src/make.tcl to update from <pkg>-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 999999.0a1.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 |
|
#<os>-<cpu> (e.g win32-x86_64), used by: the punkbin artifact repo's top-level |
|
#folders, bin/runtime/<platform>/ (the runtime store punk-runtime manages), |
|
#lib_tclX/<platform> + vendorlib_tclX/<platform> 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/<platform>/ |
|
# lib = lib_tclX/<platform> + vendorlib_tclX/<platform> auto_path dirs |
|
variable platforms { |
|
win32-x86_64 {status supported tiers {runtime lib} notes "primary development platform"} |
|
linux-x86_64 {status supported tiers {runtime lib} notes ""} |
|
linux-arm64 {status supported tiers {runtime lib} notes "aarch64; punkbin's existing arm kit predates the arm64 name and sits in linux-arm"} |
|
linux-arm {status supported tiers {runtime lib} notes "32-bit arm"} |
|
macosx {status supported tiers {runtime} notes "universal (multi-arch) macOS binaries - runtime tier keeps one folder"} |
|
macosx-x86_64 {status supported tiers {lib} notes ""} |
|
macosx-arm64 {status supported tiers {lib} notes "Apple silicon"} |
|
freebsd-x86_64 {status supported tiers {runtime lib} notes ""} |
|
freebsd-arm64 {status supported tiers {runtime lib} notes "no artifacts yet"} |
|
msys-x86_64 {status dormant tiers {lib} notes "msys/cygwin-built tclsh runtimes; utility under review"} |
|
openbsd-x86_64 {status recognized tiers {} notes ""} |
|
netbsd-x86_64 {status recognized tiers {} notes ""} |
|
dragonflybsd-x86_64 {status recognized tiers {} notes ""} |
|
} |
|
|
|
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) |
|
notes free-text qualifiers |
|
These names are the contract for punkbin platform folders, |
|
bin/runtime/<platform>/, 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 <os>-<cpu> 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} |
|
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/<platform>). |
|
-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 999999.0a1.0 |
|
}] |
|
return
|
|
|