Explorar el Código

Added option --link to Release.Build. This option reads LINKER and LINKEROPTIONS fields from build description and generates a tool file for the static linking command. Does not work with --build option.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6437 8c9fc860-2736-0410-a75d-ab315db34111
eth.tmartiel hace 9 años
padre
commit
921a0479f1
Se han modificado 1 ficheros con 53 adiciones y 11 borrados
  1. 53 11
      source/Release.Mod

+ 53 - 11
source/Release.Mod

@@ -49,7 +49,10 @@ MODULE Release; (** AUTHOR "staubesv"; PURPOSE "Release build tool"; *)
  * BuildDescription =	Header Import BuildSection Packages
  * BuildSection = 		BUILDS {Build} END
  * Build = 				buildName OPENSECTION {BuildParameter} CLOSESECTION
- * Build = 				INCLUDE '"' [buildprefix {" " buildprefix} ] '"' | COMPILER '"' compileCommand '"' | TARGET '"' target '"' |
+ * Build = 				INCLUDE '"' [buildprefix {" " buildprefix} ] '"' |
+ *						COMPILER '"' compileCommand '"' | COMPILEROPTIONS '"' compileOptions '"' |
+ *						LINKER '"' linkCommand '"' | LINKEROPTIONS '"' linkOptions '"' |
+ *						TARGET '"' target '"' |
  *						EXTENSION '"' objectFileExtension '"' | PATH '"' objectFilePath '"' |
  *						EXCLUDEPACKAGES '"' [ exludedPackage {" " excludedPackage} ] '"'
  *						DISABLED "TRUE" | "FALSE"
@@ -500,12 +503,13 @@ TYPE
 		prefixes : ARRAY MaxPrefixes OF Name;
 		excludedPackages : Strings.StringArray;
 		onlyPackages: Strings.StringArray;
-		compiler, compileOptions : ARRAY 128 OF CHAR;
+		compiler, compileOptions, linker, linkOptions : ARRAY 128 OF CHAR;
 		target : ARRAY 8 OF CHAR;
 		extension : ARRAY 8 OF CHAR;
 		symbolFileExtension : ARRAY 8 OF CHAR;
 		path : Files.FileName;
 		disabled : BOOLEAN;
+		link: BOOLEAN; (* link packages instead of compiling *)
 
 		(* Used for dependencies analysis *)
 		modules : POINTER TO ARRAY OF File;
@@ -581,8 +585,13 @@ TYPE
 		BEGIN
 			ASSERT(options # NIL);
 			IF (options # NIL) THEN
+				link := options.GetFlag("link");
 				IF options.GetString("compiler", compiler) THEN END;
-				IF options.GetString("options", compileOptions) THEN END;
+				IF link THEN
+					IF options.GetString("options", compileOptions) THEN END;
+				ELSE
+					IF options.GetString("options", linkOptions) THEN END;
+				END;
 				IF options.GetString("target", target) THEN END;
 				IF options.GetString("extension", extension) THEN END;
 				IF options.GetString("symbolFileExtension", symbolFileExtension) THEN END;
@@ -600,7 +609,7 @@ TYPE
 
 		(** List all source code files included in this build to a stream *)
 		PROCEDURE ToStream*(w : Streams.Writer; charactersPerLine : LONGINT);
-		VAR file : File; color : LONGINT; characterCount : LONGINT;
+		VAR file : File; color : LONGINT; characterCount : LONGINT; name: Files.FileName;
 		BEGIN
 			characterCount := 0;
 			file := files;
@@ -614,12 +623,17 @@ TYPE
 						END;
 						w(TextUtilities.TextWriter).SetFontColor(color);
 					END;
-					characterCount := characterCount + Strings.Length(file.name);
+					IF link THEN
+						COPY(file.module.name, name)
+					ELSE
+						COPY(file.name, name)
+					END;
+					characterCount := characterCount + Strings.Length(name);
 					IF (characterCount > charactersPerLine) THEN
 						characterCount := 0;
 						w.Ln;
 					END;
-					w.String(file.name); w.String(" ");
+					w.String(name); w.String(" ");
 				END;
 				file := file.next;
 			END;
@@ -651,8 +665,14 @@ TYPE
 			tw.String("SystemTools.DoCommands"); tw.Ln;
 			tw.SetFontStyle({});
 			tw.String("SystemTools.Timer start ~"); tw.Ln;
-			tw.String(compiler);
-			tw.String(" "); GetCompilerOptions(temp); tw.String(temp); tw.Ln;
+			IF link THEN
+				tw.String(linker);
+				GetLinkerOptions(temp);
+			ELSE
+				tw.String(compiler);
+				GetCompilerOptions(temp);
+			END;
+			tw.String(" "); tw.String(temp); tw.Ln;
 			ToStream(tw, 80); (* file list *) tw.Ln; tw.String("~"); tw.Ln;
 			tw.String("SystemTools.Show Time elapsed: ~ SystemTools.Ln ~"); tw.Ln;
 			tw.String("SystemTools.Timer elapsed ~ SystemTools.Ln ~"); tw.Ln;
@@ -1208,6 +1228,11 @@ TYPE
 			END;
 		END GetCompilerOptions;
 
+		PROCEDURE GetLinkerOptions(VAR options: ARRAY OF CHAR);
+		BEGIN
+			COPY(linkOptions, options);
+		END GetLinkerOptions;
+
 		(* Count the number of source codes files in a specific build *)
 		PROCEDURE GetNofSources(VAR nofMarked : LONGINT) : LONGINT;
 		VAR file : File; nofSources : LONGINT;
@@ -1380,7 +1405,6 @@ TYPE
 				out.Ln; out.Update;
 			END;
 		END Compile;
-
 	END BuildObj;
 
 TYPE
@@ -1743,6 +1767,8 @@ CONST
 	tIMPORT = "IMPORT";
 	COMPILER = "COMPILER";
 	COMPILEOPTIONS = "COMPILEOPTIONS";
+	LINKER = "LINKER";
+	LINKEROPTIONS = "LINKEROPTIONS";
 	TARGET = "TARGET";
 	EXTENSION="EXTENSION";
 	SYMBOLEXTENSION="SYMBOLEXTENSION";
@@ -2085,7 +2111,7 @@ TYPE
 		VAR
 			token : Token; prefix : LONGINT;
 			string : ARRAY 256 OF CHAR; stringArray : Strings.StringArray;
-			compilerSet, compileOptionsSet, targetSet, includeSet, excludePackagesSet, extensionSet, symbolsSet, pathSet, disabledSet  : BOOLEAN;
+			compilerSet, compileOptionsSet, linkerSet, linkOptionsSet, targetSet, includeSet, excludePackagesSet, extensionSet, symbolsSet, pathSet, disabledSet  : BOOLEAN;
 			build : BuildObj;
 
 			PROCEDURE CheckOptions;
@@ -2102,7 +2128,7 @@ TYPE
 
 		BEGIN
 			NEW(build);
-			compilerSet := FALSE; compileOptionsSet := FALSE; targetSet := FALSE; includeSet := FALSE;
+			compilerSet := FALSE; compileOptionsSet := FALSE; linkerSet := FALSE; linkOptionsSet := FALSE; targetSet := FALSE; includeSet := FALSE;
 			extensionSet := FALSE; symbolsSet := FALSE; pathSet := FALSE; excludePackagesSet := FALSE; disabledSet := FALSE;
 			IF scanner.GetIdentifier(build.name) THEN
 				build.position := scanner.pos;
@@ -2122,6 +2148,16 @@ TYPE
 								IF ~scanner.GetIdentifier(build.compileOptions) THEN
 									(* continue *)
 								END;
+							ELSIF (token = LINKER) THEN
+								IF linkerSet THEN Error(scanner.pos, '# already set in build #', LINKER, build.name); ELSE linkerSet := TRUE; END;
+								IF ~scanner.GetIdentifier(build.linker) THEN
+									(* continue *)
+								END;
+							ELSIF (token = LINKEROPTIONS) THEN
+								IF linkOptionsSet THEN Error(scanner.pos, '# already set in build #', LINKEROPTIONS, build.name); ELSE linkOptionsSet := TRUE; END;
+								IF ~scanner.GetIdentifier(build.linkOptions) THEN
+									(* continue *)
+								END;
 							ELSIF (token = TARGET) THEN
 								IF targetSet THEN Error(scanner.pos, "# already set in build #", TARGET, build.name); ELSE targetSet := TRUE; END;
 								IF ~scanner.GetIdentifier(build.target) THEN
@@ -3158,6 +3194,7 @@ BEGIN
 	options.Add(0X, "only", Options.String);
 	options.Add("e", "extension", Options.String);
 	options.Add("f", "file", Options.String);
+	options.Add("l", "link", Options.Flag);
 	options.Add("n", "nocheck", Options.Flag);
 	options.Add("o", "options", Options.String);
 	options.Add("p", "path", Options.String);
@@ -3208,6 +3245,11 @@ BEGIN
 						IF (res = 0) THEN
 							context.out.String("done."); context.out.Ln; context.out.Update;
 							IF options.GetFlag("build") THEN
+								IF options.GetFlag("link") THEN
+									context.error.String("Incompatible options: link cannot automatically build");
+									context.error.Ln; context.error.Update;
+									RETURN;
+								END;
 								build.Compile(nofWorkers, context.out, context.error, options.GetFlag("verbose"), diagnostics, error);
 							ELSIF ~options.GetFlag("zip") THEN
 								CallCommand("Notepad.Open", fullname, context);