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