From 745b4851ca69f2108e43fb38e47b7da700854af3 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Mon, 7 Oct 2013 16:46:04 +0400 Subject: [PATCH] fixed issue with multiple modules compilation. now voc adds dependency modules object files to the main module compiling command line. for example, if MM0 imports MM1 then if we call voc like: voc -l MM1.Mod -s MM0.Mod -M the commandline will look like cc MM0.c MM1.o -static -o MM0 -fPIC -g -I /opt/voc-1.0/src/lib/system/gnuc/x86_64 -I /opt/voc-1.0/lib/voc/obj -lVishapOberon -L. -L/opt/voc-1.0/lib Former-commit-id: a3214b81549d7c1d4654c62af52514261ed08ed0 --- src/voc/OPC.Mod | 3 ++- src/voc/OPM.cmdln.Mod | 7 +++++++ src/voc/gnuc/extTools.Mod | 3 ++- src/voc/voc.Mod | 37 +++++++++++++++++++++---------------- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/voc/OPC.Mod b/src/voc/OPC.Mod index bac5ce80..be6f6df6 100644 --- a/src/voc/OPC.Mod +++ b/src/voc/OPC.Mod @@ -94,7 +94,8 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *) BEGIN indentLevel := 0; ptrinit := OPM.ptrinit IN OPM.opt; - mainprog := OPM.mainprog IN OPM.opt; + (*mainprog := OPM.mainprog IN OPM.opt;*) + mainprog := OPM.mainProg OR OPM.mainLinkStat; ansi := OPM.ansi IN OPM.opt; IF ansi THEN BodyNameExt := "__init(void)" ELSE BodyNameExt := "__init()" END END Init; diff --git a/src/voc/OPM.cmdln.Mod b/src/voc/OPM.cmdln.Mod index f625f2ba..4f01cf7e 100644 --- a/src/voc/OPM.cmdln.Mod +++ b/src/voc/OPM.cmdln.Mod @@ -234,6 +234,13 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *) IF lineno IN opt THEN useLineNo := TRUE; curpos := 256; errpos := curpos; lasterrpos := curpos - 10 ELSE useLineNo := FALSE; END; + + IF useparfile IN opt THEN useParFile := TRUE ELSE useParFile := FALSE END; (* this check must be made before calling getproperties, noch *) + IF dontasm IN opt THEN dontAsm := TRUE ELSE dontAsm := FALSE END; + IF dontlink IN opt THEN dontLink := TRUE ELSE dontLink := FALSE END; + IF mainprog IN opt THEN mainProg := TRUE ELSE mainProg := FALSE END; + IF mainlinkstat IN opt THEN INCL(glbopt, mainprog); mainLinkStat := TRUE ELSE mainLinkStat := FALSE END; + END InitOptions; PROCEDURE Init*(VAR done: BOOLEAN; VAR mname : ARRAY OF CHAR); (* get the source for one translation *) diff --git a/src/voc/gnuc/extTools.Mod b/src/voc/gnuc/extTools.Mod index eaa82085..b701bf70 100644 --- a/src/voc/gnuc/extTools.Mod +++ b/src/voc/gnuc/extTools.Mod @@ -27,7 +27,7 @@ Unix.system(cmd); END Assemble; -PROCEDURE LinkMain*(VAR m : ARRAY OF CHAR; statically : BOOLEAN); +PROCEDURE LinkMain*(VAR m : ARRAY OF CHAR; statically : BOOLEAN; additionalopts : ARRAY OF CHAR); VAR lpath : ARRAY 256 OF CHAR; cc : ARRAY 256 OF CHAR; ccopt : ARRAY 256 OF CHAR; @@ -45,6 +45,7 @@ COPY (cc, cmd); Strings.Append(" ", cmd); Strings.Append(m, cmd); Strings.Append(ext, cmd); +Strings.Append(additionalopts, cmd); IF statically THEN Strings.Append(" -static ", cmd) END; Strings.Append(" -o ", cmd); Strings.Append(m, cmd); diff --git a/src/voc/voc.Mod b/src/voc/voc.Mod index 05b971a3..572bb58f 100644 --- a/src/voc/voc.Mod +++ b/src/voc/voc.Mod @@ -4,7 +4,7 @@ MODULE voc; (* J. Templ 3.2.95 *) SYSTEM, Unix, Kernel, OPP, OPB, OPT, OPV, OPC, OPM, - extTools; + extTools, Strings := oocOakStrings; VAR mname : ARRAY 256 OF CHAR; (* noch *) @@ -62,26 +62,15 @@ VAR mname : ARRAY 256 OF CHAR; (* noch *) OPM.CloseFiles; OPT.Close; OPM.LogWLn; done := OPM.noerr; -(* noch *) - IF done THEN - IF ~OPM.dontAsm THEN - (*IF ~(OPM.mainProg OR OPM.mainLinkStat) THEN*) - extTools.Assemble(OPM.modName); - (*ELSE*) - IF ~OPM.dontLink & (OPM.mainProg OR OPM.mainLinkStat) THEN - extTools.LinkMain (OPM.modName, OPM.mainLinkStat); - END; - (*END;*) - END; - END - END Module; PROCEDURE Translate*; VAR done: BOOLEAN; + VAR modulesobj: ARRAY 2048 OF CHAR; (* here we hold all modules name given on the command line, to add corresponding .o files to the external compiler options *) BEGIN + modulesobj := ""; OPM.OpenPar; (* gclock(); slightly faste rtranslation but may lead to opening "too many files" *) OPT.bytetyp.size := OPM.ByteSize; OPT.sysptrtyp.size := OPM.PointerSize; @@ -99,8 +88,24 @@ VAR mname : ARRAY 256 OF CHAR; (* noch *) OPM.InitOptions; Kernel.GC(FALSE); Module(done); - IF ~done THEN Unix.Exit(1) END - END + IF ~done THEN Unix.Exit(1) END; + + (* noch *) + IF done THEN + IF ~OPM.dontAsm THEN + extTools.Assemble(OPM.modName); + IF ~(OPM.mainProg OR OPM.mainLinkStat) THEN Strings.Append(" ",modulesobj); Strings.Append(OPM.modName, modulesobj); Strings.Append(".o ", modulesobj) END; + + IF ~OPM.dontLink & (OPM.mainProg OR OPM.mainLinkStat) THEN + extTools.LinkMain (OPM.modName, OPM.mainLinkStat, modulesobj); + END; + END; + END + + + + + END (* loop *) END Translate; BEGIN