# Extend the auto_path variable to include a platform specific directory # This provides the for multi-platform Starkits very easily. When # wrapping a starkit with a runtime binary, you can exclude unneeded # platform specific extensions by add the -ignore option to the wrap # command as such: # # tclkit sdx.kit wrap myapp.freebsd5 -runtime tclkit-freebsd5-x86 \ # -ignore _platform_Darwin-ppc -ignore _platform_Linux-x86 \ # -ignore _platform_Linux-x86_64 -ignore _platform_Windows-x86 # # Platform directories are generally located in the lib directory of the # .vfs and are named such as: # _platform_Darwin-ppc # _platform_Darwin-ppc_classic # _platform_Darwin-ppc_aqua # _platform_Darwin-ppc_x11_32 # _platform_FreeBSD-x86 # _platform_FreeBSD-x86_64 # _platform_Linux-x86_32 # _platform_Linux-x86_64 # _platform_SunOS-sparc # _platform_SunOS-x86_32 # _platform_Windows-x86_32 # # Platform directories will be appended to ::auto_path if they exist, # in order from more specific to less specific. The order used starts # with platform/windowingsystem/wordsize and progresses with # platform/windowingsystem, platform/wordsize, and finishing with # just platform. For instance: # _platform_Linux-x86_x11_32 # _platform_Linux-x86_x11 # _platform_Linux-x86_32 # _platform_Linux-x86 # # Created by Chuck Ferril (wcf3) 04/2005 # # Modified by wcf3 05/2005 to include the windowing system as # suggested by an unknown person on the wiki. Also allowed for # combining multiple layers of platform specific paths and cleaned # up the code a bit. # proc ::auto_path4platform { dir } { rename ::auto_path4platform {} # generate the platform path set platform [file join $dir "_platform_[lindex $::tcl_platform(os) 0]-"] switch -glob -- $::tcl_platform(machine) { intel - x86* - i*86* { append platform "x86" } "Power*" { append platform "ppc" } sun4* { append platform "sparc" } default { append platform "$::tcl_platform(machine)" } } # generate the windowing system portion set windowingsystem "" if { [info commands tk] != {} } { set windowingsystem "_[tk windowingsystem]" } # generate the word size portion set wordsize "" if { [info exists ::tcl_platform(wordSize)] } { set wordsize "_[expr {$::tcl_platform(wordSize) * 8}]" } # append paths to ::auto_path starting with more specific and running to less specific foreach testdir [list "${platform}${windowingsystem}$wordsize" \ "${platform}$windowingsystem" \ "${platform}$wordsize" \ "$platform"] { if { [file exists $testdir] && [lsearch -exact $::auto_path $testdir] == -1 } { lappend ::auto_path $testdir } } } ::auto_path4platform $dir
LV Just curious, why prefix the directory with _platform_ ? Note, however, I'd love to see something like this added to sdx's default directory layout, generated with the qwrap/unwrap combination.wcf3 So you can easily exclude it from other packages. My goal was to reverse the -ignore option, and make a '-platform FreeBSD-x86' option that would exclude anything except the _platform_FreeBSD-x86 directory. The _platform_ makes it really clear that it is a platform specific directory tree so that in the future it would just work when a _platform_MrCoffee-z80 shows up.wcf3 2005-10-24 I thought it might be nice for me to include a sample Makefile I use on *nix that handles multiple platform wrapping. The starkit will include all platforms, while the starpacks will only have the platform it is wrapped for.
BASENAME = myApp all: ${BASENAME}.kit ${BASENAME}.exe ${BASENAME}.linux64 ${BASENAME}.freebsd5 NOLINUX = -ignore _platform_Linux-x86 NOSUNOS = -ignore _platform_SunOS-x86 -ignore _platform_SunOS-sparc NODARWIN = -ignore _platform_Darwin-ppc NOFREEBSD = -ignore _platform_FreeBSD-x86 NOWINDOWS = -ignore _platform_Windows-x86 ${BASENAME}.kit: tclkit sdx.kit wrap $@ ${BASENAME}.linux: tclkit sdx.kit wrap $@ -runtime runtimes/tclkit-linux-x86 ${NOSUNOS} ${NODARWIN} ${NOFREEBSD} ${NOWINDOWS} ${BASENAME}.linux64: tclkit sdx.kit wrap $@ -runtime runtimes/tclkit-linux-x86_64 ${NOSUNOS} ${NODARWIN} ${NOFREEBSD} ${NOWINDOWS} ${BASENAME}.freebsd4: tclkit sdx.kit wrap $@ -runtime runtimes/tclkit-freebsd4-x86 ${NOLINUX} ${NOSUNOS} ${NODARWIN} ${NOWINDOWS} ${BASENAME}.freebsd5: tclkit sdx.kit wrap $@ -runtime runtimes/tclkit-freebsd5-x86 ${NOLINUX} ${NOSUNOS} ${NODARWIN} ${NOWINDOWS} ${BASENAME}.exe: tclkit sdx.kit wrap $@ -runtime runtimes/tclkit-win32.exe ${NOLINUX} ${NOSUNOS} ${NODARWIN} ${NOFREEBSD}
JMN 2005-10-25 I think the idea of standard pathnames for binaries for these systems is great, but It'd be nice to keep it a little separate from the auto_path extension bit. i.e How about a function that just returns appropriate paths - so that it's more useful for using other package-loading systems such as Tcl 8.5+ module system?wcf3 2005-10-25 That would be really nice (as this is a bit messy/ugly), but this just works with the existing tools, code base, and runtimes. I needed something now and this allows me to simply drag and drop any existing extension into a directory within the .vfs and have it work without having to edit any source. This is of real importance when you start to maintain a large set of libraries over time; I know, because I tried. Upgrading a set of libraries that support four platforms and require mods to the loading mechanism was a real pain and took a great deal of time.That said; I'm all for a better way, especially if you can host the libraries on a server and have them pulled to a local cache as needed or updated. I've played with this a little, but am not yet happy my implementation.
See also auto_path, starkit,