]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Add --metadatadir option to specify path for GIR metadata
authorLuca Bruno <lucabru@src.gnome.org>
Mon, 8 Nov 2010 12:16:35 +0000 (13:16 +0100)
committerLuca Bruno <lucabru@src.gnome.org>
Mon, 4 Apr 2011 13:14:40 +0000 (15:14 +0200)
compiler/valacompiler.vala
vala/valacodecontext.vala
vala/valagirparser.vala
vapigen/valavapigen.vala

index e268bb6901ccefabf9011d04b61108d19f027805..eab72c4a4ecb15039da83e1e0d7b378f18d7707d 100644 (file)
@@ -33,6 +33,8 @@ class Vala.Compiler {
        static string[] vapi_directories;
        [CCode (array_length = false, array_null_terminated = true)]
        static string[] gir_directories;
+       [CCode (array_length = false, array_null_terminated = true)]
+       static string[] metadata_directories;
        static string vapi_filename;
        static string library;
        static string gir;
@@ -84,8 +86,9 @@ 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..." },
+               { "girdir", 0, 0, OptionArg.FILENAME_ARRAY, ref gir_directories, "Look for .gir files in DIRECTORY", "DIRECTORY..." },
+               { "metadatadir", 0, 0, OptionArg.FILENAME_ARRAY, ref metadata_directories, "Look for GIR .metadata files 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" },
                { "library", 0, 0, OptionArg.STRING, ref library, "Library name", "NAME" },
@@ -196,6 +199,7 @@ class Vala.Compiler {
                }
                context.vapi_directories = vapi_directories;
                context.gir_directories = gir_directories;
+               context.metadata_directories = metadata_directories;
                context.debug = debug;
                context.thread = thread;
                context.mem_profiler = mem_profiler;
index da6df1ff97625aad10d1f7cb4e9ee4e0f7116718..47681ff3063fed4aa4c4d0e2b8ae027a01a89f23 100644 (file)
@@ -108,6 +108,11 @@ public class Vala.CodeContext {
         */
        public string[] gir_directories;
 
+       /**
+        * List of directories where to find .metadata files for .gir files.
+        */
+       public string[] metadata_directories;
+
        /**
         * Produce debug information.
         */
@@ -493,7 +498,29 @@ public class Vala.CodeContext {
                return get_file_path (gir + ".gir", "gir-1.0", null, gir_directories);
        }
 
-       string? get_file_path (string basename, string versioned_data_dir, string? data_dir, string[] directories) {
+       /*
+        * Returns the .metadata file associated with the given .gir file.
+        */
+       public string? get_metadata_path (string gir_filename) {
+               var basename = Path.get_basename (gir_filename);
+               var metadata_basename = "%s.metadata".printf (basename.substring (0, basename.length - ".gir".length));
+
+               // look into metadata directories
+               var metadata_filename = get_file_path (metadata_basename, null, null, metadata_directories);
+               if (metadata_filename != null) {
+                       return metadata_filename;
+               }
+
+               // look into the same directory of .gir
+               metadata_filename = Path.build_filename (Path.get_dirname (gir_filename), metadata_basename);
+               if (FileUtils.test (metadata_filename, FileTest.EXISTS)) {
+                       return metadata_filename;
+               }
+
+               return null;
+       }
+
+       string? get_file_path (string basename, string? versioned_data_dir, string? data_dir, string[] directories) {
                string filename = null;
 
                if (directories != null) {
@@ -505,10 +532,12 @@ public class Vala.CodeContext {
                        }
                }
 
-               foreach (string dir in Environment.get_system_data_dirs ()) {
-                       filename = Path.build_filename (dir, versioned_data_dir, basename);
-                       if (FileUtils.test (filename, FileTest.EXISTS)) {
-                               return filename;
+               if (versioned_data_dir != null) {
+                       foreach (string dir in Environment.get_system_data_dirs ()) {
+                               filename = Path.build_filename (dir, versioned_data_dir, basename);
+                               if (FileUtils.test (filename, FileTest.EXISTS)) {
+                                       return filename;
+                               }
                        }
                }
 
index 53fd2e40bdad15dcd9e71ab15ff0a54766d269e2..b65170f517b0acf57a60f1812e6aa89fb7a52b97 100644 (file)
@@ -574,9 +574,9 @@ public class Vala.GirParser : CodeVisitor {
                metadata = Metadata.empty;
                girdata_stack = new ArrayList<HashMap<string,string>> ();
 
-               // load metadata
-               string metadata_filename = "%s.metadata".printf (source_file.filename.substring (0, source_file.filename.length - ".gir".length));
-               if (FileUtils.test (metadata_filename, FileTest.EXISTS)) {
+               // load metadata, first look into metadata directories then in the same directory of the .gir.
+               string? metadata_filename = context.get_metadata_path (source_file.filename);
+               if (metadata_filename != null && FileUtils.test (metadata_filename, FileTest.EXISTS)) {
                        var metadata_parser = new MetadataParser ();
                        var metadata_file = new SourceFile (context, source_file.file_type, metadata_filename);
                        context.add_source_file (metadata_file);
index 5345b63b359a4d468f876917c1b3770b3c63255c..573a3a7261ee2f8b4b7a442e395d09a85153c9b3 100644 (file)
@@ -33,6 +33,8 @@ class Vala.VAPIGen : Object {
        static string[] vapi_directories;
        [CCode (array_length = false, array_null_terminated = true)]
        static string[] gir_directories;
+       [CCode (array_length = false, array_null_terminated = true)]
+       static string[] metadata_directories;
        static string library;
        [CCode (array_length = false, array_null_terminated = true)]
        static string[] packages;
@@ -41,6 +43,7 @@ class Vala.VAPIGen : Object {
        const OptionEntry[] options = {
                { "vapidir", 0, 0, OptionArg.FILENAME_ARRAY, ref vapi_directories, "Look for package bindings in DIRECTORY", "DIRECTORY..." },
                { "girdir", 0, 0, OptionArg.FILENAME_ARRAY, ref gir_directories, "Look for GIR bindings in DIRECTORY", "DIRECTORY..." },
+               { "metadatadir", 0, 0, OptionArg.FILENAME_ARRAY, ref metadata_directories, "Look for GIR .metadata files in DIRECTORY", "DIRECTORY..." },
                { "pkg", 0, 0, OptionArg.STRING_ARRAY, ref packages, "Include binding for PACKAGE", "PACKAGE..." },
                { "library", 0, 0, OptionArg.STRING, ref library, "Library name", "NAME" },
                { "directory", 'd', 0, OptionArg.FILENAME, ref directory, "Output directory", "DIRECTORY" },
@@ -70,6 +73,7 @@ class Vala.VAPIGen : Object {
                context.profile = Profile.GOBJECT;
                context.vapi_directories = vapi_directories;
                context.gir_directories = gir_directories;
+               context.metadata_directories = metadata_directories;
                context.report.enable_warnings = !disable_warnings;
                context.report.set_verbose_errors (!quiet_mode);
                CodeContext.push (context);