: # NAME: # os.sh - operating system specifics # # DESCRIPTION: # This file is included at the start of processing. Its role is # to set the variables OS, OSREL, OSMAJOR, MACHINE and MACHINE_ARCH to # reflect the current system. # # It also sets variables such as MAILER, LOCAL_FS, PS_AXC to hide # certain aspects of different UNIX flavours. # # SEE ALSO: # site.sh,funcs.sh # # AUTHOR: # Simon J. Gerraty # RCSid: # $Id: os.sh,v 1.53 2017/01/11 20:01:09 sjg Exp $ # # @(#) Copyright (c) 1994 Simon J. Gerraty # # This file is provided in the hope that it will # be of use. There is absolutely NO WARRANTY. # Permission to copy, redistribute or otherwise # use this file is hereby granted provided that # the above copyright notice and this notice are # left intact. # # Please send copies of changes and bug-fixes to: # sjg@crufty.net # # this lets us skip sourcing it again setglobal _OS_SH = ':' setglobal OS = $[uname] setglobal OSREL = $[uname -r] setglobal OSMAJOR = $[setglobal IFS = '.'; set $OSREL; echo $1] setglobal MACHINE = $[uname -m] setglobal MACHINE_ARCH = $[uname -p 2>/dev/null || echo $MACHINE] # there is at least one case of `uname -p` outputting # a bunch of usless drivel match $MACHINE_ARCH { with unknown|*[!A-Za-z0-9_-]* setglobal MACHINE_ARCH = $MACHINE } # we need this here, and it is not always available... proc Which { match $1 { with -* setglobal t = $1; shift with * setglobal t = '-x' } match $1 { with /* test $t $1 && echo $1 with * # some shells cannot correctly handle `IFS` # in conjunction with the for loop. setglobal _dirs = $[setglobal IFS = ':'; echo $(2:-$PATH)] for d in [$_dirs] { test $t $d/$1 && do { echo $d/$1; break; } } } } # tr is insanely non-portable wrt char classes, so we need to # spell out the alphabet. sed y/// would work too. proc toUpper { $(TR:-tr) abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ } proc toLower { $(TR:-tr) ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz } setglobal K = '' match $OS { with AIX # everyone loves to be different... setglobal OSMAJOR = $[uname -v] setglobal OSREL = ""$OSMAJOR.$[uname -r]"" setglobal LOCAL_FS = 'jfs' setglobal PS_AXC = '-e' setglobal SHARE_ARCH = "$OS/$OSMAJOR.X" with SunOS setglobal CHOWN = $[Which chown /usr/etc:/usr/bin] export CHOWN # Great! Solaris keeps moving arch(1) # should just bite the bullet and use uname -p setglobal arch = $[Which arch /usr/bin:/usr/ucb] setglobal MAILER = '/usr/ucb/Mail' setglobal LOCAL_FS = '4.2' match $OSREL { with 4.0* # uname -m just says sun which could be anything # so use arch(1). setglobal MACHINE_ARCH = $[arch] setglobal MACHINE = $MACHINE_ARCH with 4* setglobal MACHINE_ARCH = $[arch] with 5* setglobal K = '-k' setglobal LOCAL_FS = 'ufs' setglobal MAILER = 'mailx' setglobal PS_AXC = '-e' # can you believe that ln on Solaris defaults to # overwriting an existing file!!!!! We want one that works! test -x /usr/xpg4/bin/ln && setglobal LN = $(LN:-/usr/xpg4/bin/ln) # wonderful, 5.8's tr again require's []'s # but /usr/xpg4/bin/tr causes problems if LC_COLLATE is set! # use toUpper/toLower instead. } match "$OS/$MACHINE_ARCH" { with *sun386 setglobal SHARE_ARCH = $MACHINE_ARCH } with *BSD setglobal K = '-k' setglobal MAILER = '/usr/bin/Mail' setglobal LOCAL_FS = 'local' : $Flags,$ENV match "$Flags,$ENV" { with *i*,* with *,|*ENVFILE* with * setglobal ENV = '' } # NetBSD at least has good backward compatibility # so NetBSD/i386 is good enough match $OS { with NetBSD setglobal HOST_ARCH = $MACHINE setglobal SHARE_ARCH = "$OS/$HOST_ARCH" with OpenBSD setglobal arch = $[Which arch /usr/bin:/usr/ucb:$PATH] setglobal MACHINE_ARCH = $[$arch -s] } setglobal NAWK = 'awk' export NAWK with HP-UX setglobal TMP_DIRS = '"/tmp /usr/tmp'" setglobal LOCAL_FS = 'hfs' setglobal MAILER = 'mailx' # don't rely on /bin/sh, its broken setglobal _shell = '/bin/ksh'; setglobal ENV = '' # also, no one would be interested in OSMAJOR=A match $OSREL { with ?.09* setglobal OSMAJOR = '9'; setglobal PS_AXC = '-e' with ?.10* setglobal OSMAJOR = '10'; setglobal PS_AXC = '-e' } with IRIX setglobal LOCAL_FS = 'efs' with Interix setglobal MACHINE = 'i386' setglobal MACHINE_ARCH = 'i386' with UnixWare setglobal OSREL = $[uname -v] setglobal OSMAJOR = $[setglobal IFS = '.'; set $OSREL; echo $1] setglobal MACHINE_ARCH = $[uname -m] with Linux # Not really any such thing as Linux, but # this covers red-hat and hopefully others. match $MACHINE { with i?86 setglobal MACHINE_ARCH = 'i386' # we don't care about i686 vs i586 } setglobal LOCAL_FS = 'ext2' setglobal PS_AXC = 'axc' test -x /usr/bin/md5sum && do { setglobal MD5 = '/usr/bin/md5sum'; export MD5; } with QNX match $MACHINE { with x86pc setglobal MACHINE_ARCH = 'i386' } with Haiku match $MACHINE { with BeBox setglobal MACHINE_ARCH = 'powerpc' with BeMac setglobal MACHINE_ARCH = 'powerpc' with BePC setglobal MACHINE_ARCH = 'i386' } } setglobal HOSTNAME = $(HOSTNAME:-`( hostname ) 2>/dev/null`) setglobal HOSTNAME = $(HOSTNAME:-`( uname -n ) 2>/dev/null`) match $HOSTNAME { with *.* setglobal HOST = $[setglobal IFS = '.'; set -- $HOSTNAME; echo $1] with * setglobal HOST = $HOSTNAME } setglobal TMP_DIRS = $(TMP_DIRS:-"/tmp /var/tmp") setglobal MACHINE_ARCH = $(MACHINE_ARCH:-$MACHINE) match $MACHINE_ARCH { with x86*64|amd64 setglobal MACHINE32_ARCH = 'i386' with *64 setglobal MACHINE32_ARCH = $[echo $MACHINE_ARCH | sed 's,64,32,] with * setglobal MACHINE32_ARCH = $MACHINE_ARCH } setglobal HOST_ARCH = $(HOST_ARCH:-$MACHINE_ARCH) setglobal HOST_ARCH32 = $(HOST_ARCH32:-$MACHINE32_ARCH) # we mount server:/share/arch/$SHARE_ARCH as /usr/local setglobal SHARE_ARCH_DEFAULT = "$OS/$OSMAJOR.X/$HOST_ARCH" setglobal SHARE_ARCH = $(SHARE_ARCH:-$SHARE_ARCH_DEFAULT) setglobal LN = $(LN:-ln) setglobal TR = $(TR:-tr) # Some people like have /share/$HOST_TARGET/bin etc. setglobal HOST_TARGET = $[echo $(OS)$(OSMAJOR)-$HOST_ARCH | tr -d / | toLower] setglobal HOST_TARGET32 = $[echo $(OS)$(OSMAJOR)-$HOST_ARCH32 | tr -d / | toLower] export HOST_TARGET HOST_TARGET32 match $[echo -n .] { with -n* setglobal N = ''; setglobal C = '"\c'" with * setglobal N = '-n'; setglobal C = '' } proc Echo { match $1 { with -n setglobal _n = $N, _c = $C; shift with * setglobal _n = '', _c = '' } echo $_n @ARGV $_c } export HOSTNAME HOST export OS MACHINE MACHINE_ARCH OSREL OSMAJOR LOCAL_FS TMP_DIRS MAILER N C K PS_AXC export LN SHARE_ARCH TR match /$0 { with */os.sh for v in [$ifsjoin(ARGV)] { eval vv='$'$v echo "$v='$vv'" } }