MODULE; IMPORT ASCII, Env, MxConfig, Pathname, Text, Process, Rd, Thread; IMPORT SMsg AS Msg, TextUtils, FSUtils, PathRepr, System; IMPORT CompactEnvName; MiniEnv
IMPORT IO;
PROCEDUREFindDir (READONLY guesses : ARRAY OF TEXT) : TEXT = BEGIN FOR i := 0 TO NUMBER(guesses) - 1 DO WITH guess = PathRepr.Native(guesses[i]) DO IF FSUtils.IsDir(guess) THEN RETURN guess; END; END; END; RETURN NIL; END FindDir; PROCEDUREUnameOutput (arg : TEXT) : TEXT = VAR rd : Rd.T; p : Process.T; res : TEXT; BEGIN TRY p := System.RdExecute("uname " & arg, rd); res := Rd.GetLine(rd); EVAL Process.Wait(p); EXCEPT System.ExecuteError => RETURN NIL; | Thread.Alerted => RETURN NIL; | Rd.EndOfFile => RETURN NIL; | Rd.Failure => RETURN NIL; END; RETURN res; END UnameOutput; VAR val : TEXT; compactRootGuesses := ARRAY [0..7] OF TEXT { "/usr/contrib/lib/compact", "/usr/local/lib/compact", "/usr/local/cm3/compact", "/lib/compact", "/opt/compact", "/opt/cm3/compact", "c:/compact", "d:/compact" }; tmpDirGuesses := ARRAY [0..7] OF TEXT { "/tmp", "/var/tmp", "/usr/tmp", "c:/tmp", "d:/tmp", "c:/temp", "d:/temp", "/" }; BEGIN isPosix := Text.Equal(MxConfig.HOST_OS_TYPE, "POSIX"); isWin32 := Text.Equal(MxConfig.HOST_OS_TYPE, "WIN32"); tmpdir := Env.Get("TMPDIR"); IF tmpdir = NIL THEN tmpdir := Env.Get("TMP"); IF tmpdir = NIL THEN tmpdir := FindDir(tmpDirGuesses); END; IF tmpdir = NIL THEN Msg.Fatal("cannot find any tmp directory"); END; END; tmpdir := PathRepr.Native(tmpdir); compactroot := Env.Get("COMPACTROOT"); IF compactroot = NIL THEN compactroot := FindDir(compactRootGuesses); IF compactroot = NIL THEN Msg.Warning("COMPACTROOT is undefined and has not been found at " & "any default location."); compactroot := tmpdir; Msg.Warning("COMPACTROOT set to " & compactroot); END; END; compactroot := PathRepr.Native(compactroot); home := Env.Get("HOME"); IF home = NIL THEN home := Env.Get("HOMEPATH"); IF home = NIL THEN home := Pathname.Join(compactroot, "home", NIL); IF NOT FSUtils.IsDir(home) THEN home := Pathname.Join(compactroot, "demo", NIL); home := Pathname.Join(home, "workspace", NIL); END; IF NOT FSUtils.IsDir(home) THEN home := compactroot; END; Msg.Warning("HOME undefined, set to " & home); ELSE IF Env.Get("HOMEDRIVE") # NIL THEN home := Env.Get("HOMEDRIVE") & home; END; END; END; home := PathRepr.Native(home); user := Env.Get("USER"); IF user = NIL THEN user := Env.Get("LOGNAME"); IF user = NIL THEN user := Env.Get("USERNAME"); IF user = NIL THEN user := ("nobody"); Msg.Warning("USER undefined, set to " & user); END; END; END; editor := Env.Get("VISUAL"); IF editor = NIL THEN editor := Env.Get("EDITOR"); IF editor = NIL THEN IF isPosix THEN editor := "xterm -e vi"; ELSIF isWin32 THEN editor := "notepad"; ELSE editor := "edit"; END; END; END; editorovr := Env.Get("COMPACTEDITOR"); IF editorovr = NIL THEN editorovr := Env.Get("COMPACT_EDITOR"); (* This may be used to override values in compactrc. *) END; httpdeditorovr := Env.Get("COMPACTHTTPDEDITOR"); IF httpdeditorovr = NIL THEN httpdeditorovr := Env.Get("COMPACT_HTTPD_EDITOR"); (* This may be used to override values in compactrc. *) END; val := Env.Get("HOSTTYPE"); IF val # NIL THEN tpc_hosttype := TextUtils.Lower(val); (* IO.Put("tpc_hosttype (1) " & tpc_hosttype & "\n"); *) ELSIF isPosix THEN tpc_hosttype := UnameOutput("-m"); (* IO.Put("tpc_hosttype (2) " & tpc_hosttype & "\n"); *) ELSIF isWin32 THEN (* On NT, we should have "Cpu" set to something like "i386". *) val := Env.Get("Cpu"); IF val # NIL THEN tpc_hosttype := TextUtils.Lower(val); ELSE (* FIXME: just an assumption *) tpc_hosttype := "i486"; END; END; IF tpc_hosttype = NIL THEN tpc_hosttype := "" END; tpc_hosttype := TextUtils.RemoveChars(tpc_hosttype, ASCII.Set{'-'}); (* IO.Put("tpc_hosttype (3) " & tpc_hosttype & "\n"); *) val := Env.Get("OSTYPE"); IF val # NIL THEN tpc_ostype := TextUtils.Lower(val); ELSIF isPosix THEN val := UnameOutput("-s"); IF val = NIL THEN val := Env.Get("TARGET"); IF val = NIL THEN val := Env.Get("CM3_TARGET"); ELSE val := "unknown"; END ELSE END; tpc_ostype := TextUtils.Lower(val); ELSIF isWin32 THEN (* On NT, we should have "OS" set to "Windows_NT", which ComPact calls "winnt". *) val := Env.Get("OS"); IF val # NIL THEN tpc_ostype := TextUtils.Lower(val); ELSE (* FIXME: just an assumption *) tpc_ostype := "nt"; END; END; tpc_ostype := TextUtils.RemoveChars(tpc_ostype, ASCII.Set{'-'}); val := Env.Get("TPC_VARIANT"); IF val # NIL THEN tpc_variant := TextUtils.Lower(val); ELSE IF isPosix THEN tpc_variant := ""; ELSIF isWin32 THEN (* FIXME: just an assumption *) IF TextUtils.Contains(tpc_ostype, "cygwin") THEN tpc_variant := "cygwin32"; ELSE tpc_variant := "win32"; END; END; END; tpc_variant := TextUtils.RemoveChars(tpc_variant, ASCII.Set{'-'}); val := Env.Get("TPC_COMPILER"); IF val # NIL THEN tpc_compiler := TextUtils.Lower(val); ELSE IF isPosix THEN tpc_compiler := "gcc"; ELSIF isWin32 THEN (* FIXME: just an assumption *) IF TextUtils.Contains(tpc_ostype, "cygwin") THEN tpc_compiler := "gcc"; ELSE tpc_compiler := "cl"; END; END; END; val := Env.Get("TPC_OPTIONS"); IF val # NIL THEN tpc_options := TextUtils.Lower(val); END; tpc_compiler := TextUtils.RemoveChars(tpc_compiler, ASCII.Set{'-'}); val := Env.Get(CompactEnvName.Passphrase); IF val # NIL THEN pass := val; END; END MiniEnv.