# Top level declarations
.PHONY: help
help: help_all

.PHONY: all
all: build_all

.PHONY: check
check: check_all

.PHONY: test
test: test_all

.PHONY: clean
clean: clean_all

.PHONY: detect
detect: detect_all

# OR_ROOT is the minimal prefix to define the root of or-tools, if we
# are compiling in the or-tools root, it is empty. Otherwise, it is
# $(OR_TOOLS_TOP)/ or $(OR_TOOLS_TOP)\\ depending on the platform. It
# contains the trailing separator if not empty.
#
# INC_DIR is like OR_ROOT, but with a default of '.' instead of
# empty.  It is used for instance in include directives (-I.).
#
# OR_ROOT_FULL is always the complete path to or-tools. It is useful
# to store path informations inside libraries for instance.
ifeq ($(OR_TOOLS_TOP),)
  OR_ROOT =
else
  ifeq ($(OS), Windows_NT)
    OR_ROOT = $(OR_TOOLS_TOP)\\
  else
    OR_ROOT = $(OR_TOOLS_TOP)/
  endif
endif

# Delete all implicit rules to speed up makefile
.SUFFIXES:
# Remove some rules from gmake that .SUFFIXES does not remove.
SUFFIXES =

# Keep all intermediate files
# ToDo: try to remove it later
.SECONDARY:

# Read version.
include $(OR_ROOT)Version.txt

# We try to detect the platform.
include $(OR_ROOT)makefiles/Makefile.port.mk
OR_ROOT_FULL=$(OR_TOOLS_TOP)

# Load local variables
include $(OR_ROOT)Makefile.local

# Change the file extensions to increase diff tool friendliness.
# Then include specific system commands and definitions
include $(OR_ROOT)makefiles/Makefile.$(SYSTEM).mk

# Rules to fetch and build third party dependencies.
include $(OR_ROOT)makefiles/Makefile.third_party.$(SYSTEM).mk

# Check SOURCE argument
SOURCE_SUFFIX = $(suffix $(SOURCE))
# will contain “/any/path/foo.cc” on unix and “\\any\\path\\foo.cc” on windows
SOURCE_PATH = $(subst /,$S,$(SOURCE))
SOURCE_NAME= $(basename $(notdir $(SOURCE)))
ifeq ($(SOURCE),) # Those rules will be used if SOURCE is empty
.PHONY: build run
build run:
	$(error no source file provided, the "$@" target must be used like so: \
 make $@ SOURCE=relative/path/to/filename.extension)
else
ifeq (,$(wildcard $(SOURCE)))
$(error File "$(SOURCE)" does not exist !)
endif
endif

# Include .mk files.
include $(OR_ROOT)makefiles/Makefile.cpp.mk
include $(OR_ROOT)makefiles/Makefile.python.mk
include $(OR_ROOT)makefiles/Makefile.java.mk
include $(OR_ROOT)makefiles/Makefile.dotnet.mk
include $(OR_ROOT)makefiles/Makefile.archive.mk
ifeq ($(SYSTEM),unix)
include $(OR_ROOT)makefiles/Makefile.doc.mk
else
# Remove some rules on windows
help_doc:

endif

# Finally include user makefile if it exists
-include $(OR_ROOT)Makefile.user

.PHONY: help_usage
help_usage:
	@echo Use one of the following targets:
	@echo help, help_all:	Print this help.
	@echo all:	Build OR-Tools for all available languages \(need a call to \"make third_party\" first\).
	@echo check, check_all:	Check OR-Tools for all available languages.
	@echo test, test_all:	Test OR-Tools for all available languages.
	@echo clean, clean_all:	Clean output from previous build for all available languages \(won\'t clean third party\).
	@echo detect, detect_all:	Show variables used to build OR-Tools for all available languages.
ifeq ($(SYSTEM),win)
	@echo off & echo(
else
	@echo
endif

.PHONY: help_all
help_all: help_usage help_third_party help_cc help_python help_java help_dotnet help_archive help_doc

.PHONY: build_all
build_all: cc python java dotnet
	@echo Or-tools have been built for $(BUILT_LANGUAGES)

.PHONY: check_all
check_all: check_cc check_python check_java check_dotnet
	@echo Or-tools have been built and checked for $(BUILT_LANGUAGES)

.PHONY: test_all
test_all: test_cc test_python test_java test_dotnet
	@echo Or-tools have been built and tested for $(BUILT_LANGUAGES)

.PHONY: clean_all
clean_all: clean_cc clean_python clean_java clean_dotnet clean_compat clean_archive
	-$(DELREC) $(BIN_DIR)
	-$(DELREC) $(LIB_DIR)
	-$(DELREC) $(OBJ_DIR)
	-$(DELREC) $(GEN_PATH)
	@echo Or-tools have been cleaned for $(BUILT_LANGUAGES)

.PHONY: detect_all
detect_all: detect_port detect_third_party detect_cc detect_python detect_java detect_dotnet detect_archive
	@echo SOURCE = $(SOURCE)
	@echo SOURCE_PATH = $(SOURCE_PATH)
	@echo SOURCE_NAME = $(SOURCE_NAME)
	@echo SOURCE_SUFFIX = $(SOURCE_SUFFIX)
ifeq ($(SYSTEM),win)
	@echo off & echo(
else
	@echo
endif

print-%  : ; @echo $* = \'$($*)\'

.PHONY: FORCE
FORCE:
