## Process this file with automake to create Makefile.in
## Configure input file for elfutils.
##
## Copyright (C) 1996-2006, 2008, 2009, 2015 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 the GNU General Public License as published by
## the Free Software Foundation; either version 3 of the License, or
## (at your option) any later version.
##
## 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 a copy of the GNU General Public License
## along with this program.  If not, see <http://www.gnu.org/licenses/>.
##
ACLOCAL_AMFLAGS = -I m4

# automake already tells which subdir is being entered.
# Don't make make repeat.
AM_MAKEFLAGS = --no-print-directory

pkginclude_HEADERS = version.h

SUBDIRS = config lib libelf libcpu backends libebl libdwelf libdwfl libdw \
	  libasm debuginfod src po doc tests

EXTRA_DIST = elfutils.spec GPG-KEY NOTES CONTRIBUTING \
	     COPYING COPYING-GPLV2 COPYING-LGPLV3

# Make sure the test install uses lib64 when $LIB will yield lib64.
# Make sure the test build uses the same compiler, which on e.g. ppc64
# determines which platform we are actually testing.
# Run all tests under valgrind.
AM_DISTCHECK_CONFIGURE_FLAGS = \
	--libdir=`echo $(libdir) | sed "s,^$(exec_prefix),$$dc_install_base,"`\
	--enable-valgrind --enable-sanitize-undefined \
	CC="$(CC)"

distcheck-hook:
	chmod -R u+w $(distdir)

rpm: dist
	rpmbuild -ts --sign elfutils-@PACKAGE_VERSION@.tar.bz2

if GCOV

COVERAGE_OUTPUT_FILE = $(PACKAGE_NAME).lcov
COVERAGE_OUTPUT_DIRECTORY = coverage
COVERAGE_OUTPUT_INDEX_HTML = $(COVERAGE_OUTPUT_DIRECTORY)/index.html
COVERAGE_TITLE = $(PACKAGE_NAME)-$(PACKAGE_VERSION)

COVERAGE_DIRS = $(filter-out tests,$(SUBDIRS))
src_COVERAGE_DIRS = $(patsubst %,$(srcdir)/%,$(COVERAGE_DIRS))
build_COVERAGE_DIRS = $(patsubst %,$(builddir)/%,$(COVERAGE_DIRS))
all_COVERAGE_DIRS = $(sort $(src_COVERAGE_DIRS) $(build_COVERAGE_DIRS))
LCOV_DIRS_ARGS = $(patsubst %,--directory=%,$(all_COVERAGE_DIRS))

CLEANFILES = $(COVERAGE_OUTPUT_FILE)

.PHONY: coverage coverage-clean

clean-local: coverage-clean
distclean-local: coverage-clean

coverage-clean:
	-rm -rf $(COVERAGE_OUTPUT_DIRECTORY)

coverage: $(COVERAGE_OUTPUT_INDEX_HTML)
	@echo 'file://$(abs_builddir)/$(COVERAGE_OUTPUT_INDEX_HTML)'

$(COVERAGE_OUTPUT_INDEX_HTML): $(COVERAGE_OUTPUT_FILE)
	LC_ALL=C $(GENHTML) \
		--legend \
		--show-details \
		--rc=genhtml_branch_coverage=1 \
		--title='$(COVERAGE_TITLE)' \
		--prefix='$(abspath $(abs_srcdir))' \
		--prefix='$(realpath $(abs_srcdir))' \
		--prefix='$(abspath $(abs_builddir)/..)' \
		--prefix='$(realpath $(abs_builddir)/..)' \
		--output-directory='$(COVERAGE_OUTPUT_DIRECTORY)' \
		$<

$(COVERAGE_OUTPUT_FILE):
	$(LCOV) \
		--capture \
		--no-external \
		--no-checksum \
		--rc=lcov_branch_coverage=1 \
		--gcov-tool='$(GCOV)' \
		--output-file='$@' \
		$(LCOV_DIRS_ARGS)

endif

# Tell version 3.79 and up of GNU make to not build goals in this
# directory in parallel.
.NOTPARALLEL:
