## Process this with automake to create Makefile.in

AUTOMAKE_OPTIONS = foreign subdir-objects

ACLOCAL_AMFLAGS = -I m4

SUBDIRS = include testsuite man
if BUILD_DOCS
## This hack is needed because it doesn't seem possible to make a
## conditional info_TEXINFOS in Automake.  At least Automake 1.14
## either gives errors -- if this attempted in the most
## straightforward way -- or simply unconditionally tries to build the
## info file.
SUBDIRS += doc
endif

EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj			\
	ChangeLog.libffi ChangeLog.libffi-3.1				\
	m4/libtool.m4 m4/lt~obsolete.m4					\
	 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4			\
	 m4/ltversion.m4 src/debug.c msvcc.sh				\
	generate-darwin-source-and-headers.py				\
	libffi.xcodeproj/project.pbxproj				\
	libtool-ldflags libtool-version configure.host

# local.exp is generated by configure
DISTCLEANFILES = local.exp

## ################################################################

##
## This section is for make and multilib madness.
##

# Work around what appears to be a GNU make bug handling MAKEFLAGS
# values defined in terms of make variables, as is the case for CC and
# friends when we are called from the top level Makefile.
AM_MAKEFLAGS = \
	'AR_FLAGS=$(AR_FLAGS)' \
	'CC_FOR_BUILD=$(CC_FOR_BUILD)' \
	'CFLAGS=$(CFLAGS)' \
	'CXXFLAGS=$(CXXFLAGS)' \
	'CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)' \
	'CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)' \
	'INSTALL=$(INSTALL)' \
	'INSTALL_DATA=$(INSTALL_DATA)' \
	'INSTALL_PROGRAM=$(INSTALL_PROGRAM)' \
	'INSTALL_SCRIPT=$(INSTALL_SCRIPT)' \
	'JC1FLAGS=$(JC1FLAGS)' \
	'LDFLAGS=$(LDFLAGS)' \
	'LIBCFLAGS=$(LIBCFLAGS)' \
	'LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)' \
	'MAKE=$(MAKE)' \
	'MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)' \
	'PICFLAG=$(PICFLAG)' \
	'PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)' \
	'RUNTESTFLAGS=$(RUNTESTFLAGS)' \
	'SHELL=$(SHELL)' \
	'exec_prefix=$(exec_prefix)' \
	'infodir=$(infodir)' \
	'libdir=$(libdir)' \
	'mandir=$(mandir)' \
	'prefix=$(prefix)' \
	'AR=$(AR)' \
	'AS=$(AS)' \
	'CC=$(CC)' \
	'CXX=$(CXX)' \
	'LD=$(LD)' \
	'NM=$(NM)' \
	'RANLIB=$(RANLIB)' \
	'DESTDIR=$(DESTDIR)'

# Subdir rules rely on $(FLAGS_TO_PASS)
FLAGS_TO_PASS = $(AM_MAKEFLAGS)

MAKEOVERRIDES=

pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libffi.pc

toolexeclib_LTLIBRARIES = libffi.la
noinst_LTLIBRARIES = libffi_convenience.la

libffi_la_SOURCES = src/prep_cif.c src/types.c \
		src/raw_api.c src/java_raw_api.c src/closures.c

if FFI_DEBUG
libffi_la_SOURCES += src/debug.c
endif

noinst_HEADERS = \
	src/aarch64/ffitarget.h src/aarch64/internal.h			\
	src/alpha/ffitarget.h src/alpha/internal.h			\
	src/arc/ffitarget.h						\
	src/arm/ffitarget.h src/arm/internal.h				\
	src/avr32/ffitarget.h						\
	src/bfin/ffitarget.h						\
	src/cris/ffitarget.h						\
	src/frv/ffitarget.h						\
	src/ia64/ffitarget.h src/ia64/ia64_flags.h			\
	src/m32r/ffitarget.h						\
	src/m68k/ffitarget.h						\
	src/m88k/ffitarget.h						\
	src/metag/ffitarget.h						\
	src/microblaze/ffitarget.h					\
	src/mips/ffitarget.h						\
	src/moxie/ffitarget.h						\
	src/nios2/ffitarget.h						\
	src/or1k/ffitarget.h						\
	src/pa/ffitarget.h						\
	src/powerpc/ffitarget.h src/powerpc/asm.h src/powerpc/ffi_powerpc.h \
	src/s390/ffitarget.h						\
	src/sh/ffitarget.h						\
	src/sh64/ffitarget.h						\
	src/sparc/ffitarget.h src/sparc/internal.h			\
	src/tile/ffitarget.h						\
	src/vax/ffitarget.h						\
	src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h src/x86/asmnames.h \
	src/xtensa/ffitarget.h						\
	src/dlmalloc.c

EXTRA_libffi_la_SOURCES = \
	src/aarch64/ffi.c src/aarch64/sysv.S				\
	src/alpha/ffi.c src/alpha/osf.S					\
	src/arc/ffi.c src/arc/arcompact.S				\
	src/arm/ffi.c src/arm/sysv.S					\
	src/avr32/ffi.c src/avr32/sysv.S				\
	src/bfin/ffi.c src/bfin/sysv.S					\
	src/cris/ffi.c src/cris/sysv.S					\
	src/frv/ffi.c src/frv/eabi.S					\
	src/ia64/ffi.c src/ia64/unix.S					\
	src/m32r/ffi.c src/m32r/sysv.S					\
	src/m68k/ffi.c src/m68k/sysv.S					\
	src/m88k/ffi.c src/m88k/obsd.S					\
	src/metag/ffi.c src/metag/sysv.S				\
	src/microblaze/ffi.c src/microblaze/sysv.S			\
	src/mips/ffi.c src/mips/o32.S src/mips/n32.S			\
	src/moxie/ffi.c src/moxie/eabi.S				\
	src/nios2/ffi.c src/nios2/sysv.S				\
	src/or1k/ffi.c src/or1k/sysv.S					\
	src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S			\
	src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c \
	 src/powerpc/sysv.S src/powerpc/linux64.S			\
	 src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S	\
	 src/powerpc/aix.S src/powerpc/darwin.S src/powerpc/aix_closure.S \
	 src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c		\
	src/s390/ffi.c src/s390/sysv.S					\
	src/sh/ffi.c src/sh/sysv.S					\
	src/sh64/ffi.c src/sh64/sysv.S					\
	src/sparc/ffi.c src/sparc/ffi64.c src/sparc/v8.S src/sparc/v9.S	\
	src/tile/ffi.c src/tile/tile.S					\
	src/vax/ffi.c src/vax/elfbsd.S					\
	src/x86/ffi.c src/x86/sysv.S					\
	 src/x86/ffiw64.c src/x86/win64.S 				\
	 src/x86/ffi64.c src/x86/unix64.S				\
	src/xtensa/ffi.c src/xtensa/sysv.S

TARGET_OBJ = @TARGET_OBJ@
libffi_la_LIBADD = $(TARGET_OBJ)

libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
EXTRA_libffi_convenience_la_SOURCES = $(EXTRA_libffi_la_SOURCES)
libffi_convenience_la_LIBADD = $(libffi_la_LIBADD)
libffi_convenience_la_DEPENDENCIES = $(libffi_la_DEPENDENCIES)
nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)

LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS))

AM_CFLAGS =
if FFI_DEBUG
# Build debug. Define FFI_DEBUG on the commandline so that, when building with
# MSVC, it can link against the debug CRT.
AM_CFLAGS += -DFFI_DEBUG
endif

if LIBFFI_BUILD_VERSIONED_SHLIB
if LIBFFI_BUILD_VERSIONED_SHLIB_GNU
libffi_version_script = -Wl,--version-script,libffi.map
libffi_version_dep = libffi.map
endif
if LIBFFI_BUILD_VERSIONED_SHLIB_SUN
libffi_version_script = -Wl,-M,libffi.map-sun
libffi_version_dep = libffi.map-sun
libffi.map-sun : libffi.map $(top_srcdir)/../contrib/make_sunver.pl \
		 $(libffi_la_OBJECTS) $(libffi_la_LIBADD)
	perl $(top_srcdir)/../contrib/make_sunver.pl libffi.map \
	 `echo $(libffi_la_OBJECTS) $(libffi_la_LIBADD) | \
	    sed 's,\([^/        ]*\)\.l\([ao]\),.libs/\1.\2,g'` \
	 > $@ || (rm -f $@ ; exit 1)
endif
else
libffi_version_script =
libffi_version_dep =
endif
libffi_version_info = -version-info `grep -v '^\#' $(srcdir)/libtool-version`

libffi.map: $(top_srcdir)/libffi.map.in
	$(COMPILE) -D$(TARGET) -E -x assembler-with-cpp -o $@ $<

libffi_la_LDFLAGS = -no-undefined $(libffi_version_info) $(libffi_version_script) $(LTLDFLAGS) $(AM_LTLDFLAGS)
libffi_la_DEPENDENCIES = $(libffi_la_LIBADD) $(libffi_version_dep)

AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
AM_CCASFLAGS = $(AM_CPPFLAGS)

dist-hook:
	if [ -d $(top_srcdir)/.git ] ; then (cd $(top_srcdir); git log --no-decorate) ; else echo 'See git log for history.' ; fi > $(distdir)/ChangeLog
