]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Allow use of .gir directly from valac
authorRyan Lortie <desrt@desrt.ca>
Sat, 17 Oct 2009 22:46:15 +0000 (18:46 -0400)
committerRyan Lortie <desrt@desrt.ca>
Sun, 18 Oct 2009 16:12:07 +0000 (12:12 -0400)
  - 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.

compiler/valacompiler.vala
vala/Makefile.am
vala/valacodecontext.vala
vala/valagirparser.vala [moved from vapigen/valagirparser.vala with 98% similarity]
vala/valamarkupreader.vala [moved from vapigen/valamarkupreader.vala with 100% similarity]
vapigen/Makefile.am
vapigen/valavapigen.vala

index b7e53505da4aa31c6413069e1810bd07544ee0b5..4ce0744f93becc8028d0c257bba50224510ee488 100644 (file)
@@ -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 ();
                }
index 39550615e6c271b8fb75b06a29ae5a8bdb2fc3d3..685bab29a86723880e0052f913667368e4af1f92 100644 (file)
@@ -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 \
index b079d9fecda7e96fe64de32b5537787c0e545f82..5f573231ca1fbb9f50ab97f68134e4df2237f88c 100644 (file)
@@ -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;
                        }
similarity index 98%
rename from vapigen/valagirparser.vala
rename to vala/valagirparser.vala
index 49ad98f85015e9f84afebc6986a90f0f818334ec..7b0623375643159b503ed4ba0d92284f69eb3183 100644 (file)
@@ -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<string,string> attributes_map = new HashMap<string,string> (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;
+       }
 }
 
index ef42080e8b1e37bd0c7b12f338bc0014b8809684..c71f5082b96213055dc13f34cf2b127a6e875dd8 100644 (file)
@@ -23,8 +23,6 @@ BUILT_SOURCES = vapigen.vala.stamp vapicheck.vala.stamp
 
 vapigen_VALASOURCES = \
        valagidlparser.vala \
-       valagirparser.vala \
-       valamarkupreader.vala \
        valavapigen.vala \
        $(NULL)
 
index e5e640b83cb1b29f81e998ddcdc23e4721786957..d56a59261858191adbc5173b8afb3692df973ff3 100644 (file)
@@ -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) {