[glib/wip/danw/glib.mk: 2/3] glib.mk: Add enumtypes, marshal, schemas, and resources rules



commit 0deafa61fc07aa8cb8bfd7a46fe013a2d981714a
Author: Dan Winship <danw gnome org>
Date:   Fri May 27 14:11:22 2011 -0400

    glib.mk: Add enumtypes, marshal, schemas, and resources rules
    
    Add rules to glib.mk to generate enumtypes files, marshallers,
    gsettings schemas, and resource files, so that people don't have to
    copy and paste the rules into every project's Makefile.am
    
    https://bugzilla.gnome.org/show_bug.cgi?id=654395

 .gitignore                     |    1 +
 Makefile.am                    |    3 +
 configure.ac                   |   12 ++
 gio/Makefile.am                |   29 ++---
 gio/gioenumtypes.c.template    |   38 -----
 gio/gioenumtypes.h.template    |   24 ---
 gio/tests/.gitignore           |    2 +-
 gio/tests/Makefile.am          |   26 ++--
 glib-2.0.pc.in                 |    1 +
 glib.mk                        |  327 ++++++++++++++++++++++++++++++++++++++++
 m4macros/glib-2.0.m4           |   38 +++++
 tests/gobject/.gitignore       |    1 +
 tests/gobject/Makefile.am      |   41 +-----
 tests/gobject/accumulator.c    |    6 +-
 tests/gobject/testmarshal.list |    4 -
 15 files changed, 413 insertions(+), 140 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index f80afbc..bd545bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,6 +21,7 @@ TAGS
 *.test
 *.log
 *.trs
+*.stamp
 
 # autofoo stuff here
 compile
diff --git a/Makefile.am b/Makefile.am
index a156f85..e69b56d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -99,6 +99,9 @@ endif
 
 $(pkgconfig_DATA): config.status
 
+makedir = $(datadir)/glib-2.0
+dist_make_DATA = Makefile.glib
+
 # build documentation when doing distcheck
 DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-gtk-doc --enable-man --disable-maintainer-mode
 
diff --git a/configure.ac b/configure.ac
index dbe48ef..6ce6bc0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2704,8 +2704,20 @@ AS_IF([ test $cross_compiling = yes ], [
   if test x$GLIB_COMPILE_RESOURCES = xno; then
     AC_MSG_ERROR(Could not find a glib-compile-resources in your PATH)
   fi
+],[
+  GLIB_GENMARSHAL='$(top_builddir)/gobject/glib-genmarshal'
+  GLIB_COMPILE_SCHEMAS='$(top_builddir)/gio/glib-compile-schemas'
+  GLIB_COMPILE_RESOURCES='$(top_builddir)/gio/glib-compile-resources'
 ])
 
+dnl ************************************
+dnl *** Internal GLIB_MAKEFILE usage ***
+dnl ************************************
+GLIB_MAKEFILE='$(top_srcdir)/Makefile.glib'
+AC_SUBST(GLIB_MAKEFILE)
+GLIB_MKENUMS='$(top_builddir)/gobject/glib-mkenums'
+AC_SUBST(GLIB_MKENUMS)
+
 dnl **************************
 dnl *** Checks for gtk-doc ***
 dnl **************************
diff --git a/gio/Makefile.am b/gio/Makefile.am
index 33d5885..8bcf632 100644
--- a/gio/Makefile.am
+++ b/gio/Makefile.am
@@ -32,6 +32,8 @@ AM_CFLAGS = $(GLIB_WARN_CFLAGS)
 
 lib_LTLIBRARIES = libgio-2.0.la
 
+gioenumtypes_sources = $(gioinclude_HEADERS)
+
 gdbus_headers =                        \
        gdbusauthobserver.h             \
        gcredentials.h                  \
@@ -510,7 +512,8 @@ libgio_2_0_la_DEPENDENCIES = $(gio_win32_res) $(gio_def) $(platform_deps)
 gio-win32-res.o: gio.rc
        $(WINDRES) gio.rc $@
 
-gio_headers =                  \
+gioincludedir=$(includedir)/glib-2.0/gio/
+gioinclude_HEADERS =           \
        gappinfo.h              \
        gasyncinitable.h        \
        gasyncresult.h          \
@@ -549,6 +552,7 @@ gio_headers =                       \
        gio.h                   \
        giotypes.h              \
        gioenums.h              \
+       gioenumtypes.h          \
        gioerror.h              \
        giomodule.h             \
        gioscheduler.h          \
@@ -612,25 +616,22 @@ gio_headers =                     \
        $(gdbus_headers)        \
        $(NULL)
 
-gioincludedir=$(includedir)/glib-2.0/gio/
-gioinclude_HEADERS =           \
-       $(gio_headers)          \
-       gioenumtypes.h
-
 # these sources (also mentioned above) are generated.
 BUILT_SOURCES +=               \
        gconstructor_as_data.h  \
-       gioenumtypes.h          \
-       gioenumtypes.c          \
        gdbus-daemon-generated.c \
        gdbus-daemon-generated.h \
        gnetworking.h           \
+       $(GLIB_GENERATED)       \
        $(NULL)
 
+GLIB_GENERATED +=      \
+       gioenumtypes.h  \
+       gioenumtypes.c
+GLIB_MKENUMS_H_FLAGS = --vhead "GLIB_AVAILABLE_IN_ALL\n"
+
 EXTRA_DIST +=                  \
        data-to-c.pl            \
-       gioenumtypes.h.template \
-       gioenumtypes.c.template \
        makefile.msc            \
        gio.rc.in               \
        gschema.dtd             \
@@ -654,14 +655,6 @@ DISTCLEANFILES +=          \
 
 all-local: gio-public-headers.txt
 
-gioenumtypes.h: $(gio_headers) gioenumtypes.h.template
-       $(AM_V_GEN) $(top_builddir)/gobject/glib-mkenums --template $(filter %.template,$^) $(filter-out 
%.template,$^) > \
-           gioenumtypes.h.tmp && mv gioenumtypes.h.tmp gioenumtypes.h
-
-gioenumtypes.c: $(gio_headers) gioenumtypes.c.template
-       $(AM_V_GEN) $(top_builddir)/gobject/glib-mkenums --template $(filter %.template,$^) $(filter-out 
%.template,$^) > \
-           gioenumtypes.c.tmp && mv gioenumtypes.c.tmp gioenumtypes.c
-
 gio-2.0.lib: libgio-2.0.la gio.def
        lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgio-2.0-$(LT_CURRENT_MINUS_AGE).dll 
-def:$(builddir)/gio.def -out:$@
 
diff --git a/gio/tests/.gitignore b/gio/tests/.gitignore
index fd12e88..46b2a11 100644
--- a/gio/tests/.gitignore
+++ b/gio/tests/.gitignore
@@ -88,7 +88,6 @@ network-monitor
 org.gtk.test.enums.xml
 permission
 pollable
-plugin-resources.c
 proxy
 proxy-test
 readwrite
@@ -110,6 +109,7 @@ test.gresource
 test2-resources.c
 test3-resources.c
 test3-resources.h
+test4-resources.c
 tls-certificate
 tls-interaction
 unix-fd
diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am
index ca195c8..497c985 100644
--- a/gio/tests/Makefile.am
+++ b/gio/tests/Makefile.am
@@ -1,4 +1,5 @@
 include $(top_srcdir)/glib.mk
+BUILT_SOURCES += $(GLIB_GENERATED)
 dist_uninstalled_test_data =
 test_ltlibraries =
 
@@ -411,7 +412,7 @@ nodist_resources_SOURCES = test2-resources.c test3-resources.c test3-resources.h
 resources_DEPENDENCIES = test.gresource
 
 test_ltlibraries += libresourceplugin.la
-libresourceplugin_la_SOURCES = resourceplugin.c plugin-resources.c
+libresourceplugin_la_SOURCES = resourceplugin.c test4-resources.c
 libresourceplugin_la_LDFLAGS = -avoid-version -module -export-dynamic $(no_undefined)
 libresourceplugin_la_LIBADD = $(LDADD)
 
@@ -434,18 +435,13 @@ endif
 
 resources.o: test3-resources.h
 
-test2-resources.c: test2.gresource.xml Makefile $(shell $(glib_compile_resources) --sourcedir=$(srcdir) 
--generate-dependencies $(srcdir)/test2.gresource.xml)
-       $(AM_V_GEN) $(glib_compile_resources) --target=$@ --sourcedir=$(srcdir) --generate-source --c-name 
_g_test2 $<
+GLIB_GENERATED +=                      \
+       test.gresource                  \
+       test2-resources.c               \
+       test3-resources.c               \
+       test3-resources.h               \
+       test4-resources.c
 
-test3-resources.h test3-resources.c: test3.gresource.xml Makefile $(shell $(glib_compile_resources) 
--sourcedir=$(srcdir) --generate-dependencies $(srcdir)/test3.gresource.xml)
-       $(AM_V_GEN) $(glib_compile_resources) --target=$@ --sourcedir=$(srcdir) --generate --c-name _g_test2 
--manual-register $<
-
-plugin-resources.c: test4.gresource.xml Makefile $(shell $(glib_compile_resources) --sourcedir=$(srcdir) 
--generate-dependencies $(srcdir)/test4.gresource.xml)
-       $(AM_V_GEN) $(glib_compile_resources) --target=$@ --sourcedir=$(srcdir) --generate-source --c-name 
_g_plugin $<
-
-test.gresource: test.gresource.xml Makefile $(shell $(glib_compile_resources) --sourcedir=$(srcdir) 
--generate-dependencies $(srcdir)/test.gresource.xml)
-       $(AM_V_GEN) $(glib_compile_resources) --target=$@ --sourcedir=$(srcdir) $<
-
-EXTRA_DIST += test.gresource.xml test1.txt test2.gresource.xml test2.txt test3.gresource.xml test3.txt 
test4.gresource.xml
-
-CLEANFILES += test2-resources.c test3-resources.[ch] plugin-resources.c test.gresource
+test2_resources_COMPILE_RESOURCES_FLAGS = --c-name _g_test2
+test3_resources_COMPILE_RESOURCES_FLAGS = --c-name _g_test3
+test4_resources_COMPILE_RESOURCES_FLAGS = --c-name _g_plugin
diff --git a/glib-2.0.pc.in b/glib-2.0.pc.in
index 4a8898e..9a9ee41 100644
--- a/glib-2.0.pc.in
+++ b/glib-2.0.pc.in
@@ -6,6 +6,7 @@ includedir= includedir@
 glib_genmarshal=glib-genmarshal
 gobject_query=gobject-query
 glib_mkenums=glib-mkenums
+glib_makefile= datadir@/glib-2.0/Makefile.glib
 
 Name: GLib
 Description: C Utility Library
diff --git a/glib.mk b/glib.mk
index 75ac2c6..330cdea 100644
--- a/glib.mk
+++ b/glib.mk
@@ -14,6 +14,7 @@ DISTCLEANFILES =
 MAINTAINERCLEANFILES =
 EXTRA_DIST =
 TEST_PROGS =
+GLIB_GENERATED = 
 
 installed_test_LTLIBRARIES =
 installed_test_PROGRAMS =
@@ -223,3 +224,329 @@ installed_test_meta_DATA = $(installed_testcases:=.test)
 
 CLEANFILES += $(installed_test_meta_DATA)
 endif
+
+
+# This is like AM_V_GEN, except that it strips ".stamp" from its output
+_GLIB_V_GEN = $(_glib_v_gen_$(V))
+_glib_v_gen_ = $(_glib_v_gen_$(AM_DEFAULT_VERBOSITY))
+_glib_v_gen_0 = @echo "  GEN     " $(subst .stamp,,$@);
+
+
+# glib-mkenums support
+#
+# To generate enum type registrations, add files with names ending
+# in "-enum-types.[ch]" or "enumtypes.[ch]" to GLIB_GENERATED:
+#
+#    GLIB_GENERATED += foo-enum-types.h foo-enum-types.c
+#    foo_enum_types_sources = aaa.h bbb.h ccc.h ddd.h
+#
+# glib.mk will create a list all of the enum/flags types declared in
+# $(foo_enum_type_sources), and will rebuild
+# foo-enum-types.c/foo-enum-types.h whenever that list changes. (No
+# template files are required.)
+#
+# For your convenience, any .c files or $(GLIB_GENERATED) files in
+# $(foo_enum_types_sources) will be ignored. This means you can
+# usually set foo_enum_types_sources to the value of your
+# library/program's _HEADERS and/or _SOURCES variables, even if that
+# contains foo-enum-types.h.
+#
+# You can set GLIB_MKENUMS_H_FLAGS and GLIB_MKENUMS_C_FLAGS (or an
+# appropriate file-specific variable, eg
+# foo_enum_types_MKENUMS_H_FLAGS) to set/override glib-mkenums
+# options. In particular, you can do:
+#
+#     GLIB_MKENUMS_C_FLAGS = --fhead "\#define FOO_I_KNOW_THIS_IS_UNSTABLE"
+#
+# (The backslash is necessary to keep make from thinking the "#" is
+# the start of a comment.)
+
+
+# _GLIB_ENUM_TYPES_GENERATED contains the basenames (eg, "foo-enum-types")
+# of all the enum-type-related files to be generated.
+_GLIB_ENUM_TYPES_GENERATED = $(subst .h,,$(filter %enum-types.h %enumtypes.h,$(GLIB_GENERATED)))
+
+# These are used as macros (with the value of $(1) inherited from the "caller")
+#   _glib_enum_types_prefix("foo-enum-types") = "foo_enum_types"
+#   _glib_enum_types_guard("foo-enum-types") = "__FOO_ENUM_TYPES_H__"
+#   _glib_enum_types_sources_var("foo-enum_types") = "foo_enum_types_sources"
+#   _glib_enum_types_sources = the filtered value of $(foo_enum_types_sources_var)
+#   _glib_enum_types_h_sources = the .h files in $(foo_enum_types_sources)
+_glib_enum_types_prefix = $(subst -,_,$(notdir $(1)))
+_glib_enum_types_guard = __$(shell LC_ALL=C echo $(_glib_enum_types_prefix) | tr 'a-z' 'A-Z')_H__
+_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))
+
+# _glib_make_mkenums_rules is a multi-line macro that outputs a set of
+# rules for a single .h/.c pair (whose basename is $(1)). automake
+# doesn't recognize GNU make's define/endef syntax, so if we defined
+# the macro directly, it would try to, eg, add the literal
+# "$(1).h.stamp" to CLEANFILES. So we hide the macro by prefixing each
+# line with ":::", and then use $(subst) to extract the actual rule.
+
+# We have to include "Makefile" in the dependencies so that the
+# outputs get regenerated when you remove files from
+# foo_enum_types_sources as well. (This is especially important for
+# foo-enum-types.h, which might otherwise try to #include files that
+# no longer exist.).
+
+define _glib_make_mkenums_rules_hidden
+:::$(1).h.stamp: $(_glib_enum_types_h_sources) Makefile
+:::    $$(if $(_glib_enum_types_sources),,$$(error Need to define $(_glib_enum_types_sources_var) for 
$(1).[ch])) \
+:::    $$(_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) */" \
+:::            $$(filter-out Makefile, $$^) > $(1).h.tmp && \
+:::    (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
+:::
+:::$(1).c.stamp: $(_glib_enum_types_h_sources) Makefile
+:::    $$(_GLIB_V_GEN) $$(GLIB_MKENUMS) \
+:::            --fhead "/* Generated by glib-mkenums. Do not edit */\n\n#ifdef HAVE_CONFIG_H\n#include 
\"config.h\"\n#endif\n\n#include \"$(notdir $(1)).h\"\n" \
+:::            $$(GLIB_MKENUMS_C_FLAGS) \
+:::            $$($(_glib_enum_types_prefix)_MKENUMS_C_FLAGS) \
+:::            --fhead "$$(foreach f,$$(filter-out Makefile,$$(^F)),\n#include \"$$(f)\")\n\n" \
+:::            --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" \
+:::            $$(filter-out Makefile, $$^) > $(1).c.tmp && \
+:::    (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
+:::
+:::CLEANFILES += $(1).h.stamp $(1).c.stamp
+:::DISTCLEANFILES += $(1).h $(1).c $(1).h.stamp $(1).c.stamp
+endef
+_glib_make_mkenums_rules = $(subst :::,,$(_glib_make_mkenums_rules_hidden))
+
+# Run _glib_make_mkenums_rules for each set of generated files
+$(foreach f,$(_GLIB_ENUM_TYPES_GENERATED),$(eval $(call _glib_make_mkenums_rules,$f)))
+
+
+# glib-genmarshal support
+#
+# To generate signal marshallers, add files with names ending in
+# "marshal.h" and "marshal.c" to GLIB_GENERATED:
+#
+#    GLIB_GENERATED += foo-marshal.h foo-marshal.c
+#    foo_marshal_sources = aaa.c bbb.c ccc.c ddd.c
+#
+# glib.mk will then generate a foo-marshal.list file containing
+# all _foo_marshal_* functions referenced by $(foo_marshal_sources),
+# and will rebuild foo-marshal.c/foo-marshal.h whenever the list
+# changes.
+#
+# For your convenience, any .h files or $(GLIB_GENERATED) files in
+# $(foo_marshal_sources) will be ignored. This means you can usually just
+# set foo_marshal_sources to the value of your library/program's
+# _SOURCES variable, even if that variable contains foo-marshal.c.
+#
+# You can set GLIB_GENMARSHAL_H_FLAGS and GLIB_GENMARSHAL_C_FLAGS (or
+# an appropriate file-specific variable, eg
+# foo_marshal_GENMARSHAL_H_FLAGS) to set/override glib-genmarshal
+# options.
+
+# see the comments in the glib-mkenums section for details of how this all works
+_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_hidden
+:::$(1).list.stamp: $(_glib_marshal_sources) Makefile
+:::    $$(if $(_glib_marshal_sources),,$$(error Need to define $(_glib_marshal_sources_var) for $(1).[ch])) \
+:::    $$(_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 && \
+:::    (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 $$@
+:::
+:::CLEANFILES += $(1).list.stamp $(1).list
+:::DISTCLEANFILES += $(1).h $(1).c
+endef
+_glib_make_genmarshal_rules = $(subst :::,,$(_glib_make_genmarshal_rules_hidden))
+
+$(foreach f,$(_GLIB_MARSHAL_GENERATED),$(eval $(call _glib_make_genmarshal_rules,$f)))
+
+
+# glib-compile-schemas support
+#
+# Any foo.gschemas.xml files listed in gsettingsschema_DATA will be
+# validated before installation, and (if --disable-schemas-compile was
+# not passed) compiled after installation.
+#
+# To build an enums file, add it to GLIB_GENERATED (in addition to
+# gsettingsschema_DATA):
+#
+#     GLIB_GENERATED += org.gnome.foo.enums.xml
+#     org_gnome_foo_enums_xml_sources = aaa.h bbb.h ccc.h ddd.h
+#
+# All enums files will be built before any schema files are validated.
+
+# see the comments in the glib-mkenums section for details of how this all works
+_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_hidden
+:::$(1): $(_glib_enums_xml_sources) Makefile
+:::    $$(if $(_glib_enums_xml_sources),,$$(error Need to define $(_glib_enums_xml_sources_var) for $(1))) \
+:::    $$(_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 $$@
+endef
+_glib_make_enums_xml_rule = $(subst :::,,$(_glib_make_enums_xml_rule_hidden))
+
+_GLIB_V_CHECK = $(_glib_v_check_$(V))
+_glib_v_check_ = $(_glib_v_check_$(AM_DEFAULT_VERBOSITY))
+_glib_v_check_0 = @echo "  CHECK   " $(subst .valid,.xml,$@);
+
+define _glib_make_schema_validate_rule_hidden
+:::$(subst .xml,.valid,$(1)): $(_GLIB_ENUMS_XML_GENERATED) $(1)
+:::    $$(_GLIB_V_CHECK) $$(GLIB_COMPILE_SCHEMAS) --strict --dry-run $$(addprefix --schema-file=,$$^) && 
touch $$@
+endef
+_glib_make_schema_validate_rule = $(subst :::,,$(_glib_make_schema_validate_rule_hidden))
+
+define _glib_make_schema_rules_hidden
+:::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_make_schema_rules = $(subst :::,,$(_glib_make_schema_rules_hidden))
+
+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)))
+
+
+# glib-compile-resources support
+#
+# To compile resources, add files with names ending in
+# "resources.h" and "resources.c" to GLIB_GENERATED:
+#
+#    GLIB_GENERATED += foo-resources.h foo-resources.c
+#
+# glib.mk will then compile "foo.gresource.xml" into the named files,
+# creating a method foo_get_resource(). glib.mk will figure out the
+# resource's dependencies automatically, and add the dependency files
+# to EXTRA_DIST.
+#
+# If you specify both a .c and a .h file, glib.mk will compile the
+# resource with the --manual-register flag. If you specify only a .c
+# file, it will not.
+#
+# Alternatively, you can build a standalone resource file by doing:
+#
+#    GLIB_GENERATED += foo.gresource
+#
+# You can set GLIB_COMPILE_RESOURCES_FLAGS (or an appropriate
+# file-specific variable, eg foo_resources_COMPILE_RESOURCES_FLAGS or
+# foo_gresource_COMPILE_RESOURCES_FLAGS) to set/override
+# glib-compile-resources options.
+
+_GLIB_RESOURCES_CH_GENERATED = $(subst .h,,$(filter %resources.h,$(GLIB_GENERATED)))
+_GLIB_RESOURCES_C_GENERATED = $(filter-out $(_GLIB_RESOURCES_CH_GENERATED),$(subst .c,,$(filter 
%resources.c,$(GLIB_GENERATED))))
+
+_glib_resources_c_prefix = $(subst resources,,$(subst _resources,,$(subst -,_,$(notdir $(1)))))
+_glib_resources_c_xml = $(subst resources,,$(subst -resources,,$(1))).gresource.xml
+_glib_resources_c_sources = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --generate-dependencies 
$(_glib_resources_c_xml))
+
+define _glib_make_h_resources_rules_hidden
+:::$(1).h: $(_glib_resources_c_xml) $(_glib_resources_c_sources)
+:::    $$(_GLIB_V_GEN) $$(GLIB_COMPILE_RESOURCES) \
+:::            --target=$$@ --sourcedir="$(srcdir)" \
+:::            --generate-header $(2) \
+:::            --c-name $(_glib_resources_c_prefix) \
+:::            $$(GLIB_COMPILE_RESOURCES_FLAGS) \
+:::            $$($(_glib_resources_c_prefix)_resources_COMPILE_RESOURCES_FLAGS) \
+:::            $$<
+:::
+:::DISTCLEANFILES += $(1).h
+endef
+_glib_make_h_resources_rules = $(subst :::,,$(_glib_make_h_resources_rules_hidden))
+
+define _glib_make_c_resources_rules_hidden
+:::$(1).c: $(_glib_resources_c_xml) $(_glib_resources_c_sources)
+:::    $$(_GLIB_V_GEN) $$(GLIB_COMPILE_RESOURCES) \
+:::            --target=$$@ --sourcedir="$(srcdir)" \
+:::            --generate-source $(2) \
+:::            --c-name $(_glib_resources_c_prefix) \
+:::            $$(GLIB_COMPILE_RESOURCES_FLAGS) \
+:::            $$($(_glib_resources_c_prefix)_resources_COMPILE_RESOURCES_FLAGS) \
+:::            $$<
+:::
+:::DISTCLEANFILES += $(1).c
+:::EXTRA_DIST += $(_glib_resources_c_xml) $(_glib_resources_c_sources)
+endef
+_glib_make_c_resources_rules = $(subst :::,,$(_glib_make_c_resources_rules_hidden))
+
+$(foreach f,$(_GLIB_RESOURCES_CH_GENERATED),$(eval $(call 
_glib_make_h_resources_rules,$f,--manual-register)))
+$(foreach f,$(_GLIB_RESOURCES_CH_GENERATED),$(eval $(call 
_glib_make_c_resources_rules,$f,--manual-register)))
+$(foreach f,$(_GLIB_RESOURCES_C_GENERATED),$(eval $(call _glib_make_c_resources_rules,$f,)))
+
+_GLIB_RESOURCES_STANDALONE_GENERATED = $(subst .gresource,,$(filter %.gresource,$(GLIB_GENERATED)))
+
+_glib_resources_standalone_prefix = $(subst -,_,$(notdir $(1)))
+_glib_resources_standalone_xml = $(1).gresource.xml
+_glib_resources_standalone_sources = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) 
--generate-dependencies $(_glib_resources_standalone_xml))
+
+define _glib_make_standalone_resources_rules_hidden
+:::$(1).gresource: $(_glib_resources_standalone_xml) $(_glib_resources_standalone_sources)
+:::    $$(_GLIB_V_GEN) $$(GLIB_COMPILE_RESOURCES) \
+:::            --target=$$@ --sourcedir="$(srcdir)" \
+:::            $$(GLIB_COMPILE_RESOURCES_FLAGS) \
+:::            $$($(_glib_resources_standalone_prefix)_COMPILE_RESOURCES_FLAGS) \
+:::            $$<
+:::
+:::CLEANFILES += $(1).gresource
+:::EXTRA_DIST += $(_glib_resources_standalone_xml) $(_glib_resources_standalone_sources)
+endef
+_glib_make_standalone_resources_rules = $(subst :::,,$(_glib_make_standalone_resources_rules_hidden))
+
+$(foreach f,$(_GLIB_RESOURCES_STANDALONE_GENERATED),$(eval $(call _glib_make_standalone_resources_rules,$f)))
diff --git a/m4macros/glib-2.0.m4 b/m4macros/glib-2.0.m4
index 0507b76..d5c08a7 100644
--- a/m4macros/glib-2.0.m4
+++ b/m4macros/glib-2.0.m4
@@ -1,6 +1,44 @@
 # Configure paths for GLIB
 # Owen Taylor     1997-2001
 
+dnl GLIB_CONFIG([MODULES [, MIN-VERSION [, MAX-VERSION]]])
+dnl Test for GLIB (and error out if it's not available). Define
+dnl GLIB_CFLAGS and GLIB_LIBS, GLIB_MAKEFILE, and variables for
+dnl various glib developer tools (eg, GLIB_GENMARSHAL). If
+dnl gmodule, gobject, or gio is specified in MODULES, pass to
+dnl pkg-config. If MIN-VERSION is set, it will be passed to
+dnl pkg-config, and also used to set GLIB_VERSION_MIN_REQUIRED.
+dnl If MAX-VERSION is set, it will be used to set
+dnl GLIB_VERSION_MAX_ALLOWED.
+dnl
+AC_DEFUN([GLIB_CONFIG],
+[dnl
+  glib_config_modules="$1"
+  glib_config_min_version=ifelse([$2], ,2.35.5,$2)
+  glib_config_max_version="$3"
+
+  AM_PATH_GLIB_2_0([$glib_config_min_version], , [AC_MSG_ERROR([GLIB not found])], [$glib_config_modules])
+
+  if test -n "$glib_config_min_version"; then
+    GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MIN_REQUIRED=`echo $glib_config_min_version | sed -e 
's/\([[0-9]]*\)\.\([[0-9]]*\).*/GLIB_VERSION_\1_\2/'`"
+  fi
+  if test -n "$glib_config_max_version"; then
+    GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MAX_ALLOWED=`echo $glib_config_max_version | sed -e 
's/\([[0-9]]*\)\.\([[0-9]]*\).*/GLIB_VERSION_\1_\2/'`"
+  fi
+
+  GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
+  GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
+  GLIB_MAKEFILE=`$PKG_CONFIG --variable=glib_makefile glib-2.0`
+  GLIB_COMPILE_RESOURCES=glib-compile-resources
+
+  AC_SUBST(GLIB_GENMARSHAL)
+  AC_SUBST(GLIB_MKENUMS)
+  AC_SUBST(GLIB_MAKEFILE)
+  AC_SUBST(GLIB_COMPILE_RESOURCES)
+
+  GLIB_GSETTINGS
+])
+
 dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
 dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject,
 dnl gthread, or gio is specified in MODULES, pass to pkg-config
diff --git a/tests/gobject/.gitignore b/tests/gobject/.gitignore
index 96ea26a..2df2a8e 100644
--- a/tests/gobject/.gitignore
+++ b/tests/gobject/.gitignore
@@ -12,3 +12,4 @@ performance
 performance-threaded
 references
 singleton
+testmarshal.list
diff --git a/tests/gobject/Makefile.am b/tests/gobject/Makefile.am
index 152637b..6c64570 100644
--- a/tests/gobject/Makefile.am
+++ b/tests/gobject/Makefile.am
@@ -46,42 +46,9 @@ if ENABLE_TIMELOOP
 installed_test_programs += timeloop-closure
 endif
 
-if CROSS_COMPILING
-  glib_genmarshal=$(GLIB_GENMARSHAL)
-else
-  glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal
-endif
-
-testmarshal.h: stamp-testmarshal.h
-       @true
-stamp-testmarshal.h: @REBUILD@ testmarshal.list $(glib_genmarshal)
-       $(AM_V_GEN) $(glib_genmarshal) --prefix=test_marshal $(srcdir)/testmarshal.list --header >> xgen-gmh \
-       && (cmp -s xgen-gmh testmarshal.h 2>/dev/null || cp xgen-gmh testmarshal.h) \
-       && rm -f xgen-gmh xgen-gmh~ \
-       && echo timestamp > $@
-testmarshal.c: @REBUILD@ testmarshal.h testmarshal.list $(glib_genmarshal)
-       $(AM_V_GEN) (echo "#include \"testmarshal.h\""; $(glib_genmarshal) --prefix=test_marshal 
$(srcdir)/testmarshal.list --body) >> xgen-gmc \
-       && cp xgen-gmc testmarshal.c \
-       && rm -f xgen-gmc xgen-gmc~
-
-BUILT_SOURCES += testmarshal.h testmarshal.c
-CLEANFILES += stamp-testmarshal.h
+GLIB_GENERATED += testmarshal.h testmarshal.c
+BUILT_SOURCES += $(GLIB_GENERATED)
+testmarshal_sources = $(accumulator_SOURCES) $(defaultiface_SOURCES) $(dynamictype_SOURCES)
 
 EXTRA_DIST += \
-       testcommon.h                            \
-       testmarshal.list
-
-BUILT_EXTRA_DIST += \
-       testmarshal.h                           \
-       testmarshal.c
-
-dist-hook: $(BUILT_EXTRA_DIST)
-       files='$(BUILT_EXTRA_DIST)';                            \
-       for f in $$files; do                                    \
-         if test -f $$f; then d=.; else d=$(srcdir); fi;       \
-         cp $$d/$$f $(distdir) || exit 1; done
-
-distclean-local:
-       if test $(srcdir) = .; then :; else     \
-           rm -f $(BUILT_EXTRA_DIST);          \
-       fi
+       testcommon.h
diff --git a/tests/gobject/accumulator.c b/tests/gobject/accumulator.c
index f8a6c12..905cc50 100644
--- a/tests/gobject/accumulator.c
+++ b/tests/gobject/accumulator.c
@@ -227,21 +227,21 @@ test_object_class_init (TestObjectClass *class)
                G_SIGNAL_RUN_LAST,
                G_STRUCT_OFFSET (TestObjectClass, test_signal1),
                test_signal1_accumulator, NULL,
-               test_marshal_STRING__INT,
+               _test_marshal_STRING__INT,
                G_TYPE_STRING, 1, G_TYPE_INT);
   g_signal_new ("test-signal2",
                G_OBJECT_CLASS_TYPE (class),
                G_SIGNAL_RUN_LAST,
                G_STRUCT_OFFSET (TestObjectClass, test_signal2),
                g_signal_accumulator_true_handled, NULL,
-               test_marshal_BOOLEAN__INT,
+               _test_marshal_BOOLEAN__INT,
                G_TYPE_BOOLEAN, 1, G_TYPE_INT);
   g_signal_new ("test-signal3",
                G_OBJECT_CLASS_TYPE (class),
                G_SIGNAL_RUN_LAST,
                G_STRUCT_OFFSET (TestObjectClass, test_signal3),
                test_signal3_accumulator, NULL,
-               test_marshal_VARIANT__POINTER,
+               _test_marshal_VARIANT__POINTER,
                G_TYPE_VARIANT, 1, G_TYPE_POINTER);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]