# GObject - GLib Type, Object, Parameter and Signal Library
# Copyright (C) 1997,98,99,2000 Tim Janik and Red Hat, Inc.
#
## Process this file with automake to produce Makefile.in

INCLUDES = @STRIP_BEGIN@ \
	-DG_LOG_DOMAIN=\"GLib-GObject\"		\
	-I$(top_srcdir)				\
	-I$(top_srcdir)/glib			\
	-I$(top_builddir)			\
	@GLIB_DEBUG_FLAGS@			\
	-DG_DISABLE_DEPRECATED			\
	-DGOBJECT_COMPILATION			\
	-DG_DISABLE_CONST_RETURNS		\
@STRIP_END@

libglib = $(top_builddir)/glib/libglib-2.0.la

# libraries to compile and install
lib_LTLIBRARIES = libgobject-2.0.la

if MS_LIB_AVAILABLE
noinst_DATA = gobject-2.0.lib

install-ms-lib:
	$(INSTALL) gobject-2.0.lib $(DESTDIR)$(libdir)

uninstall-ms-lib:
	-rm $(DESTDIR)$(libdir)/gobject-2.0.lib
else
install-ms-lib:
uninstall-ms-lib:
endif

if PLATFORM_WIN32
no_undefined = -no-undefined
endif

if OS_WIN32
export_symbols = -export-symbols gobject.def

install-libtool-import-lib:
	$(INSTALL) .libs/libgobject-2.0.dll.a $(DESTDIR)$(libdir)
uninstall-libtool-import-lib:
	-rm $(DESTDIR)$(libdir)/libgobject-2.0.dll.a
else
install-libtool-import-lib:
uninstall-libtool-import-lib:
endif

# libtool stuff: set version and export symbols for resolving
libgobjectincludedir = $(includedir)/glib-2.0/gobject
libgobject_2_0_la_LDFLAGS = @STRIP_BEGIN@ \
	-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)	\
	-export-dynamic $(no_undefined) $(export_symbols)	\
@STRIP_END@

libgobject_2_0_la_LIBADD = @G_OBJECT_WIN32_RESOURCE@ $(libglib)

libgobject_2_0_la_DEPENDENCIES = @G_OBJECT_WIN32_RESOURCE@ @GOBJECT_DEF@

#
# setup source file variables
#
# GObject library header files for public installation (non-generated)
gobject_public_h_sources = @STRIP_BEGIN@ \
	gboxed.h		\
	gclosure.h		\
	genums.h		\
	gobject.h		\
	gparam.h		\
	gparamspecs.h		\
	gsignal.h		\
	gsourceclosure.h	\
	gtype.h			\
	gtypemodule.h		\
	gtypeplugin.h		\
	gvalue.h		\
	gvaluearray.h		\
	gvaluecollector.h	\
	gvaluetypes.h		\
	gobjectnotifyqueue.c	\
@STRIP_END@
# GObject library header files that don't get installed
gobject_private_h_sources = @STRIP_BEGIN@ \
@STRIP_END@
# GObject library C sources to build the library from
gobject_c_sources = @STRIP_BEGIN@ \
	gboxed.c		\
	gclosure.c		\
	genums.c		\
	gobject.c		\
	gparam.c		\
	gparamspecs.c		\
	gsignal.c		\
	gsourceclosure.c	\
	gtype.c			\
	gtypemodule.c		\
	gtypeplugin.c		\
	gvalue.c		\
	gvaluearray.c		\
	gvaluetransform.c	\
	gvaluetypes.c		\
@STRIP_END@

# we use our own built_sources variable rules to avoid automake's
# BUILT_SOURCES oddities
# we generate frequently rebuild files piggyback on a stamp file, so sources
# depending on them only get rebuild when the built source actually changed
# content

# built sources that get installed with the header files
gobject_built_public_sources = @STRIP_BEGIN@ \
	gmarshal.h	\
@STRIP_END@
# built sources that don't get installed
gobject_built_sources = @STRIP_BEGIN@ \
	stamp-gmarshal.h		 \
	gmarshal.c			 \
	${gobject_built_public_sources} \
@STRIP_END@
# non-header sources (headers should be specified in the above variables)
# that don't serve as direct make target sources, i.e. they don't have
# their own .lo rules and don't get publically installed
gobject_extra_sources = @STRIP_BEGIN@ \
	gmarshal.list		\
	gmarshal.strings	\
@STRIP_END@


#
# setup GObject library sources and their dependancies
#
gobject_target_headers = $(gobject_public_h_sources) $(gobject_built_public_sources)
gobject_target_sources = $(gobject_c_sources)
MAINTAINERCLEANFILES += $(gobject_built_sources)
EXTRA_HEADERS +=
EXTRA_DIST += $(gobject_private_h_sources) $(gobject_extra_sources)
EXTRA_DIST += $(gobject_built_sources)

#
# rules to generate built sources
#
# setup autogeneration dependancies
gen_sources = xgen-gmh xgen-gmc xgen-gms
CLEANFILES += $(gen_sources)

$(libgobject_2_0_la_OBJECTS): $(gobject_built_sources)  ${gobject_built_public_sources} # this is our oldest file, used for implicit auto-generation deps
# initial creation of the real stamp-* files
gmarshal.h:	# never add deps here
	test -f "$(srcdir)/$@" || touch $(srcdir)/$@

# normal autogeneration rules
# all autogenerated files need to be generated in the srcdir,
# so old versions get remade and are not confused with newer
# versions in the build dir. thus a development setup requires
# srcdir to be writable, passing --disable-rebuilds to
# ../configure will supress all autogeneration rules.

if CROSS_COMPILING
  glib_genmarshal=$(GLIB_GENMARSHAL)
else
  glib_genmarshal=./glib-genmarshal
endif

$(srcdir)/stamp-gmarshal.h: @REBUILD@ gmarshal.list gmarshal.h glib-genmarshal$(EXEEXT)
	echo "#ifndef __G_MARSHAL_H__" > xgen-gmh \
	&& echo "#define __G_MARSHAL_H__" >> xgen-gmh \
	&& $(glib_genmarshal) --nostdinc --prefix=g_cclosure_marshal $(srcdir)/gmarshal.list --header >> xgen-gmh \
	&& echo "#endif /* __G_MARSHAL_H__ */" >> xgen-gmh \
	&& (cmp -s xgen-gmh $(srcdir)/gmarshal.h || cp xgen-gmh $(srcdir)/gmarshal.h) \
	&& rm -f xgen-gmh xgen-gmh~ \
	&& echo timestamp > $@
$(srcdir)/gmarshal.c: @REBUILD@ $(srcdir)/stamp-gmarshal.h
	$(glib_genmarshal) --nostdinc --prefix=g_cclosure_marshal $(srcdir)/gmarshal.list --body >> xgen-gmc \
	&& cp xgen-gmc $(srcdir)/gmarshal.c \
	&& rm -f xgen-gmc xgen-gmc~
$(srcdir)/gmarshal.strings: @REBUILD@ $(srcdir)/gmarshal.list
	grep '^[A-Z]' $(srcdir)/gmarshal.list \
	| sed -e 's/^/"g_cclosure_marshal_/' -e 's/:/__/' -e 's/,/_/g' -e 's/$$/",/' > xgen-gms \
	&& cp xgen-gms $(srcdir)/gmarshal.strings \
	&& rm -f xgen-gms xgen-gms~
glib-genmarshal.o: gmarshal.strings


# target platform:
libgobjectinclude_HEADERS = $(gobject_target_headers)
libgobject_2_0_la_SOURCES = $(gobject_target_sources)

#
# programs to compile and install
#
bin_PROGRAMS = gobject-query glib-genmarshal
bin_SCRIPTS = glib-mkenums
noinst_PROGRAMS =  testgobject testoverride
# source files
gobject_query_SOURCES = gobject-query.c
glib_genmarshal_SOURCES = glib-genmarshal.c
testgobject_SOURCES = testgobject.c
testoverride_SOURCES = testoverride.c
# link programs against libgobject
progs_LDADD = ./libgobject-2.0.la $(libglib)
glib_genmarshal_LDADD = $(libglib)
gobject_query_LDADD = $(progs_LDADD)
testgobject_LDADD = $(progs_LDADD)
testoverride_LDADD = $(progs_LDADD)

#
# manual pages to install
#
man_MANS = glib-genmarshal.1 glib-mkenums.1

#
# auxillary files
#
EXTRA_DIST += 			\
	makefile.mingw.in 	\
	makefile.msc.in 	\
	gobject.def		\
	gobject.rc.in		\
	glib-genmarshal.1	\
	glib-mkenums.in		\
	glib-mkenums.1

BUILT_EXTRA_DIST = \
	makefile.mingw		\
	makefile.msc		\
	gobject.rc

if OS_WIN32
@G_OBJECT_WIN32_RESOURCE@ : gobject.rc
	$(top_srcdir)/build/win32/lt-compile-resource gobject.rc @G_OBJECT_WIN32_RESOURCE@
endif

gobject-2.0.lib: libgobject-2.0.la gobject.def
	lib -name:libgobject-2.0-@LT_CURRENT_MINUS_AGE@.dll -def:gobject.def -out:$@

gobject.rc: $(top_builddir)/config.status $(top_srcdir)/gobject/gobject.rc.in
	cd $(top_builddir) && CONFIG_FILES=gobject/$@ CONFIG_HEADERS= $(SHELL) ./config.status

makefile.mingw: $(top_builddir)/config.status $(top_srcdir)/gobject/makefile.mingw.in
	cd $(top_builddir) && CONFIG_FILES=gobject/$@ CONFIG_HEADERS= $(SHELL) ./config.status

makefile.msc: $(top_builddir)/config.status $(top_srcdir)/gobject/makefile.msc.in
	cd $(top_builddir) && CONFIG_FILES=gobject/$@ CONFIG_HEADERS= $(SHELL) ./config.status

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

install-data-local: install-ms-lib install-libtool-import-lib

uninstall-local: uninstall-ms-lib uninstall-libtool-import-lib
