[C++] Allow overriding the Makefile paths

Allow Makefile.ckati to be included by another Makefile that
set KATI_CXX, KATI_INTERMEDIATES_PATH, and KATI_BIN_PATH.
Allows the kati build to be embedded into the Android build.
diff --git a/Makefile.ckati b/Makefile.ckati
index 79be4d5..cb407d4 100644
--- a/Makefile.ckati
+++ b/Makefile.ckati
@@ -12,9 +12,16 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-KATI_CXX ?= $(CXX)
+# Find source file location from path to this Makefile
+KATI_SRC_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
 
-KATI_CXX_SRCS:= \
+# 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 := \
 	ast.cc \
 	command.cc \
 	dep.cc \
@@ -38,38 +45,65 @@
 	symtab.cc \
 	timeutil.cc \
 	value.cc \
-	var.cc \
+	var.cc
+
+KATI_CXX_GENERATED_SRCS := \
 	version.cc
-KATI_CXX_TEST_SRCS:= \
-	$(wildcard *_test.cc)
-KATI_CXX_OBJS:=$(KATI_CXX_SRCS:.cc=.o)
-KATI_CXX_TEST_OBJS:=$(KATI_CXX_TEST_SRCS:.cc=.o)
-KATI_CXX_ALL_OBJS:=$(KATI_CXX_SRCS:.cc=.o) $(KATI_CXX_TEST_SRCS:.cc=.o)
-KATI_CXX_TEST_EXES:=$(KATI_CXX_TEST_OBJS:.o=)
-KATI_CXXFLAGS:=-g -W -Wall -MMD
-KATI_CXXFLAGS+=-O -DNOLOG
-#KATI_CXXFLAGS+=-pg
 
-ckati: $(KATI_CXX_OBJS)
-	$(KATI_CXX) -std=c++11 $(KATI_CXXFLAGS) -o $@ $(KATI_CXX_OBJS)
+KATI_CXX_SRCS := $(addprefix $(KATI_SRC_PATH)/,$(KATI_CXX_SRCS))
+KATI_CXX_TEST_SRCS:= $(wildcard $(KATI_SRC_PATH)/*_test.cc)
 
-$(KATI_CXX_ALL_OBJS): %.o: %.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 += -pg
+
+# 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 $@ $^
+
+# 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)
 
-$(KATI_CXX_TEST_EXES): $(filter-out main.o,$(KATI_CXX_OBJS))
-$(KATI_CXX_TEST_EXES): %: %.o
-	$(KATI_CXX) $^ -o $@
+# 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 $@
 
-version.cc: .git/HEAD .git/index
+# Rule to generate version.cc
+KATI_GIT_DIR := $(shell cd $(KATI_SRC_PATH) && git rev-parse --show-toplevel)
+$(KATI_INTERMEDIATES_PATH)/version.cc: $(KATI_GIT_DIR)/.git/HEAD $(KATI_GIT_DIR)/.git/index
+	@mkdir -p $(dir $@)
 	echo '// +build ignore' > $@
 	echo >> $@
 	echo 'const char* kGitVersion = "$(shell git rev-parse HEAD)";' >> $@
 
 ckati_clean:
-	rm -rf ckati *.o *.d $(KATI_CXX_TEST_EXES) version.cc
+	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)
 
 .PHONY: ckati_clean
 
--include *.d
+-include $(KATI_INTERMEDIATES_PATH)/*.d