diff options
Diffstat (limited to 'Makefile.introspection')
-rw-r--r-- | Makefile.introspection | 163 |
1 files changed, 163 insertions, 0 deletions
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,$<,$@) |