# 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
include $(top_srcdir)/glib.mk

SUBDIRS = . tests

AM_CPPFLAGS = 					\
	-DG_LOG_DOMAIN=\"GLib-GObject\"		\
	$(glib_INCLUDES)			\
	$(GLIB_DEBUG_FLAGS)			\
	-DGOBJECT_COMPILATION

AM_CFLAGS = $(GLIB_WARN_CFLAGS)

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

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

if OS_WIN32_AND_DLL_COMPILATION
if MS_LIB_AVAILABLE
noinst_DATA += gobject-2.0.lib

install_ms_lib_cmd = $(INSTALL) gobject-2.0.lib $(DESTDIR)$(libdir)
uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/gobject-2.0.lib
endif
endif

install-ms-lib:
	$(install_ms_lib_cmd)

uninstall-ms-lib:
	$(uninstall_ms_lib_cmd)

if PLATFORM_WIN32
no_undefined = -no-undefined
endif

if OS_WIN32_AND_DLL_COMPILATION
gobject_win32_res = gobject-win32-res.o
gobject_win32_res_ldflag = -Wl,$(gobject_win32_res)
endif

libgobjectincludedir = $(includedir)/glib-2.0/gobject
libgobject_2_0_la_LDFLAGS = $(GLIB_LINK_FLAGS) \
  $(gobject_win32_res_ldflag) \
  -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
  -export-dynamic $(no_undefined)

libgobject_2_0_la_CFLAGS = $(AM_CFLAGS) $(LIBFFI_CFLAGS) $(GLIB_HIDDEN_VISIBILITY_CFLAGS)

libgobject_2_0_la_LIBADD = $(libglib) $(LIBFFI_LIBS)

libgobject_2_0_la_DEPENDENCIES = $(gobject_win32_res)

#
# setup source file variables
#
# GObject library header files for public installation
gobject_public_h_sources = \
	gobject-autocleanups.h	\
	glib-types.h		\
	gbinding.h		\
	gboxed.h		\
	gclosure.h		\
	genums.h		\
	gmarshal.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

# GObject library header files that don't get installed
gobject_private_h_sources =     \
	gatomicarray.h		\
	gtype-private.h

# GObject library C sources to build the library from
gobject_c_sources = \
	gobject_probes.d	\
	gatomicarray.c		\
	gbinding.c		\
	gboxed.c		\
	gclosure.c		\
	genums.c		\
	gmarshal.c		\
	gobject.c		\
	gobject_trace.h		\
	gparam.c		\
	gparamspecs.c		\
	gsignal.c		\
	gsourceclosure.c	\
	gtype.c			\
	gtypemodule.c		\
	gtypeplugin.c		\
	gvalue.c		\
	gvaluearray.c		\
	gvaluetransform.c	\
	gvaluetypes.c

if ENABLE_DTRACE

gobject_probes.h: gobject_probes.d
	$(AM_V_GEN) $(DTRACE) -C -h -s $< -o $@.tmp
	@$(SED) \
		-e "s,define STAP_HAS_SEMAPHORES 1,undef STAP_HAS_SEMAPHORES," \
		-e "s,define _SDT_HAS_SEMAPHORES 1,undef _SDT_HAS_SEMAPHORES," \
		< $@.tmp > $@ && rm -f $@.tmp

gobject_probes.lo: gobject_probes.d
	$(AM_V_GEN) $(LIBTOOL) --mode=compile $(AM_V_lt) --tag=CC env CFLAGS="$(CFLAGS)" $(DTRACE) -G -s $< -o $@

BUILT_SOURCES += gobject_probes.h gobject_probes.lo
CLEANFILES += gobject_probes.h
libgobject_2_0_la_LIBADD += gobject_probes.lo
endif

tapsetdir   = @ABS_TAPSET_DIR@
EXTRA_DIST += gobject.stp.in

if ENABLE_SYSTEMTAP
tapset_DATA = libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@.stp
CLEANFILES += $(tapset_DATA)

$(tapset_DATA): gobject.stp.in Makefile
	$(AM_V_GEN)$(SED) \
		-e 's|[@]ABS_GLIB_RUNTIME_LIBDIR[@]|$(ABS_GLIB_RUNTIME_LIBDIR)|g' \
		-e 's|[@]LT_CURRENT[@]|$(LT_CURRENT)|g' \
		-e 's|[@]LT_REVISION[@]|$(LT_REVISION)|g' \
		$< > $@
endif

# 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 =

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

# This is read by gobject-introspection/misc/ and gtk-doc
gobject-public-headers.txt: Makefile
	$(AM_V_GEN) echo $(gobject_public_h_sources) > $@.tmp && mv $@.tmp $@

CLEANFILES += gobject-public-headers.txt

all-local: gobject-public-headers.txt

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

# 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.


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

#
# programs to compile and install
#
bin_PROGRAMS = gobject-query
bin_SCRIPTS = glib-mkenums glib-genmarshal
# source files
gobject_query_SOURCES = gobject-query.c
# link programs against libgobject
progs_LDADD = ./libgobject-2.0.la $(libglib)
gobject_query_LDADD = $(progs_LDADD)

#
# auxillary files
#
EXTRA_DIST += 			\
	gobject.rc.in		\
	libgobject-gdb.py.in	\
	glib-genmarshal.in	\
	glib-mkenums.in

CLEANFILES += libgobject-gdb.py

BUILT_EXTRA_DIST += \
	gobject.rc

gobject-win32-res.o: gobject.rc
	$(AM_V_GEN) $(WINDRES) gobject.rc $@

gobject.def: libgobject-2.0.la
	$(AM_V_GEN) dumpbin.exe -exports .libs/libgobject-2.0-0.dll | awk 'BEGIN { print "EXPORTS" } / +[[:digit:]]+ +[[:xdigit:]]+ +[[:xdigit:]]+/{ print $$4 }' > gobject.def.tmp && mv gobject.def.tmp gobject.def

gobject-2.0.lib: libgobject-2.0.la gobject.def
	$(AM_V_GEN) lib.exe -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgobject-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:$(builddir)/gobject.def -out:$@

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

uninstall-local: uninstall-ms-lib uninstall-gdb

distclean-local:
	if test $(srcdir) = .; then :; else \
	    rm -f $(BUILT_EXTRA_DIST); \
	fi

# install gdb scripts
gdbdir = $(datadir)/glib-2.0/gdb
dist_gdb_DATA = gobject_gdb.py

all-local: libgobject-gdb.py
libgobject-gdb.py: libgobject-gdb.py.in
	$(AM_V_GEN) $(SED) -e "s|\@datadir\@|$(datadir)|" $(srcdir)/libgobject-gdb.py.in > $(builddir)/libgobject-gdb.py

uninstall-gdb:
	-rm -r $(DESTDIR)$(datadir)/gdb

if HAVE_GLIB_RUNTIME_LIBDIR
ABS_GLIB_RUNTIME_LIBDIR = $(realpath $(libdir)/$(GLIB_RUNTIME_LIBDIR))
else
ABS_GLIB_RUNTIME_LIBDIR = $(libdir)
endif

install-data-hook: libgobject-gdb.py
	mkdir -p $(DESTDIR)$(datadir)/gdb/auto-load/$(ABS_GLIB_RUNTIME_LIBDIR)
	$(INSTALL) $(builddir)/libgobject-gdb.py $(DESTDIR)$(datadir)/gdb/auto-load/$(ABS_GLIB_RUNTIME_LIBDIR)/libgobject-2.0.so.0.$(LT_CURRENT).$(LT_REVISION)-gdb.py
if HAVE_GLIB_RUNTIME_LIBDIR
	mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR)
	mv $(DESTDIR)$(libdir)/libgobject-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR)
	mv $(DESTDIR)$(libdir)/libgobject-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR)
	rm -f $(DESTDIR)$(libdir)/libgobject-2.0.so
	ln -s $(GLIB_RUNTIME_LIBDIR)/libgobject-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/libgobject-2.0.so
endif
