[vala/0.10-parallel: 33/46] valac: Output make-style dependency file



commit 3e4ded83880a113d9ecee86ae84d5bff6003c0e2
Author: Ryan Lortie <desrt desrt ca>
Date:   Wed Aug 25 16:10:30 2010 +0200

    valac: Output make-style dependency file
    
    Add a --deps= option to the compiler to write out a make-style
    dependency file.  The name of the target used is the name of the
    dependency file itself.
    
    This lets the dependency file serve as a stamp for the C file (which may
    or may not be touched depending if it was changed).  The dependency
    output is always touched.

 compiler/valacompiler.vala   |    6 ++++++
 vala/valacodecontext.vala    |   17 +++++++++++++++++
 vala/valasourcefile.vala     |    6 ++++++
 vala/valasymbol.vala         |   11 ++++++++++-
 vala/valasymbolresolver.vala |    2 ++
 5 files changed, 41 insertions(+), 1 deletions(-)
---
diff --git a/compiler/valacompiler.vala b/compiler/valacompiler.vala
index bedfb86..39a71bf 100644
--- a/compiler/valacompiler.vala
+++ b/compiler/valacompiler.vala
@@ -76,6 +76,7 @@ class Vala.Compiler {
 	static bool enable_version_header;
 	static bool disable_version_header;
 	static bool fatal_warnings;
+	static string dependencies;
 
 	static string entry_point;
 
@@ -101,6 +102,7 @@ class Vala.Compiler {
 		{ "internal-vapi", 0, 0, OptionArg.FILENAME, ref internal_vapi_filename, "Output vapi with internal api", "FILE" },
 		{ "fast-vapi", 0, 0, OptionArg.STRING, ref fast_vapi_filename, "Output vapi without performing symbol resolution", null },
 		{ "use-fast-vapi", 0, 0, OptionArg.STRING_ARRAY, ref fast_vapis, "Use --fast-vapi output during this compile", null },
+		{ "deps", 0, 0, OptionArg.STRING, ref dependencies, "Write make-style dependency information to this file", null },
 		{ "symbols", 0, 0, OptionArg.FILENAME, ref symbols_filename, "Output symbols file", "FILE" },
 		{ "compile", 'c', 0, OptionArg.NONE, ref compile_only, "Compile but do not link", null },
 		{ "output", 'o', 0, OptionArg.FILENAME, ref output, "Place output in file FILE", "FILE" },
@@ -545,6 +547,10 @@ class Vala.Compiler {
 			internal_vapi_filename = null;
 		}
 
+		if (dependencies != null) {
+			context.write_dependencies (dependencies);
+		}
+
 		if (!ccode_only) {
 			var ccompiler = new CCodeCompiler ();
 			if (cc_command == null && Environment.get_variable ("CC") != null) {
diff --git a/vala/valacodecontext.vala b/vala/valacodecontext.vala
index 476142c..38e01e3 100644
--- a/vala/valacodecontext.vala
+++ b/vala/valacodecontext.vala
@@ -362,4 +362,21 @@ public class Vala.CodeContext {
 
 		return null;
 	}
+
+	public void write_dependencies (string filename) {
+		var stream = FileStream.open (filename, "w");
+
+		if (stream == null) {
+			Report.error (null, "unable to open `%s' for writing".printf (filename));
+			return;
+		}
+
+		stream.printf ("%s:", filename);
+		foreach (var src in source_files) {
+			if (src.file_type == SourceFileType.FAST && src.used) {
+				stream.printf (" %s", src.filename);
+			}
+		}
+		stream.printf ("\n\n");
+	}
 }
diff --git a/vala/valasourcefile.vala b/vala/valasourcefile.vala
index 15c3a6b..28397cf 100644
--- a/vala/valasourcefile.vala
+++ b/vala/valasourcefile.vala
@@ -67,6 +67,12 @@ public class Vala.SourceFile {
 		}
 	}
 
+	/**
+	 * If the file has been used (ie: if anything in the file has
+	 * been found by symbol resolution).
+	 */
+	public bool used { get; set; }
+
 	private ArrayList<Comment> comments = new ArrayList<Comment> ();
 
 	public List<UsingDirective> current_using_directives { get; set; default = new ArrayList<UsingDirective> (); }
diff --git a/vala/valasymbol.vala b/vala/valasymbol.vala
index e6e0137..ad70f35 100644
--- a/vala/valasymbol.vala
+++ b/vala/valasymbol.vala
@@ -85,7 +85,16 @@ public abstract class Vala.Symbol : CodeNode {
 	/**
 	 * Specifies whether this symbol has been accessed.
 	 */
-	public bool used { get; set; }
+	public bool used {
+		get { return _used; }
+		set {
+			_used = value;
+			if (_used && source_reference != null) {
+				source_reference.file.used = true;
+			 }
+		}
+	}
+	bool _used;
 
 	/**
 	 * Specifies the accessibility of this symbol. Public accessibility
diff --git a/vala/valasymbolresolver.vala b/vala/valasymbolresolver.vala
index 026d6ea..ef61c36 100644
--- a/vala/valasymbolresolver.vala
+++ b/vala/valasymbolresolver.vala
@@ -271,6 +271,7 @@ public class Vala.SymbolResolver : CodeVisitor {
 				Report.error (unresolved_symbol.inner.source_reference, "The symbol `%s' could not be found".printf (unresolved_symbol.inner.name));
 				return null;
 			}
+			parent_symbol.used = true;
 
 			return parent_symbol.scope.lookup (unresolved_symbol.name);
 		}
@@ -354,6 +355,7 @@ public class Vala.SymbolResolver : CodeVisitor {
 
 		type.source_reference = unresolved_type.source_reference;
 		type.value_owned = unresolved_type.value_owned;
+		sym.used = true;
 
 		if (type is GenericType) {
 			// type parameters are always considered nullable



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]