1b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
2b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# Find where we're running from, so we can store generated files here.
3b2db981a6731e978453862a73dab892bc674db68Sourabh Bajajifeq ($(origin MAKEFILE_DIR), undefined)
4b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	MAKEFILE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
5b2db981a6731e978453862a73dab892bc674db68Sourabh Bajajendif
6b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
7b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# Try to figure out the host system
8b2db981a6731e978453862a73dab892bc674db68Sourabh BajajHOST_OS :=
9b2db981a6731e978453862a73dab892bc674db68Sourabh Bajajifeq ($(OS),Windows_NT)
10b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	HOST_OS = WINDOWS
11b2db981a6731e978453862a73dab892bc674db68Sourabh Bajajelse
12b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	UNAME_S := $(shell uname -s)
13b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	ifeq ($(UNAME_S),Linux)
14b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	        HOST_OS := LINUX
15b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	endif
16b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	ifeq ($(UNAME_S),Darwin)
17b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj		HOST_OS := OSX
18b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	endif
19b2db981a6731e978453862a73dab892bc674db68Sourabh Bajajendif
20b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
21b2db981a6731e978453862a73dab892bc674db68Sourabh BajajARCH := $(shell if [[ $(shell uname -m) =~ i[345678]86 ]]; then echo x86_32; else echo $(shell uname -m); fi)
22b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
23b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# Where compiled objects are stored.
24b2db981a6731e978453862a73dab892bc674db68Sourabh BajajOBJDIR := $(MAKEFILE_DIR)/gen/obj/
25b2db981a6731e978453862a73dab892bc674db68Sourabh BajajBINDIR := $(MAKEFILE_DIR)/gen/bin/
26b2db981a6731e978453862a73dab892bc674db68Sourabh BajajLIBDIR := $(MAKEFILE_DIR)/gen/lib/
27b2db981a6731e978453862a73dab892bc674db68Sourabh BajajGENDIR := $(MAKEFILE_DIR)/gen/obj/
28b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
29b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# Settings for the host compiler.
30b2db981a6731e978453862a73dab892bc674db68Sourabh BajajCXX := $(CC_PREFIX) gcc
31b2db981a6731e978453862a73dab892bc674db68Sourabh BajajCXXFLAGS := --std=c++11 -O3 -DNDEBUG
32b2db981a6731e978453862a73dab892bc674db68Sourabh BajajCC := $(CC_PREFIX) gcc
33b2db981a6731e978453862a73dab892bc674db68Sourabh BajajCFLAGS :=
34b2db981a6731e978453862a73dab892bc674db68Sourabh BajajLDOPTS :=
35b2db981a6731e978453862a73dab892bc674db68Sourabh BajajLDOPTS += -L/usr/local/lib
36b2db981a6731e978453862a73dab892bc674db68Sourabh BajajARFLAGS := -r
37b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
38b2db981a6731e978453862a73dab892bc674db68Sourabh BajajINCLUDES := \
39b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-I. \
40b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-I$(MAKEFILE_DIR)/../../../ \
41b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-I$(MAKEFILE_DIR)/downloads/ \
42b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-I$(MAKEFILE_DIR)/downloads/eigen \
43b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-I$(MAKEFILE_DIR)/downloads/gemmlowp \
44b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-I$(MAKEFILE_DIR)/downloads/neon_2_sse \
45b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-I$(MAKEFILE_DIR)/downloads/farmhash/src \
46b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-I$(MAKEFILE_DIR)/downloads/flatbuffers/include \
47b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-I$(GENDIR)
48b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# This is at the end so any globally-installed frameworks like protobuf don't
49b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# override local versions in the source tree.
50b2db981a6731e978453862a73dab892bc674db68Sourabh BajajINCLUDES += -I/usr/local/include
51b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
52b2db981a6731e978453862a73dab892bc674db68Sourabh BajajLIBS := \
53b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-lstdc++ \
54b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-lpthread \
55b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-lm \
56b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-lz
57b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
58b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# If we're on Linux, also link in the dl library.
59e523d9370ce36e50ba64f9dd1260eaddbbb8244eA. Unique TensorFlowerifeq ($(HOST_OS),LINUX)
60b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	LIBS += -ldl -lpthread
61b2db981a6731e978453862a73dab892bc674db68Sourabh Bajajendif
62b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
63b2db981a6731e978453862a73dab892bc674db68Sourabh Bajajinclude $(MAKEFILE_DIR)/ios_makefile.inc
64b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
65b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# This library is the main target for this makefile. It will contain a minimal
66b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# runtime that can be linked in to other programs.
67b2db981a6731e978453862a73dab892bc674db68Sourabh BajajLIB_NAME := libtensorflow-lite.a
68b2db981a6731e978453862a73dab892bc674db68Sourabh BajajLIB_PATH := $(LIBDIR)$(LIB_NAME)
69b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
70b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# A small example program that shows how to link against the library.
71b2db981a6731e978453862a73dab892bc674db68Sourabh BajajBENCHMARK_PATH := $(BINDIR)benchmark_model
72b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
73b2db981a6731e978453862a73dab892bc674db68Sourabh BajajBENCHMARK_SRCS := \
74b2db981a6731e978453862a73dab892bc674db68Sourabh Bajajtensorflow/contrib/lite/tools/benchmark_model.cc
75b2db981a6731e978453862a73dab892bc674db68Sourabh BajajBENCHMARK_OBJS := $(addprefix $(OBJDIR), \
76b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(BENCHMARK_SRCS))))
77b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
78b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# What sources we want to compile, must be kept in sync with the main Bazel
79b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# build files.
80b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
81b2db981a6731e978453862a73dab892bc674db68Sourabh BajajCORE_CC_ALL_SRCS := \
82b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/*.cc) \
83b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/kernels/*.cc) \
84b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/kernels/internal/*.cc) \
85b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/kernels/internal/optimized/*.cc) \
86b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/kernels/internal/reference/*.cc) \
87b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/*.c) \
88b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/kernels/*.c) \
89b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/kernels/internal/*.c) \
90b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/kernels/internal/optimized/*.c) \
91b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/kernels/internal/reference/*.c) \
92b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/downloads/farmhash/src/farmhash.cc)
93b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# Remove any duplicates.
94b2db981a6731e978453862a73dab892bc674db68Sourabh BajajCORE_CC_ALL_SRCS := $(sort $(CORE_CC_ALL_SRCS))
95b2db981a6731e978453862a73dab892bc674db68Sourabh BajajCORE_CC_EXCLUDE_SRCS := \
96b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/*test.cc) \
97b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/*/*test.cc) \
98b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/*/*/*test.cc) \
99b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/*/*/*/*test.cc) \
100b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(wildcard tensorflow/contrib/lite/kernels/test_util.cc) \
101b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(BENCHMARK_SRCS)
102b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# Filter out all the excluded files.
103b2db981a6731e978453862a73dab892bc674db68Sourabh BajajTF_LITE_CC_SRCS := $(filter-out $(CORE_CC_EXCLUDE_SRCS), $(CORE_CC_ALL_SRCS))
104b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# File names of the intermediate files target compilation generates.
105b2db981a6731e978453862a73dab892bc674db68Sourabh BajajTF_LITE_CC_OBJS := $(addprefix $(OBJDIR), \
106b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(TF_LITE_CC_SRCS))))
107b2db981a6731e978453862a73dab892bc674db68Sourabh BajajLIB_OBJS := $(TF_LITE_CC_OBJS)
108b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
109b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# For normal manually-created TensorFlow C++ source files.
110b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(OBJDIR)%.o: %.cc
111b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	@mkdir -p $(dir $@)
112b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
113b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
114b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# For normal manually-created TensorFlow C++ source files.
115b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(OBJDIR)%.o: %.c
116b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	@mkdir -p $(dir $@)
117b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	$(CC) $(CCFLAGS) $(INCLUDES) -c $< -o $@
118b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
119b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# The target that's compiled if there's no command-line arguments.
120b2db981a6731e978453862a73dab892bc674db68Sourabh Bajajall: $(LIB_PATH) $(BENCHMARK_PATH)
121b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
122b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# Gathers together all the objects we've compiled into a single '.a' archive.
123b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(LIB_PATH): $(LIB_OBJS)
124b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	@mkdir -p $(dir $@)
125b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	$(AR) $(ARFLAGS) $(LIB_PATH) $(LIB_OBJS)
126b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
127b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(BENCHMARK_PATH): $(BENCHMARK_OBJS) $(LIB_PATH)
128b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	@mkdir -p $(dir $@)
129b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	$(CXX) $(CXXFLAGS) $(INCLUDES) \
130b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	-o $(BENCHMARK_PATH) $(BENCHMARK_OBJS) \
131b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	$(LIBFLAGS) $(LIB_PATH) $(LDFLAGS) $(LIBS)
132b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
133b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# Gets rid of all generated files.
134b2db981a6731e978453862a73dab892bc674db68Sourabh Bajajclean:
135b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	rm -rf $(MAKEFILE_DIR)/gen
136b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
137b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# Gets rid of target files only, leaving the host alone. Also leaves the lib
138b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# directory untouched deliberately, so we can persist multiple architectures
139b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj# across builds for iOS and Android.
140b2db981a6731e978453862a73dab892bc674db68Sourabh Bajajcleantarget:
141b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	rm -rf $(OBJDIR)
142b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj	rm -rf $(BINDIR)
143b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
144b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj$(DEPDIR)/%.d: ;
145b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj.PRECIOUS: $(DEPDIR)/%.d
146b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj
147b2db981a6731e978453862a73dab892bc674db68Sourabh Bajaj-include $(patsubst %,$(DEPDIR)/%.d,$(basename $(TF_CC_SRCS)))
148