Update annotations from glib git
[platform/upstream/gobject-introspection.git] / Makefile.introspection
1 # -*- Mode: make -*-
2 # Copyright 2009-2010 Johan Dahlin
3 #
4 # This file is free software; the author(s) gives unlimited
5 # permission to copy and/or distribute it, with or without
6 # modifications, as long as this notice is preserved.
7 #
8 # * Input variables:
9 #
10 #   INTROSPECTION_GIRS - List of GIRS that should be generated
11 #   INTROSPECTION_SCANNER - Command to invoke scanner, normally set by
12 #      GOBJECT_INTROSPECTION_REQUIRE/CHECK() in introspection.m4
13 #   INTROSPECTION_SCANNER_ARGS - Additional args to pass in to the scanner
14 #   INTROSPECTION_SCANNER_ENV - Environment variables to set before running
15 #      the scanner
16 #   INTROSPECTION_COMPILER - Command to invoke compiler, normally set by
17 #      GOBJECT_INTROSPECTION_REQUIRE/CHECK() in introspection.m4
18 #   INTROSPECTION_COMPILER_ARGS - Additional args to pass in to the compiler
19 #
20 # * Simple tutorial
21 #
22 # Add this to configure.ac:
23 #   -Wno-portability to AM_INIT_AUTOMAKE
24 #   GOBJECT_INTROSPECTION_CHECK([0.6.7])
25 #
26 # Add this to Makefile.am where your library/program is built:
27 #   include $(INTROSPECTION_MAKEFILE)
28 #   INTROSPECTION_GIRS = YourLib-1.0.gir
29 #   YourLib-1.0.gir: libyourlib.la
30 #   YourLib_1_0_gir_NAMESPACE = YourLib
31 #   YourLib_1_0_gir_VERSION = 1.0
32 #   YourLib_1_0_gir_LIBS = libyourlib.la
33 #   YourLib_1_0_gir_FILES = $(libyourlib_1_0_SOURCES)
34 #   girdir = $(datadir)/gir-1.0
35 #   dist_gir_DATA = YourLib-1.0.gir
36 #   typelibdir = $(libdir)/girepository-1.0
37 #   typelib_DATA = YourLib-1.0.typelib
38 #   CLEANFILES = $(dist_gir_DATA) $(typelib_DATA)
39 #
40
41 # Make sure the required variables are set, these should under normal
42 # circumstances come from introspection.m4
43 $(if $(INTROSPECTION_SCANNER),,$(error Need to define INTROSPECTION_SCANNER))
44 $(if $(INTROSPECTION_COMPILER),,$(error Need to define INTROSPECTION_COMPILER))
45
46 # Private functions
47
48 ## Transform the gir filename to something which can reference through a variable
49 ## without automake/make complaining, eg Gtk-2.0.gir -> Gtk_2_0_gir
50 _gir_name = $(subst /,_,$(subst -,_,$(subst .,_,$(1))))
51
52 # Namespace and Version is either fetched from the gir filename
53 # or the _NAMESPACE/_VERSION variable combo
54 _gir_namespace = $(or $($(_gir_name)_NAMESPACE),$(firstword $(subst -, ,$(notdir $(1)))))
55 _gir_version = $(or $($(_gir_name)_VERSION),$(lastword $(subst -, ,$(1:.gir=))))
56
57 # _PROGRAM is an optional variable which needs it's own --program argument
58 _gir_program = $(if $($(_gir_name)_PROGRAM),--program=$($(_gir_name)_PROGRAM))
59
60 # Variables which provides a list of things
61 _gir_libraries = $(foreach lib,$($(_gir_name)_LIBS),--library=$(lib))
62 _gir_packages = $(foreach pkg,$($(_gir_name)_PACKAGES),--pkg=$(pkg))
63 _gir_includes = $(foreach include,$($(_gir_name)_INCLUDES),--include=$(include))
64 _gir_export_packages = $(foreach pkg,$($(_gir_name)_EXPORT_PACKAGES),--pkg-export=$(pkg))
65
66 # Reuse the LIBTOOL variable from automake if it's set, but
67 # work around MSYS weirdness: When running g-ir-scanner, MSYS changes
68 # a command-line argument --libtool="/bin/sh ../../libtool" into
69 # --libtool=c:/opt/msys/1.0/bin/libtool. So just use sh.exe without path
70 # because we already "know" where the libtool configure produced is.
71 _gir_libtool = $(if $(findstring MINGW32,$(shell uname -s)),--libtool="$(top_builddir)/libtool",$(if $(LIBTOOL),--libtool="$(LIBTOOL)"))
72
73 # Macros for AM_SILENT_RULES prettiness
74 _gir_verbosity = $(if $(AM_DEFAULT_VERBOSITY),$(AM_DEFAULT_VERBOSITY),1)
75
76 _gir_silent_scanner_prefix = $(_gir_silent_scanner_prefix_$(V))
77 _gir_silent_scanner_prefix_ = $(_gir_silent_scanner_prefix_$(_gir_verbosity))
78 _gir_silent_scanner_prefix_0 = @echo "  GISCAN $(1)";
79 _gir_silent_scanner_opts = $(_gir_silent_scanner_opts_$(V))
80 _gir_silent_scanner_opts_ = $(_gir_silent_scanner_opts_$(_gir_verbosity))
81 _gir_silent_scanner_opts_0 = --quiet
82
83 _gir_silent_compiler = $(_gir_silent_compiler_$(V))
84 _gir_silent_compiler_ = $(_gir_silent_compiler_$(_gir_verbosity))
85 _gir_silent_compiler_0 = @echo "  GICOMP $(1)";
86
87 #
88 # Creates a GIR by scanning C headers/sources
89 # $(1) - Name of the gir file (output)
90 #
91 # If output is Gtk-2.0.gir then you should name the variables like
92 # Gtk_2_0_gir_NAMESPACE, Gtk_2_0_gir_VERSION etc.
93 # Required variables:
94 # FILES - C sources and headers which should be scanned
95 #
96 # One of these variables are required:
97 # LIBS - Library where the symbol represented in the gir can be found
98 # PROGRAM - Program where the symbol represented in the gir can be found
99 #
100 # Optional variables
101 # NAMESPACE - Namespace of the gir, first letter capital,
102 #   rest should be lower case, for instance: 'Gtk', 'Clutter', 'ClutterGtk'.
103 #   If not present the namespace will be fetched from the gir filename,
104 #   the part before the first dash. For 'Gtk-2.0', namespace will be 'Gtk'.
105 # VERSION - Version of the gir, if not present, will be fetched from gir
106 # filename, the part after the first dash. For 'Gtk-2.0', version will be '2.0'.
107 # LIBTOOL - Command to invoke libtool, usually set by automake
108 # SCANNERFLAGS - Flags to pass in to the scanner, see g-ir-scanner(1) for a list
109 # CFLAGS - Flags to pass in to the parser when scanning headers
110 # LDFLAGS - Linker flags used by the scanner
111 # PACKAGES - list of pkg-config names which cflags are required to parse
112 #   the headers of this gir
113 # INCLUDES - Gir files to include without the .gir suffix, for instance
114 #   GLib-2.0, Gtk-2.0. This is needed for all libraries which you depend on that
115 #   provides introspection information.
116 # EXPORT_PACKAGES - list of pkg-config names that are provided by this gir.
117 #   By default the names in the PACKAGES variable will be used.
118 #
119
120 define introspection-scanner
121
122 # Basic sanity check, to make sure required variables are set
123 $(if $($(_gir_name)_FILES),,$(error Need to define $(_gir_name)_FILES))
124 $(if $(or $(findstring --header-only,$($(_gir_name)_SCANNERFLAGS)),
125           $($(_gir_name)_LIBS),
126           $($(_gir_name)_PROGRAM)),,
127     $(error Need to define $(_gir_name)_LIBS or $(_gir_name)_PROGRAM))
128
129 # Only dependencies we know are actually filenames goes into _FILES, make
130 # sure these are built before running the scanner. Libraries and programs
131 # needs to be added manually.
132 $(1): $$($(_gir_name)_FILES)
133         @ $(MKDIR_P) $(dir $(1))
134         $(_gir_silent_scanner_prefix) $(INTROSPECTION_SCANNER_ENV) $(INTROSPECTION_SCANNER) $(_gir_silent_scanner_opts) \
135         $(INTROSPECTION_SCANNER_ARGS) \
136           --namespace=$(_gir_namespace) \
137           --nsversion=$(_gir_version) \
138           $(_gir_libtool) \
139           $(_gir_packages) \
140           $(_gir_includes) \
141           $(_gir_export_packages) \
142           $(_gir_program) \
143           $(_gir_libraries) \
144           $($(_gir_name)_SCANNERFLAGS) \
145           $($(_gir_name)_CFLAGS) \
146           $($(_gir_name)_LDFLAGS) \
147           $$^ \
148           --output $(1)
149 endef
150
151 $(foreach gir,$(INTROSPECTION_GIRS),$(eval $(call introspection-scanner,$(gir))))
152
153 #
154 # Compiles a gir into a typelib
155 # $(1): gir filename (input)
156 # $(2): typelib filename (output)
157 #
158 define introspection-compiler
159 $(_gir_silent_compiler) $(INTROSPECTION_COMPILER) $(INTROSPECTION_COMPILER_ARGS) --includedir=. $(1) -o $(2)
160 endef
161
162 # Simple rule to compile a typelib.
163 %.typelib: %.gir
164         $(call introspection-compiler,$<,$@)