From: Ryan Lortie Date: Sat, 17 Oct 2009 22:46:15 +0000 (-0400) Subject: Allow use of .gir directly from valac X-Git-Tag: 0.7.8~36 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6f628ff5668fb8b819460ab0def4a06ec8d32434;p=thirdparty%2Fvala.git Allow use of .gir directly from valac - add a --girdir parameter to the compiler - make --pkg fall back to searching for a .gir file if it can't find a .vapi file also: - change the search order for .vapi files: XDG dirs are searched before the compiled-in (--prefix) data directory, now. Fixes bug 598817. --- diff --git a/compiler/valacompiler.vala b/compiler/valacompiler.vala index b7e53505d..4ce0744f9 100644 --- a/compiler/valacompiler.vala +++ b/compiler/valacompiler.vala @@ -33,6 +33,9 @@ class Vala.Compiler { [CCode (array_length = false, array_null_terminated = true)] [NoArrayLength] static string[] vapi_directories; + [CCode (array_length = false, array_null_terminated = true)] + [NoArrayLength] + static string[] gir_directories; static string vapi_filename; static string library; static string gir; @@ -76,6 +79,7 @@ class Vala.Compiler { private CodeContext context; const OptionEntry[] options = { + { "girdir", 0, 0, OptionArg.FILENAME_ARRAY, ref gir_directories, "Look for .gir files in DIRECTORY", "DIRECTORY..." }, { "vapidir", 0, 0, OptionArg.FILENAME_ARRAY, ref vapi_directories, "Look for package bindings in DIRECTORY", "DIRECTORY..." }, { "pkg", 0, 0, OptionArg.STRING_ARRAY, ref packages, "Include binding for PACKAGE", "PACKAGE..." }, { "vapi", 0, 0, OptionArg.FILENAME, ref vapi_filename, "Output VAPI file name", "FILE" }, @@ -131,6 +135,18 @@ class Vala.Compiler { return 1; } } + + private bool add_gir (CodeContext context, string gir) { + var gir_path = context.get_gir_path (gir, gir_directories); + + if (gir_path == null) { + return false; + } + + context.add_source_file (new SourceFile (context, gir_path, true)); + + return true; + } private bool add_package (CodeContext context, string pkg) { if (context.has_package (pkg)) { @@ -265,8 +281,8 @@ class Vala.Compiler { if (packages != null) { foreach (string package in packages) { - if (!add_package (context, package)) { - Report.error (null, "%s not found in specified Vala API directories".printf (package)); + if (!add_package (context, package) && !add_gir (context, package)) { + Report.error (null, "%s not found in specified Vala API directories or GObject-Introspection GIR directories".printf (package)); } } packages = null; @@ -295,7 +311,7 @@ class Vala.Compiler { } context.add_source_file (source_file); - } else if (source.has_suffix (".vapi")) { + } else if (source.has_suffix (".vapi") || source.has_suffix (".gir")) { context.add_source_file (new SourceFile (context, rpath, true)); } else if (source.has_suffix (".c")) { context.add_c_source_file (rpath); @@ -318,6 +334,15 @@ class Vala.Compiler { var genie_parser = new Genie.Parser (); genie_parser.parse (context); + var gir_parser = new GirParser (); + gir_parser.parse (context); + + if (gir_parser.get_package_names != null) { + foreach (var pkg in gir_parser.get_package_names ()) { + context.add_package (pkg); + } + } + if (context.report.get_errors () > 0) { return quit (); } diff --git a/vala/Makefile.am b/vala/Makefile.am index 39550615e..685bab29a 100644 --- a/vala/Makefile.am +++ b/vala/Makefile.am @@ -74,6 +74,7 @@ libvalacore_la_VALASOURCES = \ valaforeachstatement.vala \ valaformalparameter.vala \ valaforstatement.vala \ + valagirparser.vala \ valagenerictype.vala \ valagenieparser.vala \ valageniescanner.vala \ @@ -91,6 +92,7 @@ libvalacore_la_VALASOURCES = \ valalockable.vala \ valalockstatement.vala \ valaloop.vala \ + valamarkupreader.vala \ valamember.vala \ valamemberaccess.vala \ valamemberinitializer.vala \ diff --git a/vala/valacodecontext.vala b/vala/valacodecontext.vala index b079d9fec..5f573231c 100644 --- a/vala/valacodecontext.vala +++ b/vala/valacodecontext.vala @@ -298,26 +298,38 @@ public class Vala.CodeContext { return (define in defines); } - public string? get_package_path (string pkg, string[] vapi_directories) { - string basename = "%s.vapi".printf (pkg); + public string? get_package_path (string pkg, string[] directories) { + var path = get_file_path (pkg + ".vapi", "vala/vapi", directories); + + if (path == null) { + /* last chance: try the package compiled-in vapi dir */ + var filename = Path.build_filename (Config.PACKAGE_DATADIR, "vapi", pkg + ".vapi"); + if (FileUtils.test (filename, FileTest.EXISTS)) { + path = filename; + } + } + + return path; + } + + public string? get_gir_path (string gir, string[] directories) { + return get_file_path (gir + ".gir", "gir-1.0", directories); + } + + string? get_file_path (string basename, string data_dir, string[] directories) { string filename = null; - if (vapi_directories != null) { - foreach (string vapidir in vapi_directories) { - filename = Path.build_filename (vapidir, basename); + if (directories != null) { + foreach (string dir in directories) { + filename = Path.build_filename (dir, basename); if (FileUtils.test (filename, FileTest.EXISTS)) { return filename; } } } - filename = Path.build_filename (Config.PACKAGE_DATADIR, "vapi", basename); - if (FileUtils.test (filename, FileTest.EXISTS)) { - return filename; - } - - foreach (string vapidir in Environment.get_system_data_dirs ()) { - filename = Path.build_filename (vapidir, "vala/vapi", basename); + foreach (string dir in Environment.get_system_data_dirs ()) { + filename = Path.build_filename (dir, data_dir, basename); if (FileUtils.test (filename, FileTest.EXISTS)) { return filename; } diff --git a/vapigen/valagirparser.vala b/vala/valagirparser.vala similarity index 98% rename from vapigen/valagirparser.vala rename to vala/valagirparser.vala index 49ad98f85..7b0623375 100644 --- a/vapigen/valagirparser.vala +++ b/vala/valagirparser.vala @@ -26,8 +26,6 @@ using GLib; * Code visitor parsing all Vala source files. */ public class Vala.GirParser : CodeVisitor { - public string package_name { get; private set; } - MarkupReader reader; CodeContext context; @@ -39,6 +37,7 @@ public class Vala.GirParser : CodeVisitor { MarkupTokenType current_token; string[] cheader_filenames; + string[] package_names; HashMap attributes_map = new HashMap (str_hash, str_equal); @@ -160,7 +159,7 @@ public class Vala.GirParser : CodeVisitor { void parse_package () { start_element ("package"); - package_name = reader.get_attribute ("name"); + add_package_name (reader.get_attribute ("name")); next (); end_element ("package"); } @@ -1125,5 +1124,23 @@ public class Vala.GirParser : CodeVisitor { Report.error (null, "Metadata file `%s' not found".printf (metadata_filename)); } } + + void add_package_name (string name) { + if (package_names == null) { + package_names = new string[0]; + } + + foreach (var existing in package_names) { + if (name == existing) { + return; + } + } + + package_names += name; + } + + public string[]? get_package_names () { + return package_names; + } } diff --git a/vapigen/valamarkupreader.vala b/vala/valamarkupreader.vala similarity index 100% rename from vapigen/valamarkupreader.vala rename to vala/valamarkupreader.vala diff --git a/vapigen/Makefile.am b/vapigen/Makefile.am index ef42080e8..c71f5082b 100644 --- a/vapigen/Makefile.am +++ b/vapigen/Makefile.am @@ -23,8 +23,6 @@ BUILT_SOURCES = vapigen.vala.stamp vapicheck.vala.stamp vapigen_VALASOURCES = \ valagidlparser.vala \ - valagirparser.vala \ - valamarkupreader.vala \ valavapigen.vala \ $(NULL) diff --git a/vapigen/valavapigen.vala b/vapigen/valavapigen.vala index e5e640b83..d56a59261 100644 --- a/vapigen/valavapigen.vala +++ b/vapigen/valavapigen.vala @@ -226,8 +226,15 @@ class Vala.VAPIGen : Object { return quit (); } - if (library == null && girparser.package_name != null) { - library = girparser.package_name; + if (library == null && girparser.get_package_names () != null) { + var names = girparser.get_package_names (); + + if (names.length != 1) { + Report.error (null, "multiple packages encountered and no library name given"); + return quit (); + } + + library = names[0]; } if (library != null) {