## Common automake fragments for elfutils subdirectory makefiles.
##
## Copyright (C) 2010, 2014 Red Hat, Inc.
##
## This file is part of elfutils.
##
## This file is free software; you can redistribute it and/or modify
## it under the terms of either
##
##   * the GNU Lesser General Public License as published by the Free
##     Software Foundation; either version 3 of the License, or (at
##     your option) any later version
##
## or
##
##   * the GNU General Public License as published by the Free
##     Software Foundation; either version 2 of the License, or (at
##     your option) any later version
##
## or both in parallel, as here.
##
## elfutils 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 copies of the GNU General Public License and
## the GNU Lesser General Public License along with this program.  If
## not, see <http://www.gnu.org/licenses/>.
##

DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"'
AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I..

# Drop the 'u' flag that automake adds by default. It is incompatible
# with deterministic archives.
ARFLAGS = cr

# Warn about stack usage of more than 256K = 262144 bytes.
if ADD_STACK_USAGE_WARNING
STACK_USAGE_WARNING=-Wstack-usage=262144
else
STACK_USAGE_WARNING=
endif
AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
	    -Wold-style-definition -Wstrict-prototypes \
	    $(if $($(*F)_no_Werror),,-Werror) \
	    $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
	    $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \
	    $($(*F)_CFLAGS)

COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))

DEFS.os = -DPIC -DSHARED
if SYMBOL_VERSIONING
DEFS.os += -DSYMBOL_VERSIONING
else
endif

%.os: %.c %.o
if AMDEP
	$(AM_V_CC)if $(COMPILE.os) -c -o $@ -fPIC $(DEFS.os) -MT $@ -MD -MP \
	  -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \
	then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \
	     rm -f "$(DEPDIR)/$*.Tpo"; \
	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
	fi
else
	$(AM_V_CC)$(COMPILE.os) -c -o $@ -fPIC $(DEFS.os) $<
endif

CLEANFILES = *.gcno *.gcda

textrel_msg = echo "WARNING: TEXTREL found in '$@'"
if FATAL_TEXTREL
textrel_found = $(textrel_msg); exit 1
else
textrel_found = $(textrel_msg)
endif
textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then $(textrel_found); fi

print-%:
	@echo $*=$($*)
