Makefile.glib 7.08 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
# -*- Mode: makefile -*-
#
# 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
11
_glib_v_gen_0 = @echo "  GEN     " $(subst .stamp,,$@);
12 13 14 15 16 17 18 19 20 21 22 23 24


### 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
25 26
$(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 && \
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 61
	(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)))
62
_glib_enum_types_guard = __$(shell LC_ALL=C echo $(_glib_enum_types_prefix) | tr 'a-z' 'A-Z')_H__
63 64 65 66 67 68 69
_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
70
$(1).h.stamp: $(_glib_enum_types_h_sources) Makefile
71 72 73 74 75 76 77
	$$(_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
78
		$$(filter-out Makefile, $$^) > $(1).h.tmp && \
79 80 81 82 83 84 85
	(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
86
$(1).c.stamp: $(_glib_enum_types_h_sources) Makefile
87
	$$(_GLIB_V_GEN) $$(GLIB_MKENUMS) \
88
		--fhead "/* Generated by glib-mkenums. Do not edit */\n\n#include \"config.h\"\n\n#include \"$(notdir $(1)).h\"\n" \
89 90
		$$(GLIB_MKENUMS_C_FLAGS) \
		$$($(_glib_enum_types_prefix)_MKENUMS_C_FLAGS) \
Dan Winship's avatar
Dan Winship committed
91
		--fhead "$$(foreach f,$$(filter-out Makefile,$$(^F)),\n#include \"$$(f)\")\n\n" \
92 93 94
		--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
95
		$$(filter-out Makefile, $$^) > $(1).c.tmp && \
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 123
	(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
124 125
$(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 $$@
126 127 128 129
endef

_GLIB_V_CHECK = $(_glib_v_check_$(V))
_glib_v_check_ = $(_glib_v_check_$(AM_DEFAULT_VERBOSITY))
Dan Winship's avatar
Dan Winship committed
130
_glib_v_check_0 = @echo "  CHECK   " $(subst .valid,.xml,$@);
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 169

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))