# Copyright 2015 Google Inc. All rights reserved
#
# Licensed 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.

# Find source file location from path to this Makefile
KATI_SRC_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))

# Set defaults if they weren't set by the including Makefile
KATI_CXX ?= $(CXX)
KATI_LD ?= $(CXX)
KATI_INTERMEDIATES_PATH ?= .
KATI_BIN_PATH ?= .

KATI_CXX_SRCS := \
	affinity.cc \
	command.cc \
	dep.cc \
	eval.cc \
	exec.cc \
	expr.cc \
	file.cc \
	file_cache.cc \
	fileutil.cc \
	find.cc \
	flags.cc \
	func.cc \
	io.cc \
	log.cc \
	main.cc \
	ninja.cc \
	parser.cc \
	regen.cc \
	rule.cc \
	stats.cc \
	stmt.cc \
	string_piece.cc \
	stringprintf.cc \
	strutil.cc \
	symtab.cc \
	thread_pool.cc \
	timeutil.cc \
	var.cc

KATI_CXX_GENERATED_SRCS := \
	version.cc

KATI_CXX_SRCS := $(addprefix $(KATI_SRC_PATH)/,$(KATI_CXX_SRCS))
KATI_CXX_TEST_SRCS := \
  $(wildcard $(KATI_SRC_PATH)/*_test.cc) \
  $(filter-out $(KATI_SRC_PATH)/fileutil_bench.cc,\
    $(wildcard $(KATI_SRC_PATH)/*_bench.cc))

KATI_CXX_OBJS := $(patsubst $(KATI_SRC_PATH)/%.cc,$(KATI_INTERMEDIATES_PATH)/%.o,\
	$(KATI_CXX_SRCS))
KATI_CXX_GENERATED_OBJS := $(patsubst %.cc,$(KATI_INTERMEDIATES_PATH)/%.o,\
	$(KATI_CXX_GENERATED_SRCS))
KATI_CXX_TEST_OBJS := $(patsubst $(KATI_SRC_PATH)/%.cc,$(KATI_INTERMEDIATES_PATH)/%.o,\
	$(KATI_CXX_TEST_SRCS))

KATI_CXX_TEST_EXES := $(patsubst $(KATI_INTERMEDIATES_PATH)/%.o,$(KATI_BIN_PATH)/%,\
	$(KATI_CXX_TEST_OBJS))

KATI_CXXFLAGS := -g -W -Wall -MMD -MP
KATI_CXXFLAGS += -O -DNOLOG
KATI_CXXFLAGS += -march=native
#KATI_CXXFLAGS += -pg

ifeq ($(shell uname),Linux)
KATI_LIBS := -lrt -lpthread
endif

# Rule to build ckati into KATI_BIN_PATH
$(KATI_BIN_PATH)/ckati: $(KATI_CXX_OBJS) $(KATI_CXX_GENERATED_OBJS)
	@mkdir -p $(dir $@)
	$(KATI_LD) -std=c++11 $(KATI_CXXFLAGS) -o $@ $^ $(KATI_LIBS)

# Rule to build normal source files into object files in KATI_INTERMEDIATES_PATH
$(KATI_CXX_OBJS) $(KATI_CXX_TEST_OBJS): $(KATI_INTERMEDIATES_PATH)/%.o: $(KATI_SRC_PATH)/%.cc
	@mkdir -p $(dir $@)
	$(KATI_CXX) -c -std=c++11 $(KATI_CXXFLAGS) -o $@ $<

# Rule to build generated source files into object files in KATI_INTERMEDIATES_PATH
$(KATI_CXX_GENERATED_OBJS): $(KATI_INTERMEDIATES_PATH)/%.o: $(KATI_INTERMEDIATES_PATH)/%.cc
	@mkdir -p $(dir $@)
	$(KATI_CXX) -c -std=c++11 $(KATI_CXXFLAGS) -o $@ $<

ckati_tests: $(KATI_CXX_TEST_EXES)

# Rule to build tests using *_test.cc and all normal *.cc files except main.cc
$(KATI_CXX_TEST_EXES): $(filter-out $(KATI_INTERMEDIATES_PATH)/main.o,$(KATI_CXX_OBJS)) $(KATI_CXX_GENERATED_OBJS)
$(KATI_CXX_TEST_EXES): $(KATI_BIN_PATH)/%: $(KATI_INTERMEDIATES_PATH)/%.o
	$(KATI_LD) $^ -o $@ $(KATI_LIBS)

# Rule to generate version.cc
KATI_GIT_DIR := $(shell git -C $(KATI_SRC_PATH) rev-parse --show-toplevel)
ifneq ($(KATI_GIT_DIR),)
KATI_VERSION_DEPS := $(KATI_GIT_DIR)/.git/HEAD $(KATI_GIT_DIR)/.git/index
KATI_VERSION := $(shell git -C $(KATI_GIT_DIR) rev-parse HEAD)
else
KATI_VERSION_DEPS :=
KATI_VERSION := unknown
endif
$(KATI_INTERMEDIATES_PATH)/version.cc: $(KATI_VERSION_DEPS)
	@mkdir -p $(dir $@)
	echo '// +build ignore' > $@
	echo >> $@
	echo 'const char* kGitVersion = "$(KATI_VERSION)";' >> $@

tsan_ckati:
	$(MAKE) clean
	$(MAKE) all CXX='clang++-3.6 -fsanitize=thread'
	cp ckati $@

ckati_clean:
	rm -rf $(KATI_INTERMEDIATES_PATH)/ckati
	rm -rf $(KATI_INTERMEDIATES_PATH)/*.o
	rm -rf $(KATI_INTERMEDIATES_PATH)/*.d
	rm -rf $(KATI_INTERMEDIATES_PATH)/version.cc
	rm -rf $(KATI_CXX_TEST_EXES)
	rm -rf out

.PHONY: ckati_clean

-include $(KATI_INTERMEDIATES_PATH)/*.d
