[vala] Allow use of .gir directly from valac
- From: Ryan Lortie <ryanl src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] Allow use of .gir directly from valac
- Date: Sun, 18 Oct 2009 16:12:29 +0000 (UTC)
commit 6f628ff5668fb8b819460ab0def4a06ec8d32434
Author: Ryan Lortie <desrt desrt ca>
Date: Sat Oct 17 18:46:15 2009 -0400
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.
compiler/valacompiler.vala | 31 ++++++++++++++++++++++++--
vala/Makefile.am | 2 +
vala/valacodecontext.vala | 36 ++++++++++++++++++++----------
{vapigen => vala}/valagirparser.vala | 23 +++++++++++++++++--
{vapigen => vala}/valamarkupreader.vala | 0
vapigen/Makefile.am | 2 -
vapigen/valavapigen.vala | 11 +++++++-
7 files changed, 83 insertions(+), 22 deletions(-)
---
diff --git a/compiler/valacompiler.vala b/compiler/valacompiler.vala
index b7e5350..4ce0744 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 3955061..685bab2 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 b079d9f..5f57323 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 49ad98f..7b06233 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<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;
+ }
}
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 ef42080..c71f508 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 e5e640b..d56a592 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) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]