Makefile 7.11 KB
Newer Older
1 2
ROOTDIR = $(CURDIR)

3 4
ifndef config
ifneq ("$(wildcard ./config.mk)","")
5
	config ?= config.mk
6
else
7
	config ?= make/config.mk
8 9 10 11
endif
endif

include $(config)
tqchen committed
12

13
.PHONY: clean install installdev all test doc pylint cpplint lint verilog cython cython2 cython3 web runtime
14

ziheng committed
15 16 17 18 19 20 21 22
ifndef DMLC_CORE_PATH
  DMLC_CORE_PATH = $(ROOTDIR)/dmlc-core
endif

ifndef DLPACK_PATH
  DLPACK_PATH = $(ROOTDIR)/dlpack
endif

23 24
# The source code dependencies
LIB_HALIDEIR = HalideIR/lib/libHalideIR.a
25

26 27
CC_SRC = $(filter-out src/contrib/%.cc src/runtime/%.cc,\
             $(wildcard src/*/*.cc src/*/*/*.cc))
28
METAL_SRC = $(wildcard src/runtime/metal/*.mm)
29 30 31 32
CUDA_SRC = $(wildcard src/runtime/cuda/*.cc)
OPENCL_SRC = $(wildcard src/runtime/opencl/*.cc)
RPC_SRC = $(wildcard src/runtime/rpc/*.cc)
RUNTIME_SRC = $(wildcard src/runtime/*.cc)
33 34

# Objectives
35
METAL_OBJ = $(patsubst src/%.mm, build/%.o, $(METAL_SRC))
36 37 38
CUDA_OBJ = $(patsubst src/%.cc, build/%.o, $(CUDA_SRC))
OPENCL_OBJ = $(patsubst src/%.cc, build/%.o, $(OPENCL_SRC))
RPC_OBJ = $(patsubst src/%.cc, build/%.o, $(RPC_SRC))
39 40 41
CC_OBJ = $(patsubst src/%.cc, build/%.o, $(CC_SRC))
RUNTIME_OBJ = $(patsubst src/%.cc, build/%.o, $(RUNTIME_SRC))
CONTRIB_OBJ =
tqchen committed
42

43
UNAME_S := $(shell uname -s)
44

45 46 47
# Deps
ALL_DEP = $(CC_OBJ) $(CONTRIB_OBJ) $(LIB_HALIDEIR)
RUNTIME_DEP = $(RUNTIME_OBJ)
48

49
# The flags
50
LDFLAGS = -pthread -lm -ldl
51 52
INCLUDE_FLAGS = -Iinclude -I$(DLPACK_PATH)/include -I$(DMLC_CORE_PATH)/include -IHalideIR/src -Itopi/include
CFLAGS = -std=c++11 -Wall -O2 $(INCLUDE_FLAGS) -fPIC
53
LLVM_CFLAGS= -fno-rtti -DDMLC_ENABLE_RTTI=0
54 55
FRAMEWORKS =
OBJCFLAGS = -fno-objc-arc
56
EMCC_FLAGS= -s RESERVED_FUNCTION_POINTERS=2 -s NO_EXIT_RUNTIME=1 -s MAIN_MODULE=1 -DDMLC_LOG_STACK_TRACE=0\
57
	 -std=c++11 -Oz $(INCLUDE_FLAGS)
58

59
# Dependency specific rules
60 61 62 63
ifdef CUDA_PATH
	NVCC=$(CUDA_PATH)/bin/nvcc
	CFLAGS += -I$(CUDA_PATH)/include
	LDFLAGS += -L$(CUDA_PATH)/lib64
64 65
endif

66
ifeq ($(USE_CUDA), 1)
67
	CFLAGS += -DTVM_CUDA_RUNTIME=1
68
	LDFLAGS += -lcuda -lcudart -lnvrtc
69
	RUNTIME_DEP += $(CUDA_OBJ)
70 71 72 73
else
	CFLAGS += -DTVM_CUDA_RUNTIME=0
endif

74
ifeq ($(USE_OPENCL), 1)
75 76 77 78 79 80
	CFLAGS += -DTVM_OPENCL_RUNTIME=1
	ifeq ($(UNAME_S), Darwin)
		FRAMEWORKS += -framework OpenCL
	else
		LDFLAGS += -lOpenCL
	endif
81
	RUNTIME_DEP += $(OPENCL_OBJ)
82 83 84 85
else
	CFLAGS += -DTVM_OPENCL_RUNTIME=0
endif

86
ifeq ($(USE_METAL), 1)
87 88 89 90 91 92 93 94
	CFLAGS += -DTVM_METAL_RUNTIME=1
	LDFLAGS += -lObjc
	RUNTIME_DEP += $(METAL_OBJ)
	FRAMEWORKS += -framework Metal -framework Foundation
else
	CFLAGS += -DTVM_METAL_RUNTIME=0
endif

95 96 97 98
ifeq ($(USE_RPC), 1)
	RUNTIME_DEP += $(RPC_OBJ)
endif

99
# llvm configuration
100
ifdef LLVM_CONFIG
101 102 103
	LLVM_VERSION=$(shell $(LLVM_CONFIG) --version| cut -b 1,3)
	LLVM_INCLUDE=$(filter -I%, $(shell $(LLVM_CONFIG) --cxxflags))
	LDFLAGS += $(shell $(LLVM_CONFIG) --ldflags --libs --system-libs)
104
	LLVM_CFLAGS += $(LLVM_INCLUDE) -DTVM_LLVM_VERSION=$(LLVM_VERSION)
105 106
endif

107
include make/contrib/cblas.mk
108
include make/contrib/nnpack.mk
109

110
ifdef ADD_CFLAGS
111 112 113
	CFLAGS += $(ADD_CFLAGS)
endif

114
ifdef ADD_LDFLAGS
115 116
	LDFLAGS += $(ADD_LDFLAGS)
endif
117

118 119
ifeq ($(OS),Windows_NT)
	JVM_PKG_PROFILE := windows
120
	SHARED_LIBRARY_SUFFIX := dll
121 122 123 124
else
	UNAME_S := $(shell uname -s)
	ifeq ($(UNAME_S), Darwin)
		JVM_PKG_PROFILE := osx-x86_64
125
		SHARED_LIBRARY_SUFFIX := dylib
126 127
	else
		JVM_PKG_PROFILE := linux-x86_64
128
		SHARED_LIBRARY_SUFFIX := so
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
	endif
endif

JVM_TEST_ARGS := $(if $(JVM_TEST_ARGS),$(JVM_TEST_ARGS),-DskipTests -Dcheckstyle.skip=true)

ifeq ($(USE_CUDA), 1)
	JVM_PKG_PROFILE := $(JVM_PKG_PROFILE)-gpu
else ifeq ($(USE_OPENCL), 1)
	JVM_PKG_PROFILE := $(JVM_PKG_PROFILE)-gpu
else ifeq ($(USE_METAL), 1)
	JVM_PKG_PROFILE := $(JVM_PKG_PROFILE)-gpu
else
	JVM_PKG_PROFILE := $(JVM_PKG_PROFILE)-cpu
endif

144 145 146 147 148
BUILD_TARGETS ?= lib/libtvm.$(SHARED_LIBRARY_SUFFIX) lib/libtvm_runtime.$(SHARED_LIBRARY_SUFFIX)
all: ${BUILD_TARGETS}
runtime: lib/libtvm_runtime.$(SHARED_LIBRARY_SUFFIX)
web: lib/libtvm_web_runtime.js lib/libtvm_web_runtime.bc

tqchen committed
149 150 151 152
include tests/cpp/unittest.mk

test: $(TEST)

153 154 155
include verilog/verilog.mk
verilog: $(VER_LIBS)

156 157 158

# Special rules for LLVM related modules.
build/codegen/llvm/%.o: src/codegen/llvm/%.cc
tqchen committed
159
	@mkdir -p $(@D)
Tianqi Chen committed
160
	$(CXX) $(CFLAGS) $(LLVM_CFLAGS) -MM -MT build/codegen/llvm/$*.o $< >build/codegen/llvm/$*.d
161
	$(CXX) -c $(CFLAGS) $(LLVM_CFLAGS) -c $< -o $@
tqchen committed
162

163
build/runtime/metal/%.o: src/runtime/metal/%.mm
164
	@mkdir -p $(@D)
Tianqi Chen committed
165
	$(CXX) $(OBJCFLAGS) $(CFLAGS) -MM -MT build/runtime/metal/$*.o $< >build/runtime/metal/$*.d
166 167
	$(CXX) $(OBJCFLAGS) -c $(CFLAGS) -c $< -o $@

168 169 170 171 172
build/%.o: src/%.cc
	@mkdir -p $(@D)
	$(CXX) $(CFLAGS) -MM -MT build/$*.o $< >build/$*.d
	$(CXX) -c $(CFLAGS) -c $< -o $@

173 174 175 176 177 178 179 180
lib/libtvm.dylib: $(ALL_DEP) $(RUNTIME_DEP)
	@mkdir -p $(@D)
	$(CXX) $(CFLAGS) $(FRAMEWORKS) -shared -o $@ $(filter %.o %.a, $^) $(LDFLAGS)

lib/libtvm_runtime.dylib: $(RUNTIME_DEP)
	@mkdir -p $(@D)
	$(CXX) $(CFLAGS) $(FRAMEWORKS) -shared -o $@ $(filter %.o %.a, $^) $(LDFLAGS)

181
lib/libtvm.so: $(ALL_DEP) $(RUNTIME_DEP)
tqchen committed
182
	@mkdir -p $(@D)
183
	$(CXX) $(CFLAGS) $(FRAMEWORKS) -shared -o $@ $(filter %.o %.a, $^) $(LDFLAGS)
tqchen committed
184

185
lib/libtvm_runtime.so: $(RUNTIME_DEP)
tqchen committed
186
	@mkdir -p $(@D)
187
	$(CXX) $(CFLAGS) $(FRAMEWORKS) -shared -o $@ $(filter %.o %.a, $^) $(LDFLAGS)
tqchen committed
188

189 190 191 192 193 194 195 196 197
lib/libtvm_web_runtime.bc: web/web_runtime.cc
	@mkdir -p build/web
	@mkdir -p $(@D)
	$(CXX) $(CFLAGS) -MM -MT lib/libtvm_web_runtime.bc $< >build/web/web_runtime.d
	emcc $(EMCC_FLAGS) -o $@ web/web_runtime.cc

lib/libtvm_web_runtime.js: lib/libtvm_web_runtime.bc
	@mkdir -p $(@D)
	emcc $(EMCC_FLAGS) -o $@ lib/libtvm_web_runtime.bc
198

199
$(LIB_HALIDEIR): LIBHALIDEIR
200 201 202 203

LIBHALIDEIR:
	+ cd HalideIR; make lib/libHalideIR.a ; cd $(ROOTDIR)

204
cpplint:
205
	python dmlc-core/scripts/lint.py topi cpp topi/include;
206 207
	python dmlc-core/scripts/lint.py tvm cpp include src verilog\
	 examples/extension/src examples/graph_executor/src
208 209 210

pylint:
	pylint python/tvm --rcfile=$(ROOTDIR)/tests/lint/pylintrc
211
	pylint topi/python/topi --rcfile=$(ROOTDIR)/tests/lint/pylintrc
212

213
jnilint:
214 215 216
	python dmlc-core/scripts/lint.py tvm4j-jni cpp jvm/native/src

lint: cpplint pylint jnilint
tqchen committed
217

218 219 220
doc:
	doxygen docs/Doxyfile

221 222 223 224 225 226 227 228 229 230 231 232
install: lib/libtvm_runtime.$(SHARED_LIBRARY_SUFFIX)
	mkdir -p $(DESTDIR)$(PREFIX)/include/tvm/runtime
	cp -R include/tvm/runtime/. $(DESTDIR)$(PREFIX)/include/tvm/runtime
	cp lib/libtvm_runtime.$(SHARED_LIBRARY_SUFFIX) $(DESTDIR)$(PREFIX)/lib

installdev: lib/libtvm.$(SHARED_LIBRARY_SUFFIX) lib/libtvm_runtime.$(SHARED_LIBRARY_SUFFIX) lib/libtvm.a
	mkdir -p $(DESTDIR)$(PREFIX)/include
	cp -R include/tvm $(DESTDIR)$(PREFIX)/include
	cp lib/libtvm.$(SHARED_LIBRARY_SUFFIX) $(DESTDIR)$(PREFIX)/lib
	cp lib/libtvm_runtime.$(SHARED_LIBRARY_SUFFIX) $(DESTDIR)$(PREFIX)/lib
	cp lib/libtvm.a $(DESTDIR)$(PREFIX)/lib

233 234 235 236 237 238 239 240 241 242 243
# Cython build
cython:
	cd python; python setup.py build_ext --inplace

cython2:
	cd python; python2 setup.py build_ext --inplace

cython3:
	cd python; python3 setup.py build_ext --inplace

cyclean:
244
	rm -rf python/tvm/*/*/*.so python/tvm/*/*/*.dylib python/tvm/*/*/*.cpp
245

246 247 248 249 250 251
jvmpkg:
	(cd $(ROOTDIR)/jvm; \
		mvn clean package -P$(JVM_PKG_PROFILE) -Dcxx="$(CXX)" \
			-Dcflags="$(CFLAGS)" -Dldflags="$(LDFLAGS)" \
			-Dcurrent_libdir="$(ROOTDIR)/lib" $(JVM_TEST_ARGS))

tqchen committed
252
clean:
tqchen committed
253
	$(RM) -rf build lib bin *~ */*~ */*/*~ */*/*/*~ */*.o */*/*.o */*/*/*.o */*.d */*/*.d */*/*/*.d
254
	cd HalideIR; make clean; cd $(ROOTDIR)
tqchen committed
255 256 257

-include build/*.d
-include build/*/*.d
258
-include build/*/*/*.d
Tianqi Chen committed
259
-include build/*/*/*/*.d