2.41.90
[platform/upstream/libsoup.git] / Makefile.glib
1 # -*- Mode: makefile -*-
2 #
3 # To use:
4 #
5 # In configure.ac:
6 #   add -Wno-portability to AM_INIT_AUTOMAKE
7 #   add GLIB_CONFIG([min-version[, required-modules]])
8 #   (remove AM_PATH_GLIB_2_0 and GLIB_GSETTINGS)
9 #
10 # Add to Makefile.am where your library/program is built:
11 #   include $(GLIB_MAKEFILE)
12 #
13 #   BUILT_SOURCES = $(GLIB_GENERATED)
14 #
15 # Add *.stamp to .gitignore
16 #
17 # Add a GLIB_GENERATED variable with the files you want to generate,
18 # as described below. (The examples below use filenames with hyphens,
19 # eg foo-marshal.h, but you can omit the hyphens if that matches your
20 # file naming scheme better.)
21 #
22 # You do not need to modify CLEANFILES or EXTRA_DIST for any of these
23 # macros.
24
25
26 # glib-genmarshal
27 #
28 # To generate signal marshallers, add files with names ending in
29 # "marshal.h" and "marshal.c" to GLIB_GENERATED:
30 #
31 #    GLIB_GENERATED += foo-marshal.h foo-marshal.c
32 #    foo_marshal_sources = aaa.c bbb.c ccc.c ddd.c
33 #
34 # Makefile.glib will then generate a foo-marshal.list file containing
35 # all _foo_marshal_* functions referenced by $(foo_marshal_sources),
36 # and will rebuild foo-marshal.c/foo-marshal.h whenever the list
37 # changes.
38 #
39 # For your convenience, any .h files or $(GLIB_GENERATED) files in
40 # $(foo_marshal_sources) will be ignored. This means you can usually just
41 # set foo_marshal_sources to the value of your library/program's
42 # _SOURCES variable, even if that variable contains foo-marshal.c.
43 #
44 # You can set GLIB_GENMARSHAL_H_FLAGS and GLIB_GENMARSHAL_C_FLAGS (or
45 # an appropriate file-specific variable, eg
46 # foo_marshal_GENMARSHAL_H_FLAGS) to set/override glib-genmarshal
47 # options.
48
49
50 # glib-mkenums
51 #
52 # To generate enum type registrations, add files with names ending
53 # in "-enum-types.[ch]" or "enumtypes.[ch]" to GLIB_GENERATED:
54 #
55 #    GLIB_GENERATED += foo-enum-types.h foo-enum-types.c
56 #    foo_enum_types_sources = aaa.h bbb.h ccc.h ddd.h
57 #
58 # Makefile.glib will create a list all of the enum/flags types
59 # declared in $(foo_enum_type_sources), and will rebuild
60 # foo-enum-types.c/foo-enum-types.h whenever that list changes. (No
61 # template files are required.)
62 #
63 # For your convenience, any .c files or $(GLIB_GENERATED) files in
64 # $(foo_enum_types_sources) will be ignored. This means you can
65 # usually set foo_enum_types_sources to the value of your
66 # library/program's _HEADERS and/or _SOURCES variables, even if that
67 # contains foo-enum-types.h.
68 #
69 # You can set GLIB_MKENUMS_H_FLAGS and GLIB_MKENUMS_C_FLAGS (or an
70 # appropriate file-specific variable, eg
71 # foo_enum_types_MKENUMS_H_FLAGS) to set/override glib-mkenums
72 # options. In particular, you can do:
73 #
74 #     GLIB_MKENUMS_C_FLAGS = --fhead "\#define FOO_I_KNOW_THIS_IS_UNSTABLE"
75 #
76 # (The backslash is necessary to keep make from thinking the "#" is
77 # the start of a comment.)
78
79
80 # glib-compile-schemas
81 #
82 # Any foo.gschemas.xml files listed in gsettingsschema_DATA will be
83 # validated before installation, and (if --disable-schemas-compile was
84 # not passed) compiled after installation.
85 #
86 # To build an enums file, add it to GLIB_GENERATED (in addition to
87 # gsettingsschema_DATA):
88 #
89 #     GLIB_GENERATED += org.gnome.foo.enums.xml
90 #     org_gnome_foo_enums_xml_sources = aaa.h bbb.h ccc.h ddd.h
91 #
92 # All enums files will be built before any schema files are validated.
93
94
95 ########
96
97 # Notes on Makefile.glib hacking:
98 #
99 #   - The exact rules that automake generates for a Makefile vary
100 #     depending on what sorts of things were done in the Makefile.am,
101 #     so we have to be careful with what rules we assume are there.
102 #     In particular, (a) the glue to handle BUILT_SOURCES and the
103 #     various hooks won't be output unless those things were
104 #     referenced in the Makefile.am, and (b) a Makefile.am with
105 #     SUBDIRS will get different rules than one without.
106 #
107 #   - Build rules should always refer to their dependencies via $^,
108 #     not by reusing a variable that is listed in the rule's
109 #     dependencies. This is needed to make srcdir!=builddir builds
110 #     work. You can use $(filter)/$(filter-out) if $^ has things
111 #     you don't want in it.
112 #
113 #   - When using a filename as something other than a filename,
114 #     consider whether you need to wrap it in $(notdir) to get the
115 #     right result when that file is being pulled out of a
116 #     subdirectory.
117 #
118 #   - All private variables should be prefixed with _glib or _GLIB
119 #
120 #   - "make -qp > makefile.out" will give you a copy of the
121 #     Makefile after all macros are expanded.
122 #
123 # The genmarshal code is commented; the mkenums and schema code is
124 # generally similar.
125
126 _GLIB_CLEANFILES =
127 _GLIB_DISTCLEANFILES =
128
129 _GLIB_V_GEN = $(_glib_v_gen_$(V))
130 _glib_v_gen_ = $(_glib_v_gen_$(AM_DEFAULT_VERBOSITY))
131 _glib_v_gen_0 = @echo "  GEN   " $(subst .stamp,,$@);
132
133
134 ### glib-genmarshal
135
136 # _GLIB_MARSHAL_GENERATED contains the basenames (eg, "foo-marshal")
137 # of all the marshal-related files to be generated.
138 _GLIB_MARSHAL_GENERATED = $(subst .h,,$(filter %marshal.h,$(GLIB_GENERATED)))
139
140 # These are used as macros (with the value of $(1) inherited from the "caller")
141 #   _glib_marshal_prefix("foo-marshal") = "foo" (used in the C marshal names)
142 #   _glib_marshal_sources_var("foo-marshal") = "foo_marshal_sources"
143 #   _glib_marshal_sources = the filtered value of $(foo_marshal_sources)
144 _glib_marshal_prefix = $(subst marshal,,$(subst _marshal,,$(subst -,_,$(notdir $(1)))))_marshal
145 _glib_marshal_sources_var = $(subst -,_,$(notdir $(1)))_sources
146 _glib_marshal_sources = $(filter-out %.h,$(filter-out $(GLIB_GENERATED),$($(_glib_marshal_sources_var))))
147
148 # This is a multi-line macro (ending with the "endef" below) that
149 # outputs a set of rules for a single .h/.c pair (whose basename is
150 # $(1)). The initial $(if) line makes make error out if
151 # foo_marshal_sources wasn't set. Note that single-$ variables are
152 # expanded when the macro is called, and double-$ variables are
153 # expanded when the rule is invoked.
154 define _glib_make_genmarshal_rules
155 $(if $(_glib_marshal_sources),,$(error Need to define $(_glib_marshal_sources_var) for $(1).[ch]))
156
157 $(1).list.stamp: $(_glib_marshal_sources)
158         $$(_GLIB_V_GEN) LC_ALL=C sed -ne 's/.*_$(_glib_marshal_prefix)_\([_A-Z0-9]*\).*/\1/p' $$^ | sort -u | sed -e 's/__/:/' -e 's/_/,/g' > $(1).list.tmp && \
159         (cmp -s $(1).list.tmp $(1).list || cp $(1).list.tmp $(1).list) && \
160         rm -f $(1).list.tmp && \
161         echo timestamp > $$@
162
163 $(1).list: $(1).list.stamp
164         @true
165
166 $(1).h: $(1).list
167         $$(_GLIB_V_GEN) $$(GLIB_GENMARSHAL) \
168                 --prefix=_$(_glib_marshal_prefix) --header \
169                 $$(GLIB_GENMARSHAL_H_FLAGS) \
170                 $$($(_glib_marshal_prefix)_GENMARSHAL_H_FLAGS) \
171                 $$< > $$@.tmp && \
172         mv $$@.tmp $$@
173
174 $(1).c: $(1).list
175         $$(_GLIB_V_GEN) (echo "#include \"$$(subst .c,.h,$$(@F))\""; $$(GLIB_GENMARSHAL) \
176                 --prefix=_$(_glib_marshal_prefix) --body \
177                 $$(GLIB_GENMARSHAL_C_FLAGS) \
178                 $$($(_glib_marshal_prefix)_GENMARSHAL_C_FLAGS) \
179                 $$< ) > $$@.tmp && \
180         mv $$@.tmp $$@
181
182 _GLIB_CLEANFILES += $(1).list.stamp $(1).list
183 _GLIB_DISTCLEANFILES += $(1).h $(1).c
184 endef
185
186 # Run _glib_make_genmarshal_rules for each set of generated files
187 $(foreach f,$(_GLIB_MARSHAL_GENERATED),$(eval $(call _glib_make_genmarshal_rules,$f)))
188
189
190 ### glib-mkenums
191
192 _GLIB_ENUM_TYPES_GENERATED = $(subst .h,,$(filter %enum-types.h %enumtypes.h,$(GLIB_GENERATED)))
193
194 _glib_enum_types_prefix = $(subst -,_,$(notdir $(1)))
195 _glib_enum_types_guard = __$(shell LC_ALL=C echo $(_glib_enum_types_prefix) | tr 'a-z' 'A-Z')_H__
196 _glib_enum_types_sources_var = $(_glib_enum_types_prefix)_sources
197 _glib_enum_types_sources = $(filter-out $(GLIB_GENERATED),$($(_glib_enum_types_sources_var)))
198 _glib_enum_types_h_sources = $(filter %.h,$(_glib_enum_types_sources))
199
200 define _glib_make_mkenums_rules
201 $(if $(_glib_enum_types_sources),,$(error Need to define $(_glib_enum_types_sources_var) for $(1).[ch]))
202
203 $(1).h.stamp: $(_glib_enum_types_h_sources)
204         $$(_GLIB_V_GEN) $$(GLIB_MKENUMS) \
205                 --fhead "/* Generated by glib-mkenums. Do not edit */\n\n#ifndef $(_glib_enum_types_guard)\n#define $(_glib_enum_types_guard)\n\n" \
206                 $$(GLIB_MKENUMS_H_FLAGS) \
207                 $$($(_glib_enum_types_prefix)_MKENUMS_H_FLAGS) \
208                 --fhead "#include <glib-object.h>\n\nG_BEGIN_DECLS\n" \
209                 --vhead "GType @enum_name@_get_type (void) G_GNUC_CONST;\n#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())\n" \
210                 --ftail "G_END_DECLS\n\n#endif /* $(_glib_enum_types_guard) */" \
211                 $$^ > $(1).h.tmp && \
212         (cmp -s $(1).h.tmp $(1).h || cp $(1).h.tmp $(1).h) && \
213         rm -f $(1).h.tmp && \
214         echo timestamp > $$@
215
216 $(1).h: $(1).h.stamp
217         @true
218
219 $(1).c.stamp: $(_glib_enum_types_h_sources)
220         $$(_GLIB_V_GEN) $$(GLIB_MKENUMS) \
221                 --fhead "/* Generated by glib-mkenums. Do not edit */\n\n#include \"$(notdir $(1)).h\"\n" \
222                 $$(GLIB_MKENUMS_C_FLAGS) \
223                 $$($(_glib_enum_types_prefix)_MKENUMS_C_FLAGS) \
224                 --fhead "$$(foreach f,$$(^F),\n#include \"$$(f)\")\n\n" \
225                 --vhead "GType\n@enum_name@_get_type (void)\n{\n  static volatile gsize g_define_type_id__volatile = 0;\n\n  if (g_once_init_enter (&g_define_type_id__volatile))\n    {\n      static const G@Type@Value values[] = {\n" \
226                 --vprod "        { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" },\n" \
227                 --vtail "        { 0, NULL, NULL }\n      };\n      GType g_define_type_id =\n        g_@type@_register_static (g_intern_static_string (\"@EnumName@\"), values);\n      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);\n    }\n\n  return g_define_type_id__volatile;\n}\n" \
228                 $$^ > $(1).c.tmp && \
229         (cmp -s $(1).c.tmp $(1).c || cp $(1).c.tmp $(1).c) && \
230         rm -f $(1).c.tmp && \
231         echo timestamp > $$@
232
233 $(1).c: $(1).c.stamp
234         @true
235
236 _GLIB_CLEANFILES += $(1).h.stamp $(1).c.stamp
237 _GLIB_DISTCLEANFILES += $(1).h $(1).c $(1).h.stamp $(1).c.stamp
238 endef
239
240 $(foreach f,$(_GLIB_ENUM_TYPES_GENERATED),$(eval $(call _glib_make_mkenums_rules,$f)))
241
242
243 ### glib-compile-schemas
244
245 _GLIB_ENUMS_XML_GENERATED = $(filter %.enums.xml,$(GLIB_GENERATED))
246 _GLIB_GSETTINGS_SCHEMA_FILES = $(filter %.gschema.xml,$(gsettingsschema_DATA))
247 _GLIB_GSETTINGS_VALID_FILES = $(subst .xml,.valid,$(_GLIB_GSETTINGS_SCHEMA_FILES))
248
249 _glib_enums_xml_prefix = $(subst .,_,$(notdir $(1)))
250 _glib_enums_xml_sources_var = $(_glib_enums_xml_prefix)_sources
251 _glib_enums_xml_sources = $(filter-out $(GLIB_GENERATED),$($(_glib_enums_xml_sources_var)))
252 _glib_enums_xml_namespace = $(subst .enums.xml,,$(notdir $(1)))
253
254 define _glib_make_enums_xml_rule
255 $(if $(_glib_enums_xml_sources),,$(error Need to define $(_glib_enums_xml_sources_var) for $(1)))
256
257 $(1): $(_glib_enums_xml_sources)
258         $$(_GLIB_V_GEN) $$(GLIB_MKENUMS) --comments '<!-- @comment@ -->' --fhead "<schemalist>" --vhead "  <@type@ id='$(_glib_enums_xml_namespace).@EnumName@'>" --vprod "    <value nick='@valuenick@' value='@valuenum@'/>" --vtail "  </@type@>" --ftail "</schemalist>" $$^ > $$@.tmp && mv $$@.tmp $$@
259 endef
260
261 _GLIB_V_CHECK = $(_glib_v_check_$(V))
262 _glib_v_check_ = $(_glib_v_check_$(AM_DEFAULT_VERBOSITY))
263 _glib_v_check_0 = @echo "  CHECK " $(subst .valid,.xml,$@);
264
265 define _glib_make_schema_validate_rule
266 $(subst .xml,.valid,$(1)): $(_GLIB_ENUMS_XML_GENERATED) $(1)
267         $$(_GLIB_V_CHECK) $$(GLIB_COMPILE_SCHEMAS) --strict --dry-run $$(addprefix --schema-file=,$$^) && touch $$@
268 endef
269
270 define _glib_make_schema_rules
271 all-am: $(_GLIB_GSETTINGS_VALID_FILES)
272
273 install-data-am: glib-install-schemas-hook
274
275 glib-install-schemas-hook: install-gsettingsschemaDATA
276         @test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || (echo $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir); $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir))
277
278 uninstall-am: glib-uninstall-schemas-hook
279
280 glib-uninstall-schemas-hook: uninstall-gsettingsschemaDATA
281         @test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || (echo $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir); $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir))
282
283 .PHONY: glib-install-schemas-hook glib-uninstall-schemas-hook
284 endef
285
286 _GLIB_CLEANFILES += $(_GLIB_ENUMS_XML_GENERATED) $(_GLIB_GSETTINGS_VALID_FILES)
287
288 $(foreach f,$(_GLIB_ENUMS_XML_GENERATED),$(eval $(call _glib_make_enums_xml_rule,$f)))
289 $(foreach f,$(_GLIB_GSETTINGS_SCHEMA_FILES),$(eval $(call _glib_make_schema_validate_rule,$f)))
290 $(if $(_GLIB_GSETTINGS_SCHEMA_FILES),$(eval $(_glib_make_schema_rules)))
291
292
293 ### Cleanup
294 .PHONY: clean-glib distclean-glib
295
296 clean-am: clean-glib
297 clean-glib:
298         $(if $(strip $(_GLIB_CLEANFILES)),-rm -f $(_GLIB_CLEANFILES))
299
300 distclean-am: distclean-glib
301 distclean-glib:
302         $(if $(strip $(_GLIB_DISTCLEANFILES)),-rm -f $(_GLIB_DISTCLEANFILES))