# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. export MXNET_ROOT=`pwd`/.. export TPARTYDIR=`pwd`/../3rdparty # Change this to path or specify in make command ifndef OPENBLAS_ROOT export OPENBLAS_ROOT=/usr/local/opt/openblas endif # Whether use minimum build without blas and SSE, this will make the library super slow ifndef MIN export MIN=0 DEFS=-DMSHADOW_USE_CBLAS=1 else DEFS=-DMSHADOW_USE_CBLAS=0 endif ifndef ANDROID export ANDROID=0 else DEFS+=-DMSHADOW_USE_SSE=0 endif # Use locally installed emscripten if not specified ifndef EMCC EMCC=emcc endif ifndef DISABLE_OPENMP DEFS+=-DDISABLE_OPENMP=1 endif .PHONY: all clean DEFS+=-DMSHADOW_USE_CUDA=0 -DMSHADOW_USE_MKL=0 -DMSHADOW_RABIT_PS=0 -DMSHADOW_DIST_PS=0 -DDMLC_LOG_STACK_TRACE=0 DEFS+=-DMSHADOW_FORCE_STREAM -DMXNET_USE_OPENCV=0 -DMXNET_PREDICT_ONLY=1 CFLAGS=-std=c++11 -Wno-unknown-pragmas -Wall $(DEFS) # if architecture of the CPU supports F16C instruction set, enable USE_F16C for fast fp16 computation on CPU ifeq ($(USE_F16C), 1) CFLAGS+=-mf16c else DEFS+=-DMSHADOW_USE_F16C=0 endif ifneq ($(MIN), 1) CFLAGS += -I${OPENBLAS_ROOT} -I${OPENBLAS_ROOT}/include LDFLAGS+= -L${OPENBLAS_ROOT} -L${OPENBLAS_ROOT}/lib # Define which blas is installed. Uses OpenBLAS by default. ifeq ($(USE_BLAS), atlas) LDFLAGS += -lcblas else ifeq ($(USE_BLAS), blas) LDFLAGS += -lblas else LDFLAGS += -lopenblas endif endif all: android libmxnet_predict.a ${MXNET_ROOT}/lib/libmxnet_predict.so nnvm.d: ./prep_nnvm.sh dmlc.d: dmlc-minimum0.cc ${CXX} ${CFLAGS} -M -MT dmlc-minimum0.o \ -I ${TPARTYDIR}/dmlc-core/include \ -D__MIN__=$(MIN) $+ > dmlc.d mxnet_predict0.d: mxnet_predict0.cc nnvm.d dmlc.d ${CXX} ${CFLAGS} -M -MT mxnet_predict0.o \ -I ${MXNET_ROOT}/ -I ${TPARTYDIR}/mshadow/ -I ${TPARTYDIR}/dmlc-core/include -I ${TPARTYDIR}/dmlc-core/src \ -I ${TPARTYDIR}/tvm/nnvm/include \ -I ${MXNET_ROOT}/3rdparty/dlpack/include \ -I ${MXNET_ROOT}/include \ -D__MIN__=$(MIN) mxnet_predict0.cc > mxnet_predict0.d cat dmlc.d >> mxnet_predict0.d cat nnvm.d >> mxnet_predict0.d mxnet_predict-all.cc: mxnet_predict0.d dmlc-minimum0.cc nnvm.cc mxnet_predict0.cc @echo "Generating amalgamation to " $@ python ./amalgamation.py $+ $@ $(MIN) $(ANDROID) mxnet_predict-all.o: mxnet_predict-all.cc ${CXX} ${CFLAGS} -fPIC -o $@ -c $+ libmxnet_predict.a: mxnet_predict-all.o ar rcs libmxnet_predict.a $+ jni_libmxnet_predict.o: mxnet_predict-all.cc jni/predictor.cc ${CXX} ${CFLAGS} -fPIC -o $@ -c jni/predictor.cc jni_libmxnet_predict.so: jni_libmxnet_predict.o ${CXX} ${CFLAGS} -shared -o $@ $(filter %.o %.a, $^) $(LDFLAGS) ifneq ($(ANDROID), 1) android: else CFLAGS+= -O3 LDFLAGS+= -Wl,--no-warn-mismatch -lm_hard android: jni_libmxnet_predict.so endif libmxnet_predict.js: mxnet_predict-all.cc ${EMCC} -std=c++11 -O2 $(DEFS) -DMSHADOW_USE_SSE=0 -D__MXNET_JS__ -o $@ $+ \ -s EXPORTED_FUNCTIONS="['_MXPredCreate', \ '_MXPredGetOutputShape', \ '_MXPredSetInput', \ '_MXPredForward', \ '_MXPredPartialForward', \ '_MXPredGetOutput', \ '_MXPredFree', \ '_MXNDListCreate', \ '_MXNDListGet', \ '_MXNDListFree']" \ -s ALLOW_MEMORY_GROWTH=1 ${MXNET_ROOT}/lib/libmxnet_predict.so: mxnet_predict-all.o @mkdir -p ${MXNET_ROOT}/lib ${CXX} ${CFLAGS} -shared -o $@ $(filter %.o %.a, $^) $(LDFLAGS) ls -alh $@ clean: rm -f *.d *.o *.so *.a *.js *.js.mem mxnet_predict-all.cc nnvm.cc