[gtk-doc-stub] Import introspection stub machinery too



commit 3dfd0a09de696ec8c544762747f8a0f77153622e
Author: Colin Walters <walters verbum org>
Date:   Wed Jul 18 11:42:48 2012 -0400

    Import introspection stub machinery too
    
    Some people who don't want gtk-doc also don't want
    gobject-introspection, and this helps them.
    
    Tested-by: Ross Burton <ross burton intel com>

 Makefile               |    4 +
 Makefile.introspection |  163 ++++++++++++++++++++++++++++++++++++++++++++++++
 introspection.m4       |   96 ++++++++++++++++++++++++++++
 3 files changed, 263 insertions(+), 0 deletions(-)
---
diff --git a/Makefile b/Makefile
index ad4231a..7cb6ce5 100644
--- a/Makefile
+++ b/Makefile
@@ -23,3 +23,7 @@ install: $(bin_programs)
 
 	mkdir -p $(DESTDIR)$(datarootdir)/aclocal/
 	install -m 0644 $(srcdir)/gtk-doc.m4 $(DESTDIR)$(datarootdir)/aclocal/gtk-doc.m4
+
+	mkdir -p $(DESTDIR)$(datarootdir)/gobject-introspection-1.0
+	install -m 0644 $(srcdir)/Makefile.introspection $(DESTDIR)$(datarootdir)/gobject-introspection-1.0/Makefile.introspection
+	install -m 0644 $(srcdir)/introspection.m4 $(DESTDIR)$(datarootdir)/aclocal/introspection.m4
diff --git a/Makefile.introspection b/Makefile.introspection
new file mode 100644
index 0000000..755dd15
--- /dev/null
+++ b/Makefile.introspection
@@ -0,0 +1,163 @@
+# -*- Mode: make -*-
+# Copyright 2009-2010 Johan Dahlin
+#
+# This file is free software; the author(s) gives unlimited
+# permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# * Input variables:
+#
+#   INTROSPECTION_GIRS - List of GIRS that should be generated
+#   INTROSPECTION_SCANNER - Command to invoke scanner, normally set by
+#      GOBJECT_INTROSPECTION_REQUIRE/CHECK() in introspection.m4
+#   INTROSPECTION_SCANNER_ARGS - Additional args to pass in to the scanner
+#   INTROSPECTION_SCANNER_ENV - Environment variables to set before running
+#      the scanner
+#   INTROSPECTION_COMPILER - Command to invoke compiler, normally set by
+#      GOBJECT_INTROSPECTION_REQUIRE/CHECK() in introspection.m4
+#   INTROSPECTION_COMPILER_ARGS - Additional args to pass in to the compiler
+#
+# * Simple tutorial
+#
+# Add this to configure.ac:
+#   -Wno-portability to AM_INIT_AUTOMAKE
+#   GOBJECT_INTROSPECTION_CHECK([0.6.7])
+#
+# Add this to Makefile.am where your library/program is built:
+#   include $(INTROSPECTION_MAKEFILE)
+#   INTROSPECTION_GIRS = YourLib-1.0.gir
+#   YourLib_1_0_gir_NAMESPACE = YourLib
+#   YourLib_1_0_gir_VERSION = 1.0
+#   YourLib_1_0_gir_LIBS = libyourlib.la
+#   YourLib_1_0_gir_FILES = $(libyourlib_1_0_SOURCES)
+#   girdir = $(datadir)/gir-1.0
+#   dist_gir_DATA = YourLib-1.0.gir
+#   typelibdir = $(libdir)/girepository-1.0
+#   typelib_DATA = YourLib-1.0.typelib
+#   CLEANFILES = $(dist_gir_DATA) $(typelib_DATA)
+#
+
+# Make sure the required variables are set, these should under normal
+# circumstances come from introspection.m4
+$(if $(INTROSPECTION_SCANNER),,$(error Need to define INTROSPECTION_SCANNER))
+$(if $(INTROSPECTION_COMPILER),,$(error Need to define INTROSPECTION_COMPILER))
+
+# Private functions
+
+## Transform the gir filename to something which can reference through a variable
+## without automake/make complaining, eg Gtk-2.0.gir -> Gtk_2_0_gir
+_gir_name = $(subst /,_,$(subst -,_,$(subst .,_,$(1))))
+
+# Namespace and Version is either fetched from the gir filename
+# or the _NAMESPACE/_VERSION variable combo
+_gir_namespace = $(or $($(_gir_name)_NAMESPACE),$(firstword $(subst -, ,$(notdir $(1)))))
+_gir_version = $(or $($(_gir_name)_VERSION),$(lastword $(subst -, ,$(1:.gir=))))
+
+# _PROGRAM is an optional variable which needs it's own --program argument
+_gir_program = $(if $($(_gir_name)_PROGRAM),--program=$($(_gir_name)_PROGRAM))
+
+# Variables which provides a list of things
+_gir_libraries = $(foreach lib,$($(_gir_name)_LIBS),--library=$(lib))
+_gir_packages = $(foreach pkg,$($(_gir_name)_PACKAGES),--pkg=$(pkg))
+_gir_includes = $(foreach include,$($(_gir_name)_INCLUDES),--include=$(include))
+_gir_export_packages = $(foreach pkg,$($(_gir_name)_EXPORT_PACKAGES),--pkg-export=$(pkg))
+
+# Reuse the LIBTOOL variable from automake if it's set, but
+# work around MSYS weirdness: When running g-ir-scanner, MSYS changes
+# a command-line argument --libtool="/bin/sh ../../libtool" into
+# --libtool=c:/opt/msys/1.0/bin/libtool. So just use sh.exe without path
+# because we already "know" where the libtool configure produced is.
+_gir_libtool = $(if $(findstring MINGW32,$(shell uname -s)),--libtool="$(top_builddir)/libtool",$(if $(LIBTOOL),--libtool="$(LIBTOOL)"))
+
+# Macros for AM_SILENT_RULES prettiness
+_gir_verbosity = $(if $(AM_DEFAULT_VERBOSITY),$(AM_DEFAULT_VERBOSITY),1)
+
+_gir_silent_scanner_prefix = $(_gir_silent_scanner_prefix_$(V))
+_gir_silent_scanner_prefix_ = $(_gir_silent_scanner_prefix_$(_gir_verbosity))
+_gir_silent_scanner_prefix_0 = @echo "  GISCAN $(1)";
+_gir_silent_scanner_opts = $(_gir_silent_scanner_opts_$(V))
+_gir_silent_scanner_opts_ = $(_gir_silent_scanner_opts_$(_gir_verbosity))
+_gir_silent_scanner_opts_0 = --quiet
+
+_gir_silent_compiler = $(_gir_silent_compiler_$(V))
+_gir_silent_compiler_ = $(_gir_silent_compiler_$(_gir_verbosity))
+_gir_silent_compiler_0 = @echo "  GICOMP $(1)";
+
+#
+# Creates a GIR by scanning C headers/sources
+# $(1) - Name of the gir file (output)
+#
+# If output is Gtk-2.0.gir then you should name the variables like
+# Gtk_2_0_gir_NAMESPACE, Gtk_2_0_gir_VERSION etc.
+# Required variables:
+# FILES - C sources and headers which should be scanned
+#
+# One of these variables are required:
+# LIBS - Library where the symbol represented in the gir can be found
+# PROGRAM - Program where the symbol represented in the gir can be found
+#
+# Optional variables
+# NAMESPACE - Namespace of the gir, first letter capital,
+#   rest should be lower case, for instance: 'Gtk', 'Clutter', 'ClutterGtk'.
+#   If not present the namespace will be fetched from the gir filename,
+#   the part before the first dash. For 'Gtk-2.0', namespace will be 'Gtk'.
+# VERSION - Version of the gir, if not present, will be fetched from gir
+# filename, the part after the first dash. For 'Gtk-2.0', version will be '2.0'.
+# LIBTOOL - Command to invoke libtool, usually set by automake
+# SCANNERFLAGS - Flags to pass in to the scanner, see g-ir-scanner(1) for a list
+# CFLAGS - Flags to pass in to the parser when scanning headers
+# LDFLAGS - Linker flags used by the scanner
+# PACKAGES - list of pkg-config names which cflags are required to parse
+#   the headers of this gir
+# INCLUDES - Gir files to include without the .gir suffix, for instance
+#   GLib-2.0, Gtk-2.0. This is needed for all libraries which you depend on that
+#   provides introspection information.
+# EXPORT_PACKAGES - list of pkg-config names that are provided by this gir.
+#   By default the names in the PACKAGES variable will be used.
+#
+
+define introspection-scanner
+
+# Basic sanity check, to make sure required variables are set
+$(if $($(_gir_name)_FILES),,$(error Need to define $(_gir_name)_FILES))
+$(if $(or $(findstring --header-only,$($(_gir_name)_SCANNERFLAGS)),
+          $($(_gir_name)_LIBS),
+          $($(_gir_name)_PROGRAM)),,
+    $(error Need to define $(_gir_name)_LIBS or $(_gir_name)_PROGRAM))
+
+# Only dependencies we know are actually filenames goes into _FILES, make
+# sure these are built before running the scanner. Libraries and programs
+# needs to be added manually.
+$(1): $$($(_gir_name)_FILES)
+	@ $(MKDIR_P) $(dir $(1))
+	$(_gir_silent_scanner_prefix) $(INTROSPECTION_SCANNER_ENV) $(INTROSPECTION_SCANNER) $(_gir_silent_scanner_opts) \
+	$(INTROSPECTION_SCANNER_ARGS) \
+	  --namespace=$(_gir_namespace) \
+	  --nsversion=$(_gir_version) \
+	  $(_gir_libtool) \
+	  $(_gir_packages) \
+	  $(_gir_includes) \
+	  $(_gir_export_packages) \
+	  $(_gir_program) \
+	  $(_gir_libraries) \
+	  $($(_gir_name)_SCANNERFLAGS) \
+	  $($(_gir_name)_CFLAGS) \
+	  $($(_gir_name)_LDFLAGS) \
+	  $$^ \
+	  --output $(1)
+endef
+
+$(foreach gir,$(INTROSPECTION_GIRS),$(eval $(call introspection-scanner,$(gir))))
+
+#
+# Compiles a gir into a typelib
+# $(1): gir filename (input)
+# $(2): typelib filename (output)
+#
+define introspection-compiler
+$(_gir_silent_compiler) $(INTROSPECTION_COMPILER) $(INTROSPECTION_COMPILER_ARGS) --includedir=. $(1) -o $(2)
+endef
+
+# Simple rule to compile a typelib.
+%.typelib: %.gir
+	$(call introspection-compiler,$<,$@)
diff --git a/introspection.m4 b/introspection.m4
new file mode 100644
index 0000000..d89c3d9
--- /dev/null
+++ b/introspection.m4
@@ -0,0 +1,96 @@
+dnl -*- mode: autoconf -*-
+dnl Copyright 2009 Johan Dahlin
+dnl
+dnl This file is free software; the author(s) gives unlimited
+dnl permission to copy and/or distribute it, with or without
+dnl modifications, as long as this notice is preserved.
+dnl
+
+# serial 1
+
+m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL],
+[
+    AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
+    AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
+    AC_BEFORE([LT_INIT],[$0])dnl setup libtool first
+
+    dnl enable/disable introspection
+    m4_if([$2], [require],
+    [dnl
+        enable_introspection=yes
+    ],[dnl
+        AC_ARG_ENABLE(introspection,
+                  AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]],
+                                 [Enable introspection for this build]),, 
+                                 [enable_introspection=auto])
+    ])dnl
+
+    AC_MSG_CHECKING([for gobject-introspection])
+
+    dnl presence/version checking
+    AS_CASE([$enable_introspection],
+    [no], [dnl
+        found_introspection="no (disabled, use --enable-introspection to enable)"
+    ],dnl
+    [yes],[dnl
+        PKG_CHECK_EXISTS([gobject-introspection-1.0],,
+                         AC_MSG_ERROR([gobject-introspection-1.0 is not installed]))
+        PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1],
+                         found_introspection=yes,
+                         AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME]))
+    ],dnl
+    [auto],[dnl
+        PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no)
+	dnl Canonicalize enable_introspection
+	enable_introspection=$found_introspection
+    ],dnl
+    [dnl	
+        AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@])
+    ])dnl
+
+    AC_MSG_RESULT([$found_introspection])
+
+    INTROSPECTION_SCANNER=
+    INTROSPECTION_COMPILER=
+    INTROSPECTION_GENERATE=
+    INTROSPECTION_GIRDIR=
+    INTROSPECTION_TYPELIBDIR=
+    if test "x$found_introspection" = "xyes"; then
+       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
+       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
+       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
+       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
+       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
+       INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
+       INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
+       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
+    fi
+    AC_SUBST(INTROSPECTION_SCANNER)
+    AC_SUBST(INTROSPECTION_COMPILER)
+    AC_SUBST(INTROSPECTION_GENERATE)
+    AC_SUBST(INTROSPECTION_GIRDIR)
+    AC_SUBST(INTROSPECTION_TYPELIBDIR)
+    AC_SUBST(INTROSPECTION_CFLAGS)
+    AC_SUBST(INTROSPECTION_LIBS)
+    AC_SUBST(INTROSPECTION_MAKEFILE)
+
+    AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes")
+])
+
+
+dnl Usage:
+dnl   GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version])
+
+AC_DEFUN([GOBJECT_INTROSPECTION_CHECK],
+[
+  _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1])
+])
+
+dnl Usage:
+dnl   GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version])
+
+
+AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE],
+[
+  _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require])
+])



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]