diff --git a/srcpkgs/libpvala b/srcpkgs/libpvala new file mode 120000 index 0000000000..3bb3879ac9 --- /dev/null +++ b/srcpkgs/libpvala @@ -0,0 +1 @@ +pvala \ No newline at end of file diff --git a/srcpkgs/pvala-devel b/srcpkgs/pvala-devel new file mode 120000 index 0000000000..3bb3879ac9 --- /dev/null +++ b/srcpkgs/pvala-devel @@ -0,0 +1 @@ +pvala \ No newline at end of file diff --git a/srcpkgs/pvala/files/valac-profile-plugins.patch b/srcpkgs/pvala/files/valac-profile-plugins.patch new file mode 100644 index 0000000000..bc98d4c6c1 --- /dev/null +++ b/srcpkgs/pvala/files/valac-profile-plugins.patch @@ -0,0 +1,332 @@ +diff --git a/compiler/Makefile.am b/compiler/Makefile.am +index d6e7f81..fc25be4 100644 +--- a/compiler/Makefile.am ++++ b/compiler/Makefile.am +@@ -7,7 +7,9 @@ AM_CPPFLAGS = \ + -I$(top_srcdir)/vala \ + -I$(top_srcdir)/codegen \ + $(GLIB_CFLAGS) \ ++ $(GMODULE_CFLAGS) \ + -DPACKAGE_DATADIR=\"$(pkgdatadir)\" \ ++ -DPACKAGE_LIBEXECDIR=\"$(pkglibexecdir)\" \ + $(NULL) + + BUILT_SOURCES = valac.vala.stamp +@@ -26,12 +28,13 @@ valac_SOURCES = \ + $(NULL) + + valac.vala.stamp: $(valac_VALASOURCES) +- $(VALA_V)$(VALAC) $(COVERAGE_VALAFLAGS) $(VALAFLAGS) -C --vapidir $(srcdir)/../vapi --pkg gobject-2.0 --vapidir $(srcdir)/../gee --pkg gee --vapidir $(srcdir)/../ccode --pkg ccode --vapidir $(srcdir)/../vala --pkg vala --vapidir $(srcdir)/../codegen --pkg codegen --pkg config $^ ++ $(VALA_V)$(VALAC) $(COVERAGE_VALAFLAGS) $(VALAFLAGS) -C --vapidir $(srcdir)/../vapi --pkg gobject-2.0 --pkg gmodule-2.0 --vapidir $(srcdir)/../gee --pkg gee --vapidir $(srcdir)/../ccode --pkg ccode --vapidir $(srcdir)/../vala --pkg vala --vapidir $(srcdir)/../codegen --pkg codegen --pkg config $^ + @touch $@ + + valac_LDADD = \ + $(COVERAGE_LIBS) \ + $(GLIB_LIBS) \ ++ $(GMODULE_LIBS) \ + ../codegen/libvala@PACKAGE_SUFFIX@.la \ + $(NULL) + +diff --git a/compiler/valacompiler.vala b/compiler/valacompiler.vala +index 174794e..af645d0 100644 +--- a/compiler/valacompiler.vala ++++ b/compiler/valacompiler.vala +@@ -70,6 +70,8 @@ class Vala.Compiler { + static string cc_command; + [CCode (array_length = false, array_null_terminated = true)] + static string[] cc_options; ++ [CCode (array_length = false, array_null_terminated = true)] ++ static string[] profile_plugin_options; + static string dump_tree; + static bool save_temps; + [CCode (array_length = false, array_null_terminated = true)] +@@ -77,6 +79,7 @@ class Vala.Compiler { + static bool quiet_mode; + static bool verbose_mode; + static string profile; ++ static string profile_plugindir; + static bool nostdpkg; + static bool enable_version_header; + static bool disable_version_header; +@@ -89,6 +92,12 @@ class Vala.Compiler { + + private CodeContext context; + ++ private Module? profile_module; ++ private CustomProfileFactoryDelegate custom_profile_factory; ++ ++ [CCode(has_target=false)] ++ private delegate Vala.CodeGenerator CustomProfileFactoryDelegate(Vala.CodeContext context, string[] profile_plugindir_options); ++ + 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 files in DIRECTORY", "DIRECTORY..." }, +@@ -132,6 +141,8 @@ class Vala.Compiler { + { "dump-tree", 0, 0, OptionArg.FILENAME, ref dump_tree, "Write code tree to FILE", "FILE" }, + { "save-temps", 0, 0, OptionArg.NONE, ref save_temps, "Keep temporary files", null }, + { "profile", 0, 0, OptionArg.STRING, ref profile, "Use the given profile instead of the default", "PROFILE" }, ++ { "profile-plugindir", 0, 0, OptionArg.STRING, ref profile_plugindir, "Directory used to search for profile plugins", "DIRECTORY" }, ++ { "profile-option", 0, 0, OptionArg.STRING_ARRAY, ref profile_plugin_options, "Pass OPTION to the profile plugin", "OPTION" }, + { "quiet", 'q', 0, OptionArg.NONE, ref quiet_mode, "Do not print messages to the console", null }, + { "verbose", 'v', 0, OptionArg.NONE, ref verbose_mode, "Print additional messages to the console", null }, + { "target-glib", 0, 0, OptionArg.STRING, ref target_glib, "Target version of glib for code generation", "MAJOR.MINOR" }, +@@ -212,12 +223,34 @@ class Vala.Compiler { + context.thread = thread; + context.mem_profiler = mem_profiler; + context.save_temps = save_temps; ++ ++ if (profile_plugindir == null) { ++ profile_plugindir = Config.PACKAGE_LIBEXECDIR; ++ } + if (profile == "gobject-2.0" || profile == "gobject" || profile == null) { + // default profile + context.profile = Profile.GOBJECT; + context.add_define ("GOBJECT"); + } else { +- Report.error (null, "Unknown profile %s".printf (profile)); ++ if (Module.supported()) { ++ string path = Module.build_path (profile_plugindir, "%s%s".printf(profile, Config.PACKAGE_SUFFIX)); ++ ++ profile_module = Module.open (path, ModuleFlags.BIND_LOCAL); ++ if (profile_module != null) { ++ void* codegen_factory_func; ++ ++ if (profile_module.symbol("vala_codegenerator_factory", out codegen_factory_func)) { ++ custom_profile_factory = (CustomProfileFactoryDelegate) codegen_factory_func; ++ context.profile = Profile.CUSTOM; ++ } else { ++ Report.error (null, "A valid factory function was not found. Can't use module '%s' for profile %s".printf (path, profile)); ++ } ++ } else { ++ Report.error (null, "Can't load module '%s'. Unknown profile %s".printf (path, profile)); ++ } ++ } else { ++ Report.error (null, "Unknown profile %s".printf (profile)); ++ } + } + nostdpkg |= fast_vapi_filename != null; + context.nostdpkg = nostdpkg; +@@ -248,14 +281,16 @@ class Vala.Compiler { + Report.error (null, "This version of valac only supports GLib 2"); + } + +- for (int i = 16; i <= glib_minor; i += 2) { +- context.add_define ("GLIB_2_%d".printf (i)); +- } ++ if (context.profile != Profile.CUSTOM) { ++ for (int i = 16; i <= glib_minor; i += 2) { ++ context.add_define ("GLIB_2_%d".printf (i)); ++ } + +- if (!nostdpkg) { +- /* default packages */ +- context.add_external_package ("glib-2.0"); +- context.add_external_package ("gobject-2.0"); ++ if (!nostdpkg) { ++ /* default packages */ ++ context.add_external_package ("glib-2.0"); ++ context.add_external_package ("gobject-2.0"); ++ } + } + + if (packages != null) { +@@ -280,7 +315,16 @@ class Vala.Compiler { + return quit (); + } + +- context.codegen = new GDBusServerModule (); ++ if (context.profile == Profile.CUSTOM) { ++ var codegen = custom_profile_factory(context, profile_plugin_options) as Vala.CodeGenerator; ++ if (codegen != null) { ++ context.codegen = codegen; ++ } else { ++ Report.error (null, "Invalid code generator for profile %s".printf (profile)); ++ } ++ } else { ++ context.codegen = new GDBusServerModule (); ++ } + + bool has_c_files = false; + +diff --git a/vala/valaarraytype.vala b/vala/valaarraytype.vala +index b376723..7431078 100644 +--- a/vala/valaarraytype.vala ++++ b/vala/valaarraytype.vala +@@ -165,12 +165,12 @@ public class Vala.ArrayType : ReferenceType { + + public override bool compatible (DataType target_type) { + if (target_type.data_type != null) { +- if (target_type.data_type.is_subtype_of (CodeContext.get ().analyzer.gvalue_type.data_type) && element_type.data_type == CodeContext.get ().root.scope.lookup ("string")) { ++ if (CodeContext.get ().analyzer.gvalue_type != null && target_type.data_type.is_subtype_of (CodeContext.get ().analyzer.gvalue_type.data_type) && element_type.data_type == CodeContext.get ().root.scope.lookup ("string")) { + // allow implicit conversion from string[] to GValue + return true; + } + +- if (target_type.data_type.is_subtype_of (CodeContext.get ().analyzer.gvariant_type.data_type)) { ++ if (CodeContext.get ().analyzer.gvariant_type != null && target_type.data_type.is_subtype_of (CodeContext.get ().analyzer.gvariant_type.data_type)) { + // allow implicit conversion to GVariant + return true; + } +diff --git a/vala/valacastexpression.vala b/vala/valacastexpression.vala +index c7a72b6..90371b8 100644 +--- a/vala/valacastexpression.vala ++++ b/vala/valacastexpression.vala +@@ -163,7 +163,7 @@ public class Vala.CastExpression : Expression { + } + + bool is_gvariant (CodeContext context, DataType type) { +- return type.data_type != null && type.data_type.is_subtype_of (context.analyzer.gvariant_type.data_type); ++ return type.data_type != null && context.analyzer.gvariant_type != null && type.data_type.is_subtype_of (context.analyzer.gvariant_type.data_type); + } + + public override void emit (CodeGenerator codegen) { +diff --git a/vala/valacodecontext.vala b/vala/valacodecontext.vala +index afad107..62fb4d4 100644 +--- a/vala/valacodecontext.vala ++++ b/vala/valacodecontext.vala +@@ -412,9 +412,11 @@ public class Vala.CodeContext { + source_file.relative_filename = filename; + + // import the GLib namespace by default (namespace of backend-specific standard library) +- var ns_ref = new UsingDirective (new UnresolvedSymbol (null, "GLib", null)); +- source_file.add_using_directive (ns_ref); +- root.add_using_directive (ns_ref); ++ if (this.profile != Profile.CUSTOM) { ++ var ns_ref = new UsingDirective (new UnresolvedSymbol (null, "GLib", null)); ++ source_file.add_using_directive (ns_ref); ++ root.add_using_directive (ns_ref); ++ } + + add_source_file (source_file); + } else if (filename.has_suffix (".vapi") || filename.has_suffix (".gir")) { +diff --git a/vala/valadatatype.vala b/vala/valadatatype.vala +index 085d321..02ac63c 100644 +--- a/vala/valadatatype.vala ++++ b/vala/valadatatype.vala +@@ -263,12 +263,12 @@ public abstract class Vala.DataType : CodeNode { + } + + if (target_type.data_type != null) { +- if (target_type.data_type.is_subtype_of (CodeContext.get ().analyzer.gvalue_type.data_type)) { ++ if (CodeContext.get ().analyzer.gvalue_type != null && target_type.data_type.is_subtype_of (CodeContext.get ().analyzer.gvalue_type.data_type)) { + // allow implicit conversion to GValue + return true; + } + +- if (target_type.data_type.is_subtype_of (CodeContext.get ().analyzer.gvariant_type.data_type)) { ++ if (CodeContext.get ().analyzer.gvariant_type != null && target_type.data_type.is_subtype_of (CodeContext.get ().analyzer.gvariant_type.data_type)) { + // allow implicit conversion to GVariant + return true; + } +diff --git a/vala/valaforeachstatement.vala b/vala/valaforeachstatement.vala +index 8c65222..0b5f1ec 100644 +--- a/vala/valaforeachstatement.vala ++++ b/vala/valaforeachstatement.vala +@@ -174,7 +174,7 @@ public class Vala.ForeachStatement : Block { + array_type.inline_allocated = false; + + return check_without_iterator (context, collection_type, array_type.element_type); +- } else if (collection_type.compatible (context.analyzer.glist_type) || collection_type.compatible (context.analyzer.gslist_type)) { ++ } else if ((context.analyzer.glist_type != null && collection_type.compatible (context.analyzer.glist_type)) || (context.analyzer.gslist_type != null && collection_type.compatible (context.analyzer.gslist_type))) { + if (collection_type.get_type_arguments ().size != 1) { + error = true; + Report.error (collection.source_reference, "missing type argument for collection"); +@@ -182,7 +182,7 @@ public class Vala.ForeachStatement : Block { + } + + return check_without_iterator (context, collection_type, collection_type.get_type_arguments ().get (0)); +- } else if (collection_type.compatible (context.analyzer.gvaluearray_type)) { ++ } else if (context.analyzer.gvaluearray_type != null && collection_type.compatible (context.analyzer.gvaluearray_type)) { + return check_without_iterator (context, collection_type, context.analyzer.gvalue_type); + } else { + return check_with_iterator (context, collection_type); +diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala +index 89d2ba5..eac7136 100644 +--- a/vala/valamethodcall.vala ++++ b/vala/valamethodcall.vala +@@ -220,7 +220,8 @@ public class Vala.MethodCall : Expression { + + CreationMethod base_cm = null; + +- if (mtype is ObjectType || call.symbol_reference == context.analyzer.object_type) { ++ //if (mtype is ObjectType || call.symbol_reference == context.analyzer.object_type) { ++ if (mtype is ObjectType || (context.analyzer.object_type != null && call.symbol_reference == context.analyzer.object_type)) { + // constructor chain-up + var cm = context.analyzer.find_current_method () as CreationMethod; + if (cm == null) { +diff --git a/vala/valapointertype.vala b/vala/valapointertype.vala +index 4bfaf34..4f57641 100644 +--- a/vala/valapointertype.vala ++++ b/vala/valapointertype.vala +@@ -83,7 +83,7 @@ public class Vala.PointerType : DataType { + return base_type.compatible (target_type); + } + +- if (target_type.data_type != null && target_type.data_type.is_subtype_of (CodeContext.get ().analyzer.gvalue_type.data_type)) { ++ if (target_type.data_type != null && CodeContext.get ().analyzer.gvalue_type != null && target_type.data_type.is_subtype_of (CodeContext.get ().analyzer.gvalue_type.data_type)) { + // allow implicit conversion to GValue + return true; + } +diff --git a/vala/valaprofile.vala b/vala/valaprofile.vala +index 8024965..a5aebdb 100644 +--- a/vala/valaprofile.vala ++++ b/vala/valaprofile.vala +@@ -21,5 +21,6 @@ + */ + + public enum Vala.Profile { +- GOBJECT ++ GOBJECT, ++ CUSTOM + } +diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala +index 8244896..c78c513 100644 +--- a/vala/valasemanticanalyzer.vala ++++ b/vala/valasemanticanalyzer.vala +@@ -204,22 +204,24 @@ public class Vala.SemanticAnalyzer : CodeVisitor { + unichar_type = new IntegerType (unichar_struct); + } + +- var glib_ns = root_symbol.scope.lookup ("GLib"); ++ if (context.profile == Profile.GOBJECT) { ++ var glib_ns = root_symbol.scope.lookup ("GLib"); + +- object_type = (Class) glib_ns.scope.lookup ("Object"); +- type_type = new IntegerType ((Struct) glib_ns.scope.lookup ("Type")); +- gvalue_type = new StructValueType ((Struct) glib_ns.scope.lookup ("Value")); +- gvariant_type = new ObjectType ((Class) glib_ns.scope.lookup ("Variant")); ++ object_type = (Class) glib_ns.scope.lookup ("Object"); ++ type_type = new IntegerType ((Struct) glib_ns.scope.lookup ("Type")); ++ gvalue_type = new StructValueType ((Struct) glib_ns.scope.lookup ("Value")); ++ gvariant_type = new ObjectType ((Class) glib_ns.scope.lookup ("Variant")); + +- glist_type = new ObjectType ((Class) glib_ns.scope.lookup ("List")); +- gslist_type = new ObjectType ((Class) glib_ns.scope.lookup ("SList")); +- garray_type = new ObjectType ((Class) glib_ns.scope.lookup ("Array")); +- gvaluearray_type = new ObjectType ((Class) glib_ns.scope.lookup ("ValueArray")); ++ glist_type = new ObjectType ((Class) glib_ns.scope.lookup ("List")); ++ gslist_type = new ObjectType ((Class) glib_ns.scope.lookup ("SList")); ++ garray_type = new ObjectType ((Class) glib_ns.scope.lookup ("Array")); ++ gvaluearray_type = new ObjectType ((Class) glib_ns.scope.lookup ("ValueArray")); + +- gerror_type = (Class) glib_ns.scope.lookup ("Error"); +- regex_type = new ObjectType ((Class) root_symbol.scope.lookup ("GLib").scope.lookup ("Regex")); ++ gsource_type = (Class) glib_ns.scope.lookup ("Source"); + +- gsource_type = (Class) glib_ns.scope.lookup ("Source"); ++ gerror_type = (Class) glib_ns.scope.lookup ("Error"); ++ regex_type = new ObjectType ((Class) root_symbol.scope.lookup ("GLib").scope.lookup ("Regex")); ++ } + + current_symbol = root_symbol; + context.root.check (context); +diff --git a/vapi/config.vapi b/vapi/config.vapi +index 2c6df9e..aada11b 100644 +--- a/vapi/config.vapi ++++ b/vapi/config.vapi +@@ -26,4 +26,5 @@ namespace Config { + public const string BUILD_VERSION; + public const string PACKAGE_DATADIR; + public const string PACKAGE_SUFFIX; ++ public const string PACKAGE_LIBEXECDIR; + } diff --git a/srcpkgs/pvala/template b/srcpkgs/pvala/template new file mode 100644 index 0000000000..cef03847f1 --- /dev/null +++ b/srcpkgs/pvala/template @@ -0,0 +1,65 @@ +# Template file for 'pvala' +pkgname=pvala +version=20130929 +revision=1 +build_style=gnu-configure +configure_args="--enable-vapigen" +hostmakedepends="autoconf automake libtool pkg-config flex libxslt git vala" +makedepends="libglib-devel libfl-devel" +short_desc="Compiler for the GObject type system - Profile plugins version" +maintainer="davehome