# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License

ACLOCAL_AMFLAGS = -I m4

AUTOMAKE_OPTIONS = foreign

SUBDIRS = . 3rdparty src

EXTRA_DIST =

PHONY_TARGETS =

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

# Directories to optionally install test binaries and libraries.
testlibexecdir = $(pkglibexecdir)/tests

# Since we generate several files in src/ with config.status, make
# sure they're regenerated before we recurse into the src directory.
all-recursive: src/python/setup.py			\
	src/python/cli/setup.py				\
	src/python/interface/setup.py			\
	src/python/native/setup.py			\
	src/java/mesos.pom

# Standard stuff.
EXTRA_DIST += bootstrap LICENSE NOTICE README.md	\
	support/atexit.sh support/colors.sh		\
	support/mesos-gtest-runner.py

# On install, pip fetches and installs all missing dependencies. When running
# distcheck, this behavior ends up installing files that we are not able to
# uninstall (protobuf for example). Using this flag during the distcheck run
# forces us to verify that we can install/uninstall the mesos specific
# libraries and only those libraries.
AM_DISTCHECK_CONFIGURE_FLAGS = --disable-python-dependency-install


# MPI framework.
EXTRA_DIST += mpi/README mpi/mpiexec-mesos.in mpi/mpiexec-mesos.py


if HAS_JAVA
maven-install:
	@cd src && $(MAKE) $(AM_MAKEFLAGS) maven-install

PHONY_TARGETS += maven-install
endif


# Run benchmark tests.
# Currently benchmark tests exist only under src/ so the top level
# 'bench' rule calls the Makefile under src/ directly to run these
# tests, after it builds the entire program (i.e. 'all') and the test
# prerequisites (libgmock.la).
# TODO(xujyan): The use of variable 'MESOS_BENCHMARKS' on the target
# 'check' is likely going to be replaced by a long-term solution for
# benchmark testing, for which we should consider separating
# benchmark tests from the 'mesos-tests' binary (i.e. the
# 'correctness' tests).
# TODO(xujyan): Consider using `AM_EXTRA_RECURSIVE_TARGETS` macro
# (requires Automake >= 1.13) to define 'bench' as a recursive target
# when we have benchmark tests in multiple subdirs.
bench: all
	@cd 3rdparty && $(MAKE) $(AM_MAKEFLAGS) libgmock.la
	@cd src && MESOS_BENCHMARK=1 $(MAKE) $(AM_MAKEFLAGS) check

PHONY_TARGETS += bench

tests: all
	@cd 3rdparty && $(MAKE) $(AM_MAKEFLAGS) tests
	@cd src && $(MAKE) $(AM_MAKEFLAGS) tests

# Using LT_OUTPUT in configure.ac creates config.lt that doesn't get
# cleaned up by distclean-libtool. See this bug patch (which doesn't
# appear to be in all versions of libtool.m4):
# http://lists.gnu.org/archive/html/automake-commit/2008-11/msg00015.html.
distclean-local:
	-rm -f config.lt
	-rm -f ./3rdparty/report.xml
	-rm -f ./3rdparty/libprocess/report.xml
	-rm -f ./3rdparty/stout/report.xml
	-rm -f ./src/report.xml

if INSTALL_TESTS
dist_testlibexec_SCRIPTS = 				\
  support/atexit.sh 					\
  support/colors.sh
endif

.PHONY: $(PHONY_TARGETS)
