From d04c6367a927c536552ae595c92cc15347d3a65f Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Tue, 25 Feb 2020 17:24:25 +0300 Subject: [PATCH] cpmake: fix preprocessor selector handling --- src/generic/Dsw/Mod/MakeMain.cp | 183 ++++++++++---------------------- 1 file changed, 54 insertions(+), 129 deletions(-) diff --git a/src/generic/Dsw/Mod/MakeMain.cp b/src/generic/Dsw/Mod/MakeMain.cp index a5ba7c0..e024a3c 100644 --- a/src/generic/Dsw/Mod/MakeMain.cp +++ b/src/generic/Dsw/Mod/MakeMain.cp @@ -61,7 +61,6 @@ MODULE DswMakeMain; Module = POINTER TO RECORD name: DevCPT.Name; odc: Files.Name; - selectors: Selector; (* with head, list of selectors for this module *) depth: INTEGER; (* 0: leaf, MAX: root *) dir: DevCPM.Directory; mno: INTEGER; @@ -138,7 +137,7 @@ MODULE DswMakeMain; RETURN i END IdentLen; - PROCEDURE Define (n: ARRAY OF CHAR); + PROCEDURE Define (n: ARRAY OF CHAR; overwrite: BOOLEAN); VAR i: INTEGER; v: BOOLEAN; s: Selector; BEGIN i := IdentLen(n); @@ -151,40 +150,16 @@ MODULE DswMakeMain; IF s.next = NIL THEN NEW(s.next); Strings.StringToUtf8(n, s.next.name, i); - ASSERT(i = 0) - END; - s.next.value := v + ASSERT(i = 0); + s.next.value := v + ELSIF overwrite THEN + s.next.value := v + END ELSE Error(1, "", "", 0) END END Define; - PROCEDURE Undefine (IN n: ARRAY OF CHAR); - VAR i: INTEGER; s: Selector; - BEGIN - i := IdentLen(n); - IF (i # 0) & (n[i] = 0X) THEN - s := def; - WHILE (s.next # NIL) & (s.next.name$ # n$) DO s := s.next END; - IF s.next # NIL THEN s.next := s.next.next END - ELSE - Error(2, "", "", 0) - END - END Undefine; - - PROCEDURE CopySelectorList (base: Selector): Selector; - VAR s, t, x: Selector; - BEGIN - ASSERT(base # NIL, 20); - s := base; NEW(t); x := t; - WHILE s # NIL DO - x^ := s^; - IF s.next # NIL THEN NEW(x.next); x := x.next END; - s := s.next - END; - RETURN t - END CopySelectorList; - PROCEDURE AddModule (IN n: ARRAY OF CHAR; selectors: Selector; dir: DevCPM.Directory); VAR i, res: INTEGER; m: Module; BEGIN @@ -196,7 +171,6 @@ MODULE DswMakeMain; NEW(m); Strings.StringToUtf8(n, m.name, res); ASSERT(res = 0); - m.selectors := CopySelectorList(selectors); m.dir := dir; modList[i] := m; INC(mno) @@ -316,7 +290,6 @@ MODULE DswMakeMain; Log.String(" -o name Generate executable file"); Log.Ln; Log.String(" -j num Specifies the number of jobs to run simultaneously"); Log.Ln; Log.String(' -D ident["+"|"-"] Add preprocessor selector'); Log.Ln; - Log.String(' -U ident Remove preprocessor selector'); Log.Ln; Log.String(" -h Print help and quit"); Log.Ln; Log.String(" -V Print version and quit"); Log.Ln; Kernel.Quit(1) @@ -422,14 +395,13 @@ MODULE DswMakeMain; exe := NIL; auto := FALSE; jobs := 1; def.next := NIL; mno := 0; rno := 0; processor := anymach; os := anyos; compiler := anycp; LOOP - CASE DswOpts.GetOpt("ao:j:D:U:TCXIFhV") OF + CASE DswOpts.GetOpt("ao:j:D:TCXIFhV") OF | "a": auto := TRUE | "o": exe := DswOpts.str | "j": jobs := MIN(MAX(StrToInt(DswOpts.str, 1), 1), maxJobs) | "h": Help | "V": Version - | "D": Define(DswOpts.str) - | "U": Undefine(DswOpts.str) + | "D": Define(DswOpts.str, TRUE) | "T": ParseTargetOpts | "C": ParseCommandOpts | "X": ParseExternalOpts @@ -444,6 +416,16 @@ MODULE DswMakeMain; END ParseArgs; PROCEDURE CheckParams; + + PROCEDURE Default (IN name: ARRAY OF CHAR; value: BOOLEAN); + BEGIN + IF value = TRUE THEN + Define(name + "+", FALSE) + ELSE + Define(name + "-", FALSE) + END + END Default; + BEGIN IF compiler = anycp THEN Error(12, "", "", 0) @@ -482,7 +464,24 @@ MODULE DswMakeMain; IF cplExe = NIL THEN Error(26, "", "", 0) END - END + END; + (* cpompiler *) + Default("NATIVE", compiler = cpnative); + Default("CPFRONT", compiler = cpfront); + (* processor *) + Default("I486", processor = mach386); + Default("I386", processor = mach386); + Default("M68K", processor = mach68k); + (* operating system *) + Default("LINUX", os = linux); + Default("FREEBSD", os = freebsd); + Default("OPENBSD", os = openbsd); + Default("DARWIN", os = darwin); + Default("WIN32", os = win32); + Default("CYGWIN", os = cygwin); + Default("POSIX", os IN {linux, freebsd, openbsd, darwin, cygwin}); + (* linker *) + Default("DEV2", linker = dev2); END CheckParams; (* --------- loader --------- *) @@ -507,7 +506,7 @@ MODULE DswMakeMain; IF ~auto THEN Log.String("module " + name + " required before " + m.name); Log.Ln; INC(werr) END; - NEW(imp); imp.name := name$; imp.selectors := CopySelectorList(m.selectors); + NEW(imp); imp.name := name$; modList[mno] := imp; INC(mno) ELSE imp := modList[j] @@ -609,7 +608,7 @@ MODULE DswMakeMain; IF oberon IN m.opts THEN INCL(DevCPM.options, DevCPM.oberon) END; *) DevCPR.Init; - s := m.selectors.next; + s := def.next; WHILE s # NIL DO DevCPR.Set(s.name, s.value); s := s.next @@ -806,7 +805,7 @@ MODULE DswMakeMain; END PutPathList; PROCEDURE ExecuteCompiler (m: Module): DswProcs.Process; - VAR w: DswProcs.Process; ok: BOOLEAN; + VAR w: DswProcs.Process; ok: BOOLEAN; s: Selector; BEGIN ASSERT(m # NIL, 20); ASSERT(m.odc # "", 21); @@ -815,88 +814,15 @@ MODULE DswMakeMain; w.Program(cpcExe); w.PutParam("-legacy"); PutPathList(w, "-legacysymdir", m.dir); - PutParams(w, cpcArgs); - CASE compiler OF - | cpfront: - w.PutParam("-define+"); w.PutParam("CPFRONT"); - w.PutParam("-define-"); w.PutParam("NATIVE"); - | cpnative: - w.PutParam("-define-"); w.PutParam("CPFRONT"); - w.PutParam("-define+"); w.PutParam("NATIVE"); - END; - CASE processor OF - | mach386: - w.PutParam("-define+"); w.PutParam("I486"); - w.PutParam("-define-"); w.PutParam("M68K"); - | mach68k: - w.PutParam("-define+"); w.PutParam("I486"); - w.PutParam("-define-"); w.PutParam("M68K"); - ELSE - w.PutParam("-define-"); w.PutParam("I486"); - w.PutParam("-define-"); w.PutParam("M68K"); - END; - CASE os OF - | linux: - w.PutParam("-define+"); w.PutParam("POSIX"); - w.PutParam("-define+"); w.PutParam("LINUX"); - w.PutParam("-define-"); w.PutParam("FREEBSD"); - w.PutParam("-define-"); w.PutParam("OPENBSD"); - w.PutParam("-define-"); w.PutParam("WIN32"); - w.PutParam("-define-"); w.PutParam("DARWIN"); - | freebsd: - w.PutParam("-define+"); w.PutParam("POSIX"); - w.PutParam("-define-"); w.PutParam("LINUX"); - w.PutParam("-define+"); w.PutParam("FREEBSD"); - w.PutParam("-define-"); w.PutParam("OPENBSD"); - w.PutParam("-define-"); w.PutParam("WIN32"); - w.PutParam("-define-"); w.PutParam("CYGWIN"); - w.PutParam("-define-"); w.PutParam("DARWIN"); - | openbsd: - w.PutParam("-define+"); w.PutParam("POSIX"); - w.PutParam("-define-"); w.PutParam("LINUX"); - w.PutParam("-define-"); w.PutParam("FREEBSD"); - w.PutParam("-define+"); w.PutParam("OPENBSD"); - w.PutParam("-define-"); w.PutParam("WIN32"); - w.PutParam("-define-"); w.PutParam("CYGWIN"); - w.PutParam("-define-"); w.PutParam("DARWIN"); - | win32: - w.PutParam("-define-"); w.PutParam("POSIX"); - w.PutParam("-define-"); w.PutParam("LINUX"); - w.PutParam("-define-"); w.PutParam("FREEBSD"); - w.PutParam("-define-"); w.PutParam("OPENBSD"); - w.PutParam("-define+"); w.PutParam("WIN32"); - w.PutParam("-define-"); w.PutParam("CYGWIN"); - w.PutParam("-define-"); w.PutParam("DARWIN"); - | cygwin: - w.PutParam("-define+"); w.PutParam("POSIX"); - w.PutParam("-define-"); w.PutParam("LINUX"); - w.PutParam("-define-"); w.PutParam("FREEBSD"); - w.PutParam("-define-"); w.PutParam("OPENBSD"); - w.PutParam("-define+"); w.PutParam("WIN32"); - w.PutParam("-define+"); w.PutParam("CYGWIN"); - w.PutParam("-define-"); w.PutParam("DARWIN"); - | darwin: - w.PutParam("-define+"); w.PutParam("POSIX"); - w.PutParam("-define-"); w.PutParam("LINUX"); - w.PutParam("-define-"); w.PutParam("FREEBSD"); - w.PutParam("-define-"); w.PutParam("OPENBSD"); - w.PutParam("-define-"); w.PutParam("WIN32"); - w.PutParam("-define-"); w.PutParam("CYGWIN"); - w.PutParam("-define+"); w.PutParam("DARWIN"); - ELSE - w.PutParam("-define-"); w.PutParam("POSIX"); - w.PutParam("-define-"); w.PutParam("LINUX"); - w.PutParam("-define-"); w.PutParam("FREEBSD"); - w.PutParam("-define-"); w.PutParam("OPENBSD"); - w.PutParam("-define-"); w.PutParam("WIN32"); - w.PutParam("-define-"); w.PutParam("DARWIN"); - END; - CASE linker OF - | dev2: - w.PutParam("-define+"); w.PutParam("DEV2"); - ELSE - w.PutParam("-define-"); w.PutParam("DEV2"); + s := def.next; + WHILE s # NIL DO + IF s.value = TRUE THEN w.PutParam("-define+") + ELSE w.PutParam("-define-") + END; + w.PutParam(s.name$); + s := s.next END; + PutParams(w, cpcArgs); w.PutParam(m.odc); w.Execute(ok); IF ok THEN @@ -1049,16 +975,15 @@ MODULE DswMakeMain; ParseArgs; IF err = 0 THEN IF printCompileModList OR printLinkModList OR printCompileFileList THEN - auto := TRUE; + auto := TRUE + END; + CheckParams; + IF err = 0 THEN CheckDeps; IF err = 0 THEN - PrintInfo - END - ELSE - CheckParams; - IF err = 0 THEN - CheckDeps; - IF err = 0 THEN + IF printCompileModList OR printLinkModList OR printCompileFileList THEN + PrintInfo + ELSE Compile; IF err = 0 THEN Link -- 2.29.2