## Makefile for the VTV library.
##
## Copyright (C) 2013-2021 Free Software Foundation, Inc.
##
## Process this file with automake to produce Makefile.in.
##
## This file is part of the Vtable Verification (VTV) Library.  This
## library is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3, or (at your option)
## any later version.

## This library is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
## General Public License for more details.

## You should have received a copy of the GNU General Public License
## along with this library; see the file COPYING3.  If not see
## <http://www.gnu.org/licenses/>.

if ENABLE_VTABLE_VERIFY
  SUBDIRS = testsuite
else
  SUBDIRS=
endif

ACLOCAL_AMFLAGS = -I .. -I ../config

# May be used by toolexeclibdir.
gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER)

DEFS = @DEFS@
AM_CPPFLAGS = -I$(top_srcdir)/../include
AM_CFLAGS = $(XCFLAGS)
AM_CCASFLAGS = $(XCFLAGS)
AM_CXXFLAGS = $(XCFLAGS)  
AM_CXXFLAGS += $(LIBSTDCXX_RAW_CXX_CXXFLAGS)
AM_CXXFLAGS += -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end

if ENABLE_VTABLE_VERIFY
  toolexeclib_LTLIBRARIES = libvtv.la
if VTV_CYGMIN
  toolexeclib_LTLIBRARIES += libvtv_stubs.la
endif
endif

vtv_headers = \
	vtv_map.h \
	vtv_malloc.h \
	vtv_fail.h \
	vtv_set.h \
	vtv_utils.h \
	vtv_rts.h

vtv_sources = \
	vtv_start.c \
        vtv_malloc.cc \
        vtv_rts.cc \
        vtv_utils.cc \
	vtv_end.c

vtv_stubs_sources = \
	vtv_start.c \
	vtv_stubs.cc \
	vtv_end.c

libvtv_includedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include

# Link in vtv_start and vtv_end. 
BUILT_SOURCES = vtv_start.c vtv_end.c
vtv_start.c:
	rm -f $@
	$(LN_S) $(toplevel_srcdir)/libgcc/vtv_start.c $@

vtv_end.c:
	rm -f $@
	$(LN_S) $(toplevel_srcdir)/libgcc/vtv_end.c $@

if VTV_NO_OBSTACK
  obstack.c:
	  rm -f $@
	  $(LN_S) $(toplevel_srcdir)/libiberty/obstack.c $@
	  > config.h
endif

if VTV_CYGMIN
  vtv_stubs.cc:
	  rm -f $@
	  $(LN_S) $(toplevel_srcdir)/libstdc++-v3/libsupc++/vtv_stubs.cc $@
endif

if VTV_CYGMIN
  libvtv_la_LIBADD = -lpsapi
  libvtv_la_LDFLAGS = $(lt_host_flags)
  libvtv_stubs_la_LDFLAGS = $(lt_host_flags)
endif

if ENABLE_VTABLE_VERIFY
  libvtv_la_SOURCES = $(vtv_sources)
if VTV_NO_OBSTACK
  libvtv_la_SOURCES += obstack.c
endif
if VTV_CYGMIN
  libvtv_stubs_la_SOURCES = $(vtv_stubs_sources)
endif
  libvtv_include_HEADERS = $(vtv_headers)
else
  libvtv_la_SOURCES =
  libvtv_include_HEADERS =
endif

# Least ordering for dependencies mean linking w/o libstdc++ for as
# long as the development of libvtv does not absolutely require it.
CXXVTV=$(CC_FOR_TARGET)
CXXLD=$(CC_FOR_TARGET)

LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
	--mode=compile $(CXXVTV) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)

CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
	--mode=link $(CXXVTV) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
	$(LDFLAGS) -o $@

include $(top_srcdir)/../multilib.am
