# 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.

# build docker compose images:
# $ make -f Makefile.docker build-cpp
# To run the test suite
# $ make -f Makefile.docker cpp

LANGUAGES = cpp cpp-alpine cpp-cmake32 c_glib go java js python python-alpine rust r r-sanitizer
MISC = lint iwyu clang-format docs pandas-master
TESTS = dask hdfs-integration spark-integration python-nopandas

# declare images dependencies
DEPENDS_ON_CPP = build-c_glib build-python build-r
DEPENDS_ON_CPP_ALPINE = build-python-alpine
DEPENDS_ON_PYTHON = build-lint build-docs build-dask build-hdfs-integration \
                    build-spark-integration build-python-nopandas \
                    build-turbodbc-integration build-kartothek-integration
DEPENDS_ON_LINT = build-iwyu build-clang-format

SERVICES = $(LANGUAGES) $(MISC) $(TESTS)
.PHONY: clean build-% run-% $(SERVICES)

DC := docker-compose

clean:
	$(DC) down -v

# Default build target if no dependencies
build-%:
	$(DC) build $*

# The following targets create the dependencies of the form `build-X: build-Y`
$(DEPENDS_ON_CPP): build-%: build-cpp
	$(DC) build $*
$(DEPENDS_ON_CPP_ALPINE): build-%: build-cpp-alpine
	$(DC) build $*
$(DEPENDS_ON_PYTHON): build-%: build-python
	$(DC) build $*
# The dependents of lint image don't build anything
$(DEPENDS_ON_LINT): build-%: build-lint

# panda master is a special case due to --no-cache
build-pandas-master: build-python
	$(DC) build --no-cache pandas-master

run-%: build-%
	$(DC) run --rm $*

# Trick to get `service` expand to `run-service`
$(SERVICES): % : run-%
