From: Ryan Lortie Date: Wed, 25 Aug 2010 14:10:30 +0000 (+0200) Subject: valac: Output make-style dependency file X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab10bb13f15922b8af3aa45b94d8a05e6851c297;p=thirdparty%2Fvala.git 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. --- diff --git a/compiler/valacompiler.vala b/compiler/valacompiler.vala index bedfb86fe..39a71bfbd 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 476142c17..38e01e32d 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 15c3a6b9c..28397cf4b 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 comments = new ArrayList (); public List current_using_directives { get; set; default = new ArrayList (); } diff --git a/vala/valasymbol.vala b/vala/valasymbol.vala index b63662456..9caaa2789 100644 --- a/vala/valasymbol.vala +++ b/vala/valasymbol.vala @@ -97,7 +97,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 026d6ea26..ef61c36aa 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