]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
valadoc: Improve plugin selection
authorFlorian Brosch <flo.brosch@gmail.com>
Mon, 25 Jul 2011 06:57:04 +0000 (08:57 +0200)
committerFlorian Brosch <flo.brosch@gmail.com>
Fri, 29 Jul 2011 00:45:26 +0000 (02:45 +0200)
configure.in
src/valadoc/Makefile.am
src/valadoc/valadoc.vala
src/vapi/config.vapi

index 68516caeb009bb9791d95bd9facf6d8b68a243b9..b407c383d709ae872f32a4f7599d10728f04515f 100755 (executable)
@@ -13,23 +13,27 @@ AC_PROG_CC
 AC_PROG_LIBTOOL
 
 
-AC_PATH_PROG(VALAC, valac, valac)
-AC_SUBST(VALAC)
-
-
-AC_SUBST(VALAFLAGS)
 
+##
+## Settings:
+##
 
-VALA_PACKAGE=libvala-0.14
-LIBVALA_REQUIRED=0.13.0
+VALA_REQUIRED=0.13.1.56
 LIBGEE_REQUIRED=0.5
 LIBGVC_REQUIRED=2.16
 GLIB_REQUIRED=2.12.0
-GTK_REQUIRED=2.10.0
 LIBGDKPIXBUF_REQUIRED=2.0
 
 
 
+##
+## Dependencies:
+##
+
+AC_PATH_PROG(VALAC, valac, valac)
+AC_SUBST(VALAC)
+AC_SUBST(VALAFLAGS)
+m4_ifdef([AM_PROG_VALAC], [AM_PROG_VALAC([$VALA_REQUIRED])])
 
 PKG_CHECK_MODULES(LIBGVC, libgvc >= $LIBGVC_REQUIRED)
 AC_SUBST(LIBGVC_CFLAGS)
@@ -89,7 +93,6 @@ AC_SUBST(LIBVALA_0_10_X_LIBS)
 
 
 
-
 AC_CONFIG_FILES([Makefile
                  src/libvaladoc/valadoc-1.0.pc
                  src/libvaladoc/valadoc-1.0.deps
@@ -111,4 +114,5 @@ AC_CONFIG_FILES([Makefile
                  tests/Makefile
                                 ])
 
+
 AC_OUTPUT
index 9da97a269612c5b6cb3048315d898656cd67205b..156f8830d471e67a3e3927756a4d1d31ae525cc8 100755 (executable)
@@ -1,14 +1,17 @@
 NULL =
 
+DEFAULT_DRIVER = "`$(VALAC) --version`"
 
-AM_CFLAGS =                             \
+
+AM_CFLAGS =                                 \
        -DPACKAGE_DATADIR=\"$(libdir)/valadoc\" \
-       -DPACKAGE_VERSION=\"$(VERSION)\"    \
-       -I ../libvaladoc/                   \
-       $(GLIB_CFLAGS)                      \
-       $(LIBGEE_CFLAGS)                    \
-       $(GMODULE_CFLAGS)                   \
-       $(LIBGVC_CFLAGS)                    \
+       -DPACKAGE_VERSION=\"$(VERSION)\"        \
+       -DDEFAULT_DRIVER=\"$(DEFAULT_DRIVER)\"         \
+       -I ../libvaladoc/                       \
+       $(GLIB_CFLAGS)                          \
+       $(LIBGEE_CFLAGS)                        \
+       $(GMODULE_CFLAGS)                       \
+       $(LIBGVC_CFLAGS)                        \
        $(NULL)
 
 
index 67cffe0421412924f487375c4d9860e853da6524..4969deb8ec8320fd1425b84ffd82c28a398805a4 100755 (executable)
@@ -1,6 +1,7 @@
 /* valadoc.vala
  *
  * Copyright (C) 2008-2009 Florian Brosch
+ * Copyright (C) 2011      Florian Brosch
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -65,33 +66,39 @@ public class ValaDoc : Object {
        private static string[] packages;
 
        private const GLib.OptionEntry[] options = {
+               { "directory", 'o', 0, OptionArg.FILENAME, ref directory, "Output directory", "DIRECTORY" },
+
                { "basedir", 'b', 0, OptionArg.FILENAME, ref basedir, "Base source directory", "DIRECTORY" },
                { "define", 'D', 0, OptionArg.STRING_ARRAY, ref defines, "Define SYMBOL", "SYMBOL..." },
+               { "profile", 0, 0, OptionArg.STRING, ref profile, "Use the given profile instead of the default", "PROFILE" },
+
                { "enable-experimental", 0, 0, OptionArg.NONE, ref experimental, "Enable experimental features", null },
                { "enable-experimental-non-null", 0, 0, OptionArg.NONE, ref experimental_non_null, "Enable experimental enhancements for non-null types", null },
-               { "vapidir", 0, 0, OptionArg.FILENAME_ARRAY, ref vapi_directories, "Look for package bindings in DIRECTORY", "DIRECTORY..." },
-               { "importdir", 0, 0, OptionArg.FILENAME_ARRAY, ref import_directories, "Look for external documentation in DIRECTORY", "DIRECTORY..." },
-               { "profile", 0, 0, OptionArg.STRING, ref profile, "Use the given profile instead of the default", "PROFILE" },
-               { "driver", 0, 0, OptionArg.NONE, ref driverpath, "Display version number", null },
 
+               { "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..." },
+
+               { "driver", 0, 0, OptionArg.STRING, ref driverpath, "Name of an driver or path to a custom driver", null },
+
+               { "importdir", 0, 0, OptionArg.FILENAME_ARRAY, ref import_directories, "Look for external documentation in DIRECTORY", "DIRECTORY..." },
                { "import", 0, 0, OptionArg.STRING_ARRAY, ref import_packages, "Include binding for PACKAGE", "PACKAGE..." },
-               { "directory", 'o', 0, OptionArg.FILENAME, ref directory, "Output directory", "DIRECTORY" },
 
                { "wiki", 0, 0, OptionArg.FILENAME, ref wikidirectory, "Wiki directory", "DIRECTORY" },
+
                { "deps", 0, 0, OptionArg.NONE, ref with_deps, "Adds packages to the documentation", null },
 
-               { "doclet-arg", 'X', 0, OptionArg.STRING_ARRAY, ref pluginargs, "Pass arguments to the doclet", "ARG" },
                { "doclet", 0, 0, OptionArg.STRING, ref docletpath, "Name of an included doclet or path to custom doclet", "PLUGIN"},
+               { "doclet-arg", 'X', 0, OptionArg.STRING_ARRAY, ref pluginargs, "Pass arguments to the doclet", "ARG" },
 
                { "no-protected", 0, OptionFlags.REVERSE, OptionArg.NONE, ref _protected, "Removes protected elements from documentation", null },
                { "internal", 0, 0, OptionArg.NONE, ref _internal, "Adds internal elements to documentation", null },
                { "private", 0, 0, OptionArg.NONE, ref _private, "Adds private elements to documentation", null },
-//             { "inherit", 0, 0, OptionArg.NONE, ref add_inherited, "Adds inherited elements to a class", null },
 
                { "package-name", 0, 0, OptionArg.STRING, ref pkg_name, "package name", "NAME" },
                { "package-version", 0, 0, OptionArg.STRING, ref pkg_version, "package version", "VERSION" },
 
+               { "version", 0, 0, OptionArg.NONE, ref version, "Display version number", null },
+
                { "force", 0, 0, OptionArg.NONE, ref force, "force", null },
                { "verbose", 0, 0, OptionArg.NONE, ref verbose, "Show all warnings", null },
                { "", 0, 0, OptionArg.FILENAME_ARRAY, ref tsources, null, "FILE..." },
@@ -99,6 +106,30 @@ public class ValaDoc : Object {
                { null }
        };
 
+       private struct LibvalaVersion {
+               public int segment_a;
+               public int segment_b;
+               public int segment_c;
+
+               public LibvalaVersion (int seg_a, int seg_b, int seg_c) {
+                       segment_a = seg_a;
+                       segment_b = seg_b;
+                       segment_c = seg_c;
+               }
+       }
+
+       private struct DriverMetaData {
+               public LibvalaVersion min;
+               public LibvalaVersion max;
+               public string driver;
+
+               public DriverMetaData (LibvalaVersion min, LibvalaVersion max, string driver) {
+                       this.driver = driver;
+                       this.min = min;
+                       this.max = max;
+               }
+       }
+
        private static int quit (ErrorReporter reporter) {
                if (reporter.errors == 0) {
                        stdout.printf ("Succeeded - %d warning(s)\n", reporter.warnings);
@@ -138,11 +169,7 @@ public class ValaDoc : Object {
                return this.pkg_name;
        }
 
-       private string get_plugin_dir (string? pluginpath, string subdir, string default_pkg) {
-               if (pluginpath == null) {
-                       return build_filename (Config.plugin_dir, subdir, default_pkg);
-               }
-
+       private string get_plugin_path (string pluginpath, string pluginsubdir) {
                if (is_absolute (pluginpath) == false) {
                        // Test to see if the plugin exists in the expanded path and then fallback
                        // to using the configured plugin directory
@@ -150,19 +177,99 @@ public class ValaDoc : Object {
                        if (FileUtils.test(local_path, FileTest.EXISTS)) {
                                return local_path;
                        } else {
-                               return build_filename (Config.plugin_dir, subdir, pluginpath);
+                               return build_filename (Config.plugin_dir, pluginsubdir, pluginpath);
                        }
                }
 
                return pluginpath;
        }
 
+       private string get_doclet_path (ErrorReporter reporter) {
+               if (docletpath == null) {
+                       return build_filename (Config.plugin_dir, "doclets", "html");
+               }
+
+               return get_plugin_path (docletpath, "doclet");
+       }
+
+       private bool is_driver (string path) {
+               string library_path = Path.build_filename (path, "libdriver." + Module.SUFFIX);
+               return FileUtils.test (path, FileTest.EXISTS) && FileUtils.test (library_path, FileTest.EXISTS);
+       }
+
+       private string? get_driver_path (ErrorReporter reporter) {
+               // no driver selected
+               if (driverpath == null) {
+                       driverpath = Config.default_driver;
+               }
+
+
+               // selected string is a plugin directory
+               string extended_driver_path = get_plugin_path (driverpath, "drivers");
+               if (is_driver (extended_driver_path)) {
+                       return extended_driver_path;
+               }
+
+
+               // selected string is a version number:
+               if (driverpath.has_prefix ("Vala ")) {
+                       driverpath = driverpath.substring (5);
+               }
+
+               string[] segments = driverpath.split (".");
+               if (segments.length != 3 && segments.length != 4) {
+                       reporter.simple_error ("Invalid driver version format.");
+                       return null;
+               }
+
+
+               //TODO: add try_parse to int
+               int64 segment_a;
+               int64 segment_b;
+               int64 segment_c;
+               bool tmp;
+
+               tmp  = int64.try_parse (segments[0], out segment_a);
+               tmp &= int64.try_parse (segments[1], out segment_b);
+               tmp &= int64.try_parse (segments[2], out segment_c);
+
+               if (!tmp) {
+                       reporter.simple_error ("Invalid driver version format.");
+                       return null;
+               }
+
+               DriverMetaData[] lut = {
+                               DriverMetaData (LibvalaVersion (0, 10, 0), LibvalaVersion (0, 10, -4), "0.10.x"),
+                               DriverMetaData (LibvalaVersion (0, 11, 0), LibvalaVersion (0, 11,  0), "0.11.0"),
+                               DriverMetaData (LibvalaVersion (0, 11, 1), LibvalaVersion (0, 11, -1), "0.11.x"),
+                               DriverMetaData (LibvalaVersion (0, 12, 0), LibvalaVersion (0, 12, -1), "0.12.x"),
+                               DriverMetaData (LibvalaVersion (0, 13, 0), LibvalaVersion (0, 13, -1), "0.13.x")
+                       };
+
+               for (int i = 0; i < lut.length ; i++) {
+                       if (lut[i].min.segment_a <= segment_a && lut[i].max.segment_a >= segment_a
+                               && lut[i].min.segment_b <= segment_b && lut[i].max.segment_b >= segment_b
+                               && lut[i].min.segment_c <= segment_c && (lut[i].max.segment_c >= segment_c || lut[i].max.segment_c < 0)) {
+                               return Path.build_filename (Config.plugin_dir, "drivers", lut[i].driver);
+                       }
+               }
+
+               // return invalid driver path
+               reporter.simple_error ("No suitable driver found.");
+               return null;
+       }
+
        private ModuleLoader? create_module_loader (ErrorReporter reporter) {
                ModuleLoader modules = new ModuleLoader ();
                Taglets.init (modules);
 
+
                // doclet:
-               string pluginpath = get_plugin_dir (docletpath, "doclets", "html");
+               string? pluginpath = get_doclet_path (reporter);
+               if (pluginpath == null) {
+                       return null;
+               }
+
                bool tmp = modules.load_doclet (pluginpath);
                if (tmp == false) {
                        reporter.simple_error ("failed to load doclet");
@@ -171,7 +278,11 @@ public class ValaDoc : Object {
 
 
                // driver:
-               pluginpath = get_plugin_dir (driverpath, "drivers", "0.13.x");
+               pluginpath = get_driver_path (reporter);
+               if (pluginpath == null) {
+                       return null;
+               }
+
                tmp = modules.load_driver (pluginpath);
                if (tmp == false) {
                        reporter.simple_error ("failed to load driver");
index dea37b26383e20d703f7f28d1111b9655ad7c5fe..55fed86740321a0359adf67127292de4a9be20ed 100755 (executable)
@@ -14,5 +14,8 @@ namespace Config {
 
        [CCode (cname = "PACKAGE_VAPIDIR")]
        public const string vapi_dir;
+
+       [CCode (cname = "DEFAULT_DRIVER")]
+       public const string default_driver;
 }