Makefile.glib 7.06 KB
Newer Older
1 2 3 4 5 6 7 8 9
#
# Work-in-progress...
# See https://bugzilla.gnome.org/show_bug.cgi?id=654395

_GLIB_CLEANFILES =
_GLIB_DISTCLEANFILES =

_GLIB_V_GEN = $(_glib_v_gen_$(V))
_glib_v_gen_ = $(_glib_v_gen_$(AM_DEFAULT_VERBOSITY))
Dan Winship's avatar
Dan Winship committed
10
_glib_v_gen_0 = @echo "  GEN     " $(subst .stamp,,$@);
11 12 13 14 15 16 17 18 19 20 21 22 23


### glib-genmarshal

_GLIB_MARSHAL_GENERATED = $(subst .h,,$(filter %marshal.h,$(GLIB_GENERATED)))

_glib_marshal_prefix = $(subst marshal,,$(subst _marshal,,$(subst -,_,$(notdir $(1)))))_marshal
_glib_marshal_sources_var = $(subst -,_,$(notdir $(1)))_sources
_glib_marshal_sources = $(filter-out %.h,$(filter-out $(GLIB_GENERATED),$($(_glib_marshal_sources_var))))

define _glib_make_genmarshal_rules
$(if $(_glib_marshal_sources),,$(error Need to define $(_glib_marshal_sources_var) for $(1).[ch]))

Dan Winship's avatar
Dan Winship committed
24 25
$(1).list.stamp: $(_glib_marshal_sources) Makefile
	$$(_GLIB_V_GEN) LC_ALL=C sed -ne 's/.*_$(_glib_marshal_prefix)_\([_A-Z]*\).*/\1/p' $$(filter-out Makefile, $$^) | sort -u | sed -e 's/__/:/' -e 's/_/,/g' > $(1).list.tmp && \
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
	(cmp -s $(1).list.tmp $(1).list || cp $(1).list.tmp $(1).list) && \
	rm -f $(1).list.tmp && \
	echo timestamp > $$@

$(1).list: $(1).list.stamp
	@true

$(1).h: $(1).list
	$$(_GLIB_V_GEN) $$(GLIB_GENMARSHAL) \
		--prefix=_$(_glib_marshal_prefix) --header \
		$$(GLIB_GENMARSHAL_H_FLAGS) \
		$$($(_glib_marshal_prefix)_GENMARSHAL_H_FLAGS) \
		$$< > $$@.tmp && \
	mv $$@.tmp $$@

$(1).c: $(1).list
	$$(_GLIB_V_GEN) (echo "#include \"$$(subst .c,.h,$$(@F))\""; $$(GLIB_GENMARSHAL) \
		--prefix=_$(_glib_marshal_prefix) --body \
		$$(GLIB_GENMARSHAL_C_FLAGS) \
		$$($(_glib_marshal_prefix)_GENMARSHAL_C_FLAGS) \
		$$< ) > $$@.tmp && \
	mv $$@.tmp $$@

_GLIB_CLEANFILES += $(1).list.stamp $(1).list
_GLIB_DISTCLEANFILES += $(1).h $(1).c
endef

$(foreach f,$(_GLIB_MARSHAL_GENERATED),$(eval $(call _glib_make_genmarshal_rules,$f)))


### glib-mkenums

_GLIB_ENUM_TYPES_GENERATED = $(subst .h,,$(filter %enum-types.h %enumtypes.h,$(GLIB_GENERATED)))

_glib_enum_types_prefix = $(subst -,_,$(notdir $(1)))
61
_glib_enum_types_guard = __$(shell LC_ALL=C echo $(_glib_enum_types_prefix) | tr 'a-z' 'A-Z')_H__
62 63 64 65 66 67 68
_glib_enum_types_sources_var = $(_glib_enum_types_prefix)_sources
_glib_enum_types_sources = $(filter-out $(GLIB_GENERATED),$($(_glib_enum_types_sources_var)))
_glib_enum_types_h_sources = $(filter %.h,$(_glib_enum_types_sources))

define _glib_make_mkenums_rules
$(if $(_glib_enum_types_sources),,$(error Need to define $(_glib_enum_types_sources_var) for $(1).[ch]))

Dan Winship's avatar
Dan Winship committed
69
$(1).h.stamp: $(_glib_enum_types_h_sources) Makefile
70 71 72 73 74 75 76
	$$(_GLIB_V_GEN) $$(GLIB_MKENUMS) \
		--fhead "/* Generated by glib-mkenums. Do not edit */\n\n#ifndef $(_glib_enum_types_guard)\n#define $(_glib_enum_types_guard)\n\n" \
		$$(GLIB_MKENUMS_H_FLAGS) \
		$$($(_glib_enum_types_prefix)_MKENUMS_H_FLAGS) \
		--fhead "#include <glib-object.h>\n\nG_BEGIN_DECLS\n" \
		--vhead "GType @enum_name@_get_type (void) G_GNUC_CONST;\n#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())\n" \
		--ftail "G_END_DECLS\n\n#endif /* $(_glib_enum_types_guard) */" \
Dan Winship's avatar
Dan Winship committed
77
		$$(filter-out Makefile, $$^) > $(1).h.tmp && \
78 79 80 81 82 83 84
	(cmp -s $(1).h.tmp $(1).h || cp $(1).h.tmp $(1).h) && \
	rm -f $(1).h.tmp && \
	echo timestamp > $$@

$(1).h: $(1).h.stamp
	@true

Dan Winship's avatar
Dan Winship committed
85
$(1).c.stamp: $(_glib_enum_types_h_sources) Makefile
86
	$$(_GLIB_V_GEN) $$(GLIB_MKENUMS) \
87
		--fhead "/* Generated by glib-mkenums. Do not edit */\n\n#include \"config.h\"\n\n#include \"$(notdir $(1)).h\"\n" \
88 89
		$$(GLIB_MKENUMS_C_FLAGS) \
		$$($(_glib_enum_types_prefix)_MKENUMS_C_FLAGS) \
Dan Winship's avatar
Dan Winship committed
90
		--fhead "$$(foreach f,$$(filter-out Makefile,$$(^F)),\n#include \"$$(f)\")\n\n" \
91 92 93
		--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" \
		--vprod "        { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" },\n" \
		--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" \
Dan Winship's avatar
Dan Winship committed
94
		$$(filter-out Makefile, $$^) > $(1).c.tmp && \
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
	(cmp -s $(1).c.tmp $(1).c || cp $(1).c.tmp $(1).c) && \
	rm -f $(1).c.tmp && \
	echo timestamp > $$@

$(1).c: $(1).c.stamp
	@true

_GLIB_CLEANFILES += $(1).h.stamp $(1).c.stamp
_GLIB_DISTCLEANFILES += $(1).h $(1).c $(1).h.stamp $(1).c.stamp
endef

$(foreach f,$(_GLIB_ENUM_TYPES_GENERATED),$(eval $(call _glib_make_mkenums_rules,$f)))


### glib-compile-schemas

_GLIB_ENUMS_XML_GENERATED = $(filter %.enums.xml,$(GLIB_GENERATED))
_GLIB_GSETTINGS_SCHEMA_FILES = $(filter %.gschema.xml,$(gsettingsschema_DATA))
_GLIB_GSETTINGS_VALID_FILES = $(subst .xml,.valid,$(_GLIB_GSETTINGS_SCHEMA_FILES))

_glib_enums_xml_prefix = $(subst .,_,$(notdir $(1)))
_glib_enums_xml_sources_var = $(_glib_enums_xml_prefix)_sources
_glib_enums_xml_sources = $(filter-out $(GLIB_GENERATED),$($(_glib_enums_xml_sources_var)))
_glib_enums_xml_namespace = $(subst .enums.xml,,$(notdir $(1)))

define _glib_make_enums_xml_rule
$(if $(_glib_enums_xml_sources),,$(error Need to define $(_glib_enums_xml_sources_var) for $(1)))

Dan Winship's avatar
Dan Winship committed
123 124
$(1): $(_glib_enums_xml_sources) Makefile
	$$(_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>" $$(filter-out Makefile, $$^) > $$@.tmp && mv $$@.tmp $$@
125 126 127 128
endef

_GLIB_V_CHECK = $(_glib_v_check_$(V))
_glib_v_check_ = $(_glib_v_check_$(AM_DEFAULT_VERBOSITY))
Dan Winship's avatar
Dan Winship committed
129
_glib_v_check_0 = @echo "  CHECK   " $(subst .valid,.xml,$@);
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168

define _glib_make_schema_validate_rule
$(subst .xml,.valid,$(1)): $(_GLIB_ENUMS_XML_GENERATED) $(1)
	$$(_GLIB_V_CHECK) $$(GLIB_COMPILE_SCHEMAS) --strict --dry-run $$(addprefix --schema-file=,$$^) && touch $$@
endef

define _glib_make_schema_rules
all-am: $(_GLIB_GSETTINGS_VALID_FILES)

install-data-am: glib-install-schemas-hook

glib-install-schemas-hook: install-gsettingsschemaDATA
	@test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || (echo $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir); $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir))

uninstall-am: glib-uninstall-schemas-hook

glib-uninstall-schemas-hook: uninstall-gsettingsschemaDATA
	@test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || (echo $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir); $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir))

.PHONY: glib-install-schemas-hook glib-uninstall-schemas-hook
endef

_GLIB_CLEANFILES += $(_GLIB_ENUMS_XML_GENERATED) $(_GLIB_GSETTINGS_VALID_FILES)

$(foreach f,$(_GLIB_ENUMS_XML_GENERATED),$(eval $(call _glib_make_enums_xml_rule,$f)))
$(foreach f,$(_GLIB_GSETTINGS_SCHEMA_FILES),$(eval $(call _glib_make_schema_validate_rule,$f)))
$(if $(_GLIB_GSETTINGS_SCHEMA_FILES),$(eval $(_glib_make_schema_rules)))


### Cleanup
.PHONY: clean-glib distclean-glib

clean-am: clean-glib
clean-glib:
	$(if $(strip $(_GLIB_CLEANFILES)),-rm -f $(_GLIB_CLEANFILES))

distclean-am: distclean-glib
distclean-glib:
	$(if $(strip $(_GLIB_DISTCLEANFILES)),-rm -f $(_GLIB_DISTCLEANFILES))