2015-09-02 18:43:31 +03:00
# Makefile for a Linux/GCC build of CNTK
#
# The Linux and Windows versions are not different branches, but rather build off the same
# source files, using different makefiles. This current makefile has the purpose of enabling
# work to make all sources compile with GCC, and also to check for GCC-compat regressions due to
# modifications which are currently done under Windows.
#
# To use this Makefile, create a directory to build in and make a Config.make in the directory
# that provides
2016-02-29 22:58:13 +03:00
# BUILDTYPE= One of release or debug
# defaults to release
2016-06-14 18:39:24 +03:00
# MKL_PATH= path to CNTK custom MKL installation
# only needed if MATHLIB=mkl
# CNTK_CUSTOM_MKL_VERSION=2
# version for the CNTK custom MKL installation
# MKL_THREADING=parallel|sequential
2016-02-29 22:58:13 +03:00
# only needed if MATHLIB=mkl
2016-07-27 17:14:34 +03:00
# GDK_INCLUDE_PATH= path to CUDA GDK include path, so $(GDK_INCLUDE_PATH)/nvml.h exists
# defaults to /usr/include/nvidia/gdk
# GDK_NVML_LIB_PATH= path to CUDA GDK (stub) library path, so $(GDK_NVML_LIB_PATH)/libnvidia-ml.so exists
# defaults to /usr/src/gdk/nvml/lib
2016-08-16 15:59:15 +03:00
# MATHLIB= mkl
# defaults to mkl
2016-02-29 22:58:13 +03:00
# CUDA_PATH= Path to CUDA
# If not specified, GPU will not be enabled
# CUB_PATH= path to NVIDIA CUB installation, so $(CUB_PATH)/cub/cub.cuh exists
# defaults to /usr/local/cub-1.4.1
# CUDNN_PATH= path to NVIDIA cuDNN installation so $(CUDNN_PATH)/cuda/include/cudnn.h exists
2016-08-08 10:13:39 +03:00
# CuDNN version needs to be 5.0 or higher.
2016-02-29 22:58:13 +03:00
# KALDI_PATH= Path to Kaldi
# If not specified, Kaldi plugins will not be built
2016-07-19 10:34:31 +03:00
# OPENCV_PATH= path to OpenCV 3.1.0 installation, so $(OPENCV_PATH) exists
# defaults to /usr/local/opencv-3.1.0
2016-02-29 22:58:13 +03:00
# LIBZIP_PATH= path to libzip installation, so $(LIBZIP_PATH) exists
# defaults to /usr/local/
2016-07-19 10:34:31 +03:00
# BOOST_PATH= path to Boost installation, so $(BOOST_PATH)/include/boost/test/unit_test.hpp
# defaults to /usr/local/boost-1.60.0
2016-02-29 22:58:13 +03:00
# These can be overridden on the command line, e.g. make BUILDTYPE=debug
2015-09-02 18:43:31 +03:00
2016-06-27 12:43:56 +03:00
# TODO: Build static libraries for common dependencies that are shared by multiple
# targets, e.g. eval and CNTK.
2016-03-11 21:22:21 +03:00
ARCH = $( shell uname)
2015-09-02 18:43:31 +03:00
i f n d e f B U I L D _ T O P
BUILD_TOP = .
e n d i f
i f n e q ( "$(wildcard $(BUILD_TOP)/Config.make)" , "" )
include $( BUILD_TOP) /Config.make
e l s e
2016-01-22 18:27:50 +03:00
$( error Cannot find $( BUILD_TOP) /Config.make. Please see CNTK Wiki at https://github.com/Microsoft/cntk/wiki for configuration instructions.)
2015-09-02 18:43:31 +03:00
e n d i f
i f n d e f B U I L D T Y P E
$( info Defaulting BUILDTYPE =release )
BUILDTYPE = release
e n d i f
i f n d e f M A T H L I B
2016-08-16 15:59:15 +03:00
$( info DEFAULTING MATHLIB =mkl )
MATHLIB = mkl
2015-09-02 18:43:31 +03:00
e n d i f
#### Configure based on options above
# The mpic++ wrapper only adds MPI specific flags to the g++ command line.
# The actual compiler/linker flags added can be viewed by running 'mpic++ --showme:compile' and 'mpic++ --showme:link'
CXX = mpic++
2015-12-15 11:58:24 +03:00
SOURCEDIR := Source
2016-06-11 22:21:15 +03:00
INCLUDEPATH := $( addprefix $( SOURCEDIR) /, Common/Include CNTKv2LibraryDll CNTKv2LibraryDll/API Math CNTK ActionsLib ComputationNetworkLib SGDLib SequenceTrainingLib CNTK/BrainScript Readers/ReaderLib)
2016-02-11 04:50:53 +03:00
# COMMON_FLAGS include settings that are passed both to NVCC and C++ compilers.
COMMON_FLAGS := -D_POSIX_SOURCE -D_XOPEN_SOURCE= 600 -D__USE_XOPEN2K -std= c++11
CPPFLAGS :=
2016-07-12 17:36:38 +03:00
CXXFLAGS := -msse4.1 -mssse3 -std= c++0x -fopenmp -fpermissive -fPIC -Werror -fcheck-new
2015-09-02 18:43:31 +03:00
LIBPATH :=
LIBS :=
LDFLAGS :=
2015-10-01 01:02:05 +03:00
CXXVER_GE480 := $( shell expr ` $( CXX) -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$/&00/' ` \> = 40800)
i f e q ( $( CXXVER_GE 480) , 1 )
CXXFLAGS += -Wno-error= literal-suffix
e n d i f
2015-09-02 18:43:31 +03:00
SEPARATOR = "=-----------------------------------------------------------="
ALL :=
SRC :=
# Make sure all is the first (i.e. default) target, but we can't actually define it
# this early in the file, so let buildall do the work.
all : buildall
# Set up basic nvcc options and add CUDA targets from above
2016-02-11 04:50:53 +03:00
CUFLAGS = -m 64
2015-09-02 18:43:31 +03:00
i f d e f C U D A _ P A T H
2016-07-27 17:14:34 +03:00
ifndef GDK_INCLUDE_PATH
GDK_INCLUDE_PATH = /usr/include/nvidia/gdk
$( info defaulting GDK_INCLUDE_PATH to $( GDK_INCLUDE_PATH) )
endif
ifndef GDK_NVML_LIB_PATH
GDK_NVML_LIB_PATH = /usr/src/gdk/nvml/lib
$( info defaulting GDK_NVML_LIB_PATH to $( GDK_NVML_LIB_PATH) )
2015-10-13 02:36:40 +03:00
endif
ifndef CUB_PATH
$( info defaulting CUB_PATH to /usr/local/cub-1.4.1)
CUB_PATH = /usr/local/cub-1.4.1
endif
2015-09-02 18:43:31 +03:00
DEVICE = gpu
NVCC = $( CUDA_PATH) /bin/nvcc
2016-07-27 17:14:34 +03:00
INCLUDEPATH += $( GDK_INCLUDE_PATH)
2015-10-13 02:36:40 +03:00
INCLUDEPATH += $( CUB_PATH)
2015-09-02 18:43:31 +03:00
# Set up CUDA includes and libraries
INCLUDEPATH += $( CUDA_PATH) /include
LIBPATH += $( CUDA_PATH) /lib64
LIBS += -lcublas -lcudart -lcuda -lcurand -lcusparse -lnvidia-ml
2015-11-17 23:58:19 +03:00
# Set up cuDNN if needed
ifdef CUDNN_PATH
INCLUDEPATH += $( CUDNN_PATH) /cuda/include
LIBPATH += $( CUDNN_PATH) /cuda/lib64
LIBS += -lcudnn
2016-02-11 04:50:53 +03:00
COMMON_FLAGS += -DUSE_CUDNN
2015-11-17 23:58:19 +03:00
endif
2015-09-02 18:43:31 +03:00
e l s e
DEVICE = cpu
2016-02-11 04:50:53 +03:00
COMMON_FLAGS += -DCPUONLY
2015-09-02 18:43:31 +03:00
e n d i f
i f e q ( "$(MATHLIB)" , "mkl" )
2016-06-14 18:39:24 +03:00
INCLUDEPATH += $( MKL_PATH) /$( CNTK_CUSTOM_MKL_VERSION) /include
LIBS += -lm
i f e q ( "$(MKL_THREADING)" , "sequential" )
LIBPATH += $( MKL_PATH) /$( CNTK_CUSTOM_MKL_VERSION) /x64/sequential
LIBS += -lmkl_cntk_s
e l s e
LIBPATH += $( MKL_PATH) /$( CNTK_CUSTOM_MKL_VERSION) /x64/parallel
LIBS += -lmkl_cntk_p -liomp5 -lpthread
e n d i f
2016-02-11 04:50:53 +03:00
COMMON_FLAGS += -DUSE_MKL
2015-09-02 18:43:31 +03:00
e n d i f
2016-01-30 02:44:37 +03:00
i f e q ( "$(MATHLIB)" , "openblas" )
INCLUDEPATH += $( OPENBLAS_PATH) /include
LIBPATH += $( OPENBLAS_PATH) /lib
LIBS += -lopenblas -lm -lpthread
CPPFLAGS += -DUSE_OPENBLAS
e n d i f
2015-09-02 18:43:31 +03:00
i f d e f K A L D I _ P A T H
########## Copy includes and defines from $(KALDI_PATH)/src/kaldi.mk ##########
FSTROOT = $( KALDI_PATH) /tools/openfst
ATLASINC = $( KALDI_PATH) /tools/ATLAS/include
INCLUDEPATH += $( KALDI_PATH) /src $( ATLASINC) $( FSTROOT) /include
CPPFLAGS += -DKALDI_DOUBLEPRECISION= 0 -DHAVE_POSIX_MEMALIGN -DHAVE_EXECINFO_H= 1 -DHAVE_CXXABI_H -DHAVE_ATLAS -DHAVE_OPENFST_GE_10400
KALDI_LIBPATH += $( KALDI_PATH) /src/lib
KALDI_LIBS += -lkaldi-util -lkaldi-matrix -lkaldi-base -lkaldi-hmm -lkaldi-cudamatrix -lkaldi-nnet -lkaldi-lat
e n d i f
2016-06-21 23:02:39 +03:00
i f d e f S U P P O R T _ A V X 2
CPPFLAGS += -mavx2
e n d i f
2015-09-03 22:17:17 +03:00
# Set up nvcc target architectures (will generate code to support them all, i.e. fat-binary, in release mode)
# In debug mode we will rely on JIT to create code "on the fly" for the underlying architecture
GENCODE_SM30 := -gencode arch = compute_30,code= \" sm_30,compute_30\"
GENCODE_SM35 := -gencode arch = compute_35,code= \" sm_35,compute_35\"
GENCODE_SM50 := -gencode arch = compute_50,code= \" sm_50,compute_50\"
2016-05-02 19:48:46 +03:00
# Should we relocate *.gcno and *.gcda files using -fprofile-dir option?
# Use GCOV_PREFIX and GCOV_PREFIX_STRIP if relocating:
# For example, if the object file /user/build/foo.o was built with -fprofile-arcs, the final executable will try to create the data file
# /user/build/foo.gcda when running on the target system. This will fail if the corresponding directory does not exist and it is unable
2016-05-19 12:02:48 +03:00
# to create it. This can be overcome by, for example, setting the environment as 'GCOV_PREFIX=/target/run' and 'GCOV_PREFIX_STRIP=1'.
2016-05-02 19:48:46 +03:00
# Such a setting will name the data file /target/run/build/foo.gcda
i f d e f C N T K _ C O D E _ C O V E R A G E
CXXFLAGS += -fprofile-arcs -ftest-coverage
LDFLAGS += -lgcov --coverage
e n d i f
2015-09-02 18:43:31 +03:00
i f e q ( "$(BUILDTYPE)" , "debug" )
2015-09-18 02:57:26 +03:00
ifdef CNTK_CUDA_CODEGEN_DEBUG
GENCODE_FLAGS := $( CNTK_CUDA_CODEGEN_DEBUG)
else
2016-06-15 21:10:07 +03:00
GENCODE_FLAGS := $( GENCODE_SM30)
2015-09-18 02:57:26 +03:00
endif
2015-09-02 18:43:31 +03:00
CXXFLAGS += -g
2015-11-26 04:20:56 +03:00
LDFLAGS += -rdynamic
2016-03-01 22:02:18 +03:00
COMMON_FLAGS += -D_DEBUG -DNO_SYNC
2016-01-09 03:41:45 +03:00
CUFLAGS += -O0 -g -use_fast_math -lineinfo $( GENCODE_FLAGS)
2015-09-02 18:43:31 +03:00
e n d i f
i f e q ( "$(BUILDTYPE)" , "release" )
2015-09-18 02:57:26 +03:00
ifdef CNTK_CUDA_CODEGEN_RELEASE
GENCODE_FLAGS := $( CNTK_CUDA_CODEGEN_RELEASE)
else
2016-06-15 21:10:07 +03:00
GENCODE_FLAGS := $( GENCODE_SM30) $( GENCODE_SM35) $( GENCODE_SM50)
2015-09-18 02:57:26 +03:00
endif
2016-01-26 08:55:48 +03:00
CXXFLAGS += -g -O4
LDFLAGS += -rdynamic
2016-03-01 21:35:21 +03:00
COMMON_FLAGS += -DNDEBUG -DNO_SYNC
2016-01-26 08:56:18 +03:00
CUFLAGS += -O3 -g -use_fast_math -lineinfo $( GENCODE_FLAGS)
2015-09-02 18:43:31 +03:00
e n d i f
2015-10-25 00:31:34 +03:00
i f d e f C N T K _ C U D A _ D E V I C E _ D E B U G I N F O
CUFLAGS += -G
e n d i f
2015-09-02 18:43:31 +03:00
#######
OBJDIR := $( BUILD_TOP) /.build
BINDIR := $( BUILD_TOP) /bin
LIBDIR := $( BUILD_TOP) /lib
ORIGINLIBDIR := '$$ORIGIN/../lib'
ORIGINDIR := '$$ORIGIN'
CNTKMATH := cntkmath
2016-06-27 19:17:39 +03:00
RPATH = -Wl,-rpath,
2015-11-25 03:38:37 +03:00
########################################
2015-12-15 11:58:24 +03:00
# Build info
2015-11-25 03:38:37 +03:00
########################################
2015-12-15 11:58:24 +03:00
BUILDINFO := $( SOURCEDIR) /CNTK/buildinfo.h
2015-12-16 17:24:49 +03:00
GENBUILD := Tools/generate_build_info
2015-11-25 03:38:37 +03:00
2016-03-11 21:22:21 +03:00
BUILDINFO_OUTPUT := $( shell $( GENBUILD) $( BUILD_TOP) /Config.make && echo Success)
i f n e q ( "$(BUILDINFO_OUTPUT)" , "Success" )
$( error Could not generate $( BUILDINFO) )
e n d i f
2015-11-25 03:38:37 +03:00
2015-09-02 18:43:31 +03:00
########################################
# Math library
########################################
# Define all sources that need to be built
2016-01-25 18:49:09 +03:00
READER_SRC = \
2016-02-02 15:31:59 +03:00
$( SOURCEDIR) /Readers/ReaderLib/BlockRandomizer.cpp \
2016-02-19 18:38:42 +03:00
$( SOURCEDIR) /Readers/ReaderLib/Bundler.cpp \
2016-02-02 15:31:59 +03:00
$( SOURCEDIR) /Readers/ReaderLib/NoRandomizer.cpp \
$( SOURCEDIR) /Readers/ReaderLib/ReaderShim.cpp \
2016-03-07 18:06:40 +03:00
$( SOURCEDIR) /Readers/ReaderLib/ChunkRandomizer.cpp \
$( SOURCEDIR) /Readers/ReaderLib/SequenceRandomizer.cpp \
2016-03-16 19:21:38 +03:00
$( SOURCEDIR) /Readers/ReaderLib/SequencePacker.cpp \
2016-04-22 12:27:02 +03:00
$( SOURCEDIR) /Readers/ReaderLib/TruncatedBpttPacker.cpp \
2016-03-30 14:06:08 +03:00
$( SOURCEDIR) /Readers/ReaderLib/PackerBase.cpp \
2016-04-07 15:34:42 +03:00
$( SOURCEDIR) /Readers/ReaderLib/FramePacker.cpp \
2016-09-06 21:05:13 +03:00
$( SOURCEDIR) /Readers/ReaderLib/ReaderBase.cpp \
2016-05-18 11:30:21 +03:00
$( SOURCEDIR) /Readers/ReaderLib/ChunkCache.cpp \
2016-01-25 18:49:09 +03:00
2015-09-02 18:43:31 +03:00
COMMON_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Common/Config.cpp \
2016-08-26 12:10:36 +03:00
$( SOURCEDIR) /Common/Globals.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Common/DataReader.cpp \
$( SOURCEDIR) /Common/DataWriter.cpp \
2016-02-18 18:35:10 +03:00
$( SOURCEDIR) /Common/ExceptionWithCallStack.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Common/Eval.cpp \
$( SOURCEDIR) /Common/File.cpp \
$( SOURCEDIR) /Common/TimerUtility.cpp \
$( SOURCEDIR) /Common/fileutil.cpp \
2016-09-15 16:44:45 +03:00
$( SOURCEDIR) /Common/Sequences.cpp \
2015-09-02 18:43:31 +03:00
MATH_SRC = \
2016-08-25 06:54:08 +03:00
$( SOURCEDIR) /Math/BatchNormalizationEngine.cpp \
2016-06-17 18:57:55 +03:00
$( SOURCEDIR) /Math/BlockHandlerSSE.cpp \
2016-08-25 06:54:08 +03:00
$( SOURCEDIR) /Math/CUDAPageLockedMemAllocator.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/CPUMatrix.cpp \
2016-05-05 20:59:05 +03:00
$( SOURCEDIR) /Math/CPURNGHandle.cpp \
2016-08-25 06:54:08 +03:00
$( SOURCEDIR) /Math/CPUSparseMatrix.cpp \
$( SOURCEDIR) /Math/ConvolutionEngine.cpp \
2016-01-05 21:42:38 +03:00
$( SOURCEDIR) /Math/MatrixQuantizerImpl.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/MatrixQuantizerCPU.cpp \
$( SOURCEDIR) /Math/Matrix.cpp \
2016-08-25 06:54:08 +03:00
$( SOURCEDIR) /Math/QuantizedMatrix.cpp \
2016-09-07 16:46:20 +03:00
$( SOURCEDIR) /Math/DataTransferer.cpp \
2016-05-05 20:59:05 +03:00
$( SOURCEDIR) /Math/RNGHandle.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/TensorView.cpp \
2015-09-02 18:43:31 +03:00
2016-06-21 23:02:39 +03:00
i f d e f S U P P O R T _ A V X 2
MATH_SRC += \
2016-06-22 01:02:36 +03:00
$( SOURCEDIR) /Math/BlockHandlerAVX.cpp \
2016-06-21 23:02:39 +03:00
e n d i f
2015-09-02 18:43:31 +03:00
i f d e f C U D A _ P A T H
MATH_SRC += \
2016-08-25 06:54:08 +03:00
$( SOURCEDIR) /Math/CuDnnBatchNormalization.cu \
$( SOURCEDIR) /Math/CuDnnCommon.cu \
$( SOURCEDIR) /Math/CuDnnConvolutionEngine.cu \
$( SOURCEDIR) /Math/CuDnnRNN.cpp \
$( SOURCEDIR) /Math/GPUDataTransferer.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/GPUMatrix.cu \
$( SOURCEDIR) /Math/GPUSparseMatrix.cu \
2016-08-25 06:54:08 +03:00
$( SOURCEDIR) /Math/GPUTensor.cu \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/GPUWatcher.cu \
2016-05-05 20:59:05 +03:00
$( SOURCEDIR) /Math/GPURNGHandle.cu \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/MatrixQuantizerGPU.cu \
2015-09-02 18:43:31 +03:00
e l s e
MATH_SRC += \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/NoGPU.cpp
2015-09-02 18:43:31 +03:00
e n d i f
MATH_SRC += $( COMMON_SRC)
2016-01-25 18:49:09 +03:00
MATH_SRC += $( READER_SRC)
2015-09-02 18:43:31 +03:00
MATH_OBJ := $( patsubst %.cu, $( OBJDIR) /%.o, $( patsubst %.cpp, $( OBJDIR) /%.o, $( MATH_SRC) ) )
CNTKMATH_LIB := $( LIBDIR) /lib$( CNTKMATH) .so
ALL += $( CNTKMATH_LIB)
SRC += $( MATH_SRC)
$(CNTKMATH_LIB) : $( MATH_OBJ )
@echo $( SEPARATOR)
2015-12-15 11:58:24 +03:00
@echo creating $@ for $( ARCH) with build type $( BUILDTYPE)
2015-09-02 18:43:31 +03:00
@mkdir -p $( dir $@ )
2016-07-27 17:14:34 +03:00
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBPATH) $( GDK_NVML_LIB_PATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ $( LIBS) -fopenmp
2015-09-02 18:43:31 +03:00
2016-06-20 14:51:38 +03:00
########################################
2016-06-11 22:21:15 +03:00
# CNTKLibrary
2015-09-02 18:43:31 +03:00
########################################
2016-06-11 22:21:15 +03:00
CNTK_COMMON_SRC = \
$( SOURCEDIR) /Common/BestGpu.cpp \
$( SOURCEDIR) /Common/MPIWrapper.cpp \
COMPUTATION_NETWORK_LIB_SRC = \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNode.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNodeScripting.cpp \
$( SOURCEDIR) /ComputationNetworkLib/InputAndParamNodes.cpp \
2016-09-05 04:36:17 +03:00
$( SOURCEDIR) /ComputationNetworkLib/RecurrentNodes.cpp \
2016-06-11 22:21:15 +03:00
$( SOURCEDIR) /ComputationNetworkLib/ReshapingNodes.cpp \
2016-08-25 06:42:48 +03:00
$( SOURCEDIR) /ComputationNetworkLib/RNNNodes.cpp \
2016-06-11 22:21:15 +03:00
$( SOURCEDIR) /ComputationNetworkLib/SpecialPurposeNodes.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetwork.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetworkEvaluation.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetworkAnalysis.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetworkEditing.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetworkBuilder.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetworkScripting.cpp \
SEQUENCE_TRAINING_LIB_SRC = \
$( SOURCEDIR) /SequenceTrainingLib/latticeforwardbackward.cpp \
$( SOURCEDIR) /SequenceTrainingLib/parallelforwardbackward.cpp \
i f d e f C U D A _ P A T H
SEQUENCE_TRAINING_LIB_SRC += \
$( SOURCEDIR) /Math/cudalatticeops.cu \
$( SOURCEDIR) /Math/cudalattice.cpp \
$( SOURCEDIR) /Math/cudalib.cpp \
e l s e
SEQUENCE_TRAINING_LIB_SRC += \
$( SOURCEDIR) /SequenceTrainingLib/latticeNoGPU.cpp \
e n d i f
CNTKLIBRARY_SRC = \
2016-07-18 02:44:44 +03:00
$( SOURCEDIR) /CNTKv2LibraryDll/BackCompat.cpp \
2016-06-11 22:21:15 +03:00
$( SOURCEDIR) /CNTKv2LibraryDll/Common.cpp \
2016-08-26 22:14:23 +03:00
$( SOURCEDIR) /CNTKv2LibraryDll/ComputeInputStatistics.cpp \
2016-06-11 22:21:15 +03:00
$( SOURCEDIR) /CNTKv2LibraryDll/Function.cpp \
2016-07-24 23:02:55 +03:00
$( SOURCEDIR) /CNTKv2LibraryDll/MinibatchSource.cpp \
2016-06-11 22:21:15 +03:00
$( SOURCEDIR) /CNTKv2LibraryDll/NDArrayView.cpp \
$( SOURCEDIR) /CNTKv2LibraryDll/NDMask.cpp \
2016-07-24 23:02:55 +03:00
$( SOURCEDIR) /CNTKv2LibraryDll/Trainer.cpp \
2016-06-11 22:21:15 +03:00
$( SOURCEDIR) /CNTKv2LibraryDll/Utils.cpp \
$( SOURCEDIR) /CNTKv2LibraryDll/Value.cpp \
$( SOURCEDIR) /CNTKv2LibraryDll/Variable.cpp \
2016-07-27 02:51:19 +03:00
$( SOURCEDIR) /CNTKv2LibraryDll/Learner.cpp \
2016-06-11 22:21:15 +03:00
CNTKLIBRARY_SRC += $( CNTK_COMMON_SRC)
CNTKLIBRARY_SRC += $( COMPUTATION_NETWORK_LIB_SRC)
CNTKLIBRARY_SRC += $( SEQUENCE_TRAINING_LIB_SRC)
CNTKLIBRARY_VERSION = 2.0
CNTKLIBRARY := cntklibrary-$( CNTKLIBRARY_VERSION)
CNTKLIBRARY_OBJ := $( patsubst %.cu, $( OBJDIR) /%.o, $( patsubst %.cpp, $( OBJDIR) /%.o, $( CNTKLIBRARY_SRC) ) )
CNTKLIBRARY_LIB := $( LIBDIR) /lib$( CNTKLIBRARY) .so
ALL += $( CNTKLIBRARY_LIB)
SRC += $( CNTKLIBRARY_SRC)
$(CNTKLIBRARY_LIB) : $( CNTKLIBRARY_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
@mkdir -p $( dir $@ )
@echo building output for $( ARCH) with build type $( BUILDTYPE)
2016-07-27 17:14:34 +03:00
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) $( GDK_NVML_LIB_PATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ $( LIBS) -l$( CNTKMATH)
2016-06-11 22:21:15 +03:00
2016-06-20 14:51:38 +03:00
########################################
2016-06-11 22:21:15 +03:00
# CNTKLibrary tests
########################################
CNTKLIBRARY_TESTS_SRC = \
2016-06-12 20:06:03 +03:00
Tests/UnitTests/V2LibraryTests/FeedForwardTests.cpp \
Tests/UnitTests/V2LibraryTests/Main.cpp \
Tests/UnitTests/V2LibraryTests/NDArrayViewTests.cpp \
Tests/UnitTests/V2LibraryTests/RecurrentFunctionTests.cpp \
Tests/UnitTests/V2LibraryTests/TensorTests.cpp \
2016-07-24 23:02:55 +03:00
Tests/UnitTests/V2LibraryTests/TrainerTests.cpp \
2016-07-31 02:16:41 +03:00
Tests/UnitTests/V2LibraryTests/CifarResNet.cpp \
2016-08-21 14:25:53 +03:00
Tests/UnitTests/V2LibraryTests/SerializationTests.cpp \
Tests/UnitTests/V2LibraryTests/LearnerTests.cpp \
Tests/UnitTests/V2LibraryTests/FunctionTests.cpp \
Tests/UnitTests/V2LibraryTests/SequenceClassification.cpp \
2016-08-31 08:50:25 +03:00
Tests/UnitTests/V2LibraryTests/Seq2Seq.cpp \
2016-09-29 12:48:13 +03:00
Tests/UnitTests/V2LibraryTests/TruncatedLSTMAcousticModel.cpp \
2016-09-27 17:05:53 +03:00
Tests/UnitTests/V2LibraryTests/DeviceSelectionTests.cpp \
2016-09-22 19:16:35 +03:00
Examples/Evaluation/CPPEvalV2Client/EvalMultithreads.cpp \
2016-06-11 22:21:15 +03:00
2016-06-12 20:06:03 +03:00
CNTKLIBRARY_TESTS := $( BINDIR) /v2librarytests
2016-06-11 22:21:15 +03:00
CNTKLIBRARY_TESTS_OBJ := $( patsubst %.cu, $( OBJDIR) /%.o, $( patsubst %.cpp, $( OBJDIR) /%.o, $( CNTKLIBRARY_TESTS_SRC) ) )
ALL += $( CNTKLIBRARY_TESTS)
SRC += $( CNTKLIBRARY_TESTS_SRC)
$(CNTKLIBRARY_TESTS) : $( CNTKLIBRARY_TESTS_OBJ ) | $( CNTKLIBRARY_LIB )
@echo $( SEPARATOR)
@mkdir -p $( dir $@ )
@echo building output for $( ARCH) with build type $( BUILDTYPE)
2016-07-27 17:14:34 +03:00
$( CXX) $( LDFLAGS) $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) $( GDK_NVML_LIB_PATH) ) $( patsubst %,$( RPATH) %, $( ORIGINLIBDIR) $( LIBPATH) ) -o $@ $^ $( LIBS) -l$( CNTKLIBRARY) -l$( CNTKMATH)
2016-06-11 22:21:15 +03:00
2016-06-20 14:51:38 +03:00
########################################
# LibEval
########################################
2016-06-27 12:43:56 +03:00
EVAL := eval
SGDLIB_SRC = \
$( SOURCEDIR) /SGDLib/Profiler.cpp \
$( SOURCEDIR) /SGDLib/SGD.cpp
EVAL_SRC = \
2016-06-20 14:51:38 +03:00
$( SOURCEDIR) /EvalDll/CNTKEval.cpp \
$( SOURCEDIR) /CNTK/BrainScript/BrainScriptEvaluator.cpp \
$( SOURCEDIR) /CNTK/BrainScript/BrainScriptParser.cpp \
$( SOURCEDIR) /CNTK/ModelEditLanguage.cpp \
$( SOURCEDIR) /ActionsLib/EvalActions.cpp \
$( SOURCEDIR) /ActionsLib/NetworkFactory.cpp \
$( SOURCEDIR) /ActionsLib/NetworkDescriptionLanguage.cpp \
$( SOURCEDIR) /ActionsLib/SimpleNetworkBuilder.cpp \
2016-06-30 15:57:16 +03:00
$( SOURCEDIR) /ActionsLib/NDLNetworkBuilder.cpp \
2016-06-20 14:51:38 +03:00
2016-06-27 12:43:56 +03:00
EVAL_SRC += $( SGDLIB_SRC)
EVAL_SRC += $( COMPUTATION_NETWORK_LIB_SRC)
EVAL_SRC += $( CNTK_COMMON_SRC)
EVAL_SRC += $( SEQUENCE_TRAINING_LIB_SRC)
EVAL_OBJ := $( patsubst %.cu, $( OBJDIR) /%.o, $( patsubst %.cpp, $( OBJDIR) /%.o, $( EVAL_SRC) ) )
2016-06-20 14:51:38 +03:00
2016-06-27 12:43:56 +03:00
EVAL_LIB := $( LIBDIR) /lib$( EVAL) .so
ALL += $( EVAL_LIB)
SRC += $( EVAL_SRC)
2016-06-20 14:51:38 +03:00
2016-07-29 19:58:49 +03:00
$(EVAL_LIB) : $( EVAL_OBJ ) | $( CNTKMATH_LIB )
2016-06-20 14:51:38 +03:00
@echo $( SEPARATOR)
@mkdir -p $( dir $@ )
2016-06-27 12:43:56 +03:00
@echo Building $( EVAL_LIB) for $( ARCH) with build type $( BUILDTYPE)
2016-07-29 19:58:49 +03:00
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) $( GDK_NVML_LIB_PATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ $( LIBS) -l$( CNTKMATH)
2016-06-20 14:51:38 +03:00
########################################
# Eval Sample client
########################################
2016-06-27 12:43:56 +03:00
EVAL_SAMPLE_CLIENT := $( BINDIR) /cppevalclient
EVAL_SAMPLE_CLIENT_SRC = \
2016-06-20 14:51:38 +03:00
$( SOURCEDIR) /../Examples/Evaluation/CPPEvalClient/CPPEvalClient.cpp
2016-06-27 12:43:56 +03:00
EVAL_SAMPLE_CLIENT_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( EVAL_SAMPLE_CLIENT_SRC) )
2016-06-20 14:51:38 +03:00
ALL += $( EVAL_SAMPLE_CLIENT)
SRC += $( EVAL_SAMPLE_CLIENT_SRC)
2016-07-29 19:58:49 +03:00
$(EVAL_SAMPLE_CLIENT) : $( EVAL_SAMPLE_CLIENT_OBJ ) | $( EVAL_LIB )
2016-06-20 14:51:38 +03:00
@echo $( SEPARATOR)
@mkdir -p $( dir $@ )
@echo building $( EVAL_SAMPLE_CLIENT) for $( ARCH) with build type $( BUILDTYPE)
2016-07-27 17:14:34 +03:00
$( CXX) $( LDFLAGS) $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) $( GDK_NVML_LIB_PATH) ) $( patsubst %,$( RPATH) %, $( ORIGINLIBDIR) $( LIBPATH) ) -o $@ $^ $( LIBS) -l$( EVAL) -l$( CNTKMATH)
2016-06-11 22:21:15 +03:00
2016-06-20 14:51:38 +03:00
########################################
2015-09-02 18:43:31 +03:00
# BinaryReader plugin
########################################
BINARYREADER_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/BinaryReader/BinaryFile.cpp \
$( SOURCEDIR) /Readers/BinaryReader/BinaryReader.cpp \
$( SOURCEDIR) /Readers/BinaryReader/BinaryWriter.cpp \
2015-09-02 18:43:31 +03:00
BINARYREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( BINARYREADER_SRC) )
BINARY_READER := $( LIBDIR) /BinaryReader.so
#ALL += $(BINARY_READER)
#SRC+=$(BINARYREADER_SRC)
$(BINARY_READER) : $( BINARYREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
########################################
# HTKMLFReader plugin
########################################
HTKMLFREADER_SRC = \
2016-02-29 06:01:07 +03:00
$( SOURCEDIR) /Readers/HTKMLFReader/Exports.cpp \
$( SOURCEDIR) /Readers/HTKMLFReader/DataWriterLocal.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/HTKMLFReader/HTKMLFReader.cpp \
$( SOURCEDIR) /Readers/HTKMLFReader/HTKMLFWriter.cpp \
2015-09-02 18:43:31 +03:00
2015-12-15 11:58:24 +03:00
HTKMLFREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( HTKMLFREADER_SRC) )
2015-09-02 18:43:31 +03:00
2015-12-15 11:58:24 +03:00
HTKMLFREADER := $( LIBDIR) /HTKMLFReader.so
ALL += $( HTKMLFREADER)
SRC += $( HTKMLFREADER_SRC)
2015-09-02 18:43:31 +03:00
2015-12-15 11:58:24 +03:00
$(LIBDIR)/HTKMLFReader.so : $( HTKMLFREADER_OBJ ) | $( CNTKMATH_LIB )
2015-09-02 18:43:31 +03:00
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2016-04-28 16:50:37 +03:00
########################################
# CompositeDataReader plugin
########################################
COMPOSITEDATAREADER_SRC = \
$( SOURCEDIR) /Readers/CompositeDataReader/CompositeDataReader.cpp \
2016-04-29 14:54:54 +03:00
$( SOURCEDIR) /Readers/CompositeDataReader/Exports.cpp \
2016-04-28 16:50:37 +03:00
COMPOSITEDATAREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( COMPOSITEDATAREADER_SRC) )
COMPOSITEDATAREADER := $( LIBDIR) /CompositeDataReader.so
ALL += $( COMPOSITEDATAREADER)
SRC += $( COMPOSITEDATAREADER_SRC)
$(LIBDIR)/CompositeDataReader.so : $( COMPOSITEDATAREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2016-02-19 18:38:42 +03:00
########################################
2016-06-06 16:23:39 +03:00
# HTKDeserializers plugin
2016-02-19 18:38:42 +03:00
########################################
2016-06-06 16:23:39 +03:00
HTKDESERIALIZERS_SRC = \
2016-03-01 08:27:49 +03:00
$( SOURCEDIR) /Readers/HTKMLFReader/DataWriterLocal.cpp \
2016-02-19 18:38:42 +03:00
$( SOURCEDIR) /Readers/HTKMLFReader/HTKMLFWriter.cpp \
2016-06-06 16:23:39 +03:00
$( SOURCEDIR) /Readers/HTKDeserializers/ConfigHelper.cpp \
$( SOURCEDIR) /Readers/HTKDeserializers/Exports.cpp \
$( SOURCEDIR) /Readers/HTKDeserializers/HTKDataDeserializer.cpp \
$( SOURCEDIR) /Readers/HTKDeserializers/HTKMLFReader.cpp \
$( SOURCEDIR) /Readers/HTKDeserializers/MLFDataDeserializer.cpp \
2016-02-19 18:38:42 +03:00
2016-06-06 16:23:39 +03:00
HTKDESERIALIZERS_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( HTKDESERIALIZERS_SRC) )
2016-02-19 18:38:42 +03:00
2016-06-06 16:23:39 +03:00
HTKDESERIALIZERS := $( LIBDIR) /HTKDeserializers.so
ALL += $( HTKDESERIALIZERS)
SRC += $( HTKDESERIALIZERS_SRC)
2016-02-19 18:38:42 +03:00
2016-06-06 16:23:39 +03:00
$(LIBDIR)/HTKDeserializers.so : $( HTKDESERIALIZERS_OBJ ) | $( CNTKMATH_LIB )
2016-02-19 18:38:42 +03:00
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2015-09-02 18:43:31 +03:00
########################################
# LMSequenceReader plugin
########################################
LMSEQUENCEREADER_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/LMSequenceReader/Exports.cpp \
$( SOURCEDIR) /Readers/LMSequenceReader/SequenceParser.cpp \
$( SOURCEDIR) /Readers/LMSequenceReader/SequenceReader.cpp \
2015-12-15 15:39:43 +03:00
$( SOURCEDIR) /Readers/LMSequenceReader/SequenceWriter.cpp \
2015-09-02 18:43:31 +03:00
LMSEQUENCEREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( LMSEQUENCEREADER_SRC) )
LMSEQUENCEREADER := $( LIBDIR) /LMSequenceReader.so
ALL += $( LMSEQUENCEREADER)
SRC += $( LMSEQUENCEREADER_SRC)
$(LMSEQUENCEREADER) : $( LMSEQUENCEREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
########################################
# LUSequenceReader plugin
########################################
LUSEQUENCEREADER_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/LUSequenceReader/Exports.cpp \
2016-02-29 06:01:07 +03:00
$( SOURCEDIR) /Readers/LUSequenceReader/DataWriterLocal.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/LUSequenceReader/LUSequenceParser.cpp \
$( SOURCEDIR) /Readers/LUSequenceReader/LUSequenceReader.cpp \
2016-03-24 21:33:14 +03:00
$( SOURCEDIR) /Readers/LUSequenceReader/LUSequenceWriter.cpp \
2015-09-02 18:43:31 +03:00
LUSEQUENCEREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( LUSEQUENCEREADER_SRC) )
LUSEQUENCEREADER := $( LIBDIR) /LUSequenceReader.so
ALL += $( LUSEQUENCEREADER)
SRC += $( LUSEQUENCEREADER_SRC)
$(LUSEQUENCEREADER) : $( LUSEQUENCEREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
########################################
# UCIFastReader plugin
########################################
UCIFASTREADER_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/UCIFastReader/Exports.cpp \
$( SOURCEDIR) /Readers/UCIFastReader/UCIFastReader.cpp \
$( SOURCEDIR) /Readers/UCIFastReader/UCIParser.cpp \
2015-09-02 18:43:31 +03:00
UCIFASTREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( UCIFASTREADER_SRC) )
UCIFASTREADER := $( LIBDIR) /UCIFastReader.so
ALL += $( UCIFASTREADER)
SRC += $( UCIFASTREADER_SRC)
$(UCIFASTREADER) : $( UCIFASTREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2015-12-16 20:53:10 +03:00
########################################
# LibSVMBinaryReader plugin
########################################
LIBSVMBINARYREADER_SRC = \
$( SOURCEDIR) /Readers/LibSVMBinaryReader/Exports.cpp \
$( SOURCEDIR) /Readers/LibSVMBinaryReader/LibSVMBinaryReader.cpp \
LIBSVMBINARYREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( LIBSVMBINARYREADER_SRC) )
LIBSVMBINARYREADER := $( LIBDIR) /LibSVMBinaryReader.so
ALL += $( LIBSVMBINARYREADER)
SRC += $( LIBSVMBINARYREADER_SRC)
$(LIBSVMBINARYREADER) : $( LIBSVMBINARYREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2016-01-29 18:58:34 +03:00
########################################
# SparsePCReader plugin
########################################
SPARSEPCREADER_SRC = \
$( SOURCEDIR) /Readers/SparsePCReader/Exports.cpp \
$( SOURCEDIR) /Readers/SparsePCReader/SparsePCReader.cpp \
2016-02-02 17:45:50 +03:00
SPARSEPCREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( SPARSEPCREADER_SRC) )
2016-01-29 18:58:34 +03:00
2016-02-02 17:45:50 +03:00
SPARSEPCREADER := $( LIBDIR) /SparsePCReader.so
ALL += $( SPARSEPCREADER)
SRC += $( SPARSEPCREADER_SRC)
2016-01-29 18:58:34 +03:00
2016-02-02 17:45:50 +03:00
$(SPARSEPCREADER) : $( SPARSEPCREADER_OBJ ) | $( CNTKMATH_LIB )
2016-01-29 18:58:34 +03:00
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2016-03-17 17:11:44 +03:00
########################################
# CNTKTextFormatReader plugin
########################################
CNTKTEXTFORMATREADER_SRC = \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/Exports.cpp \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/Indexer.cpp \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/TextParser.cpp \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/CNTKTextFormatReader.cpp \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/TextConfigHelper.cpp \
CNTKTEXTFORMATREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( CNTKTEXTFORMATREADER_SRC) )
CNTKTEXTFORMATREADER := $( LIBDIR) /CNTKTextFormatReader.so
ALL += $( CNTKTEXTFORMATREADER)
SRC += $( CNTKTEXTFORMATREADER_SRC)
$(CNTKTEXTFORMATREADER) : $( CNTKTEXTFORMATREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2015-09-02 18:43:31 +03:00
########################################
# Kaldi plugins
########################################
i f d e f K A L D I _ P A T H
KALDI2READER_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/Kaldi2Reader/DataReader.cpp \
$( SOURCEDIR) /Readers/Kaldi2Reader/DataWriter.cpp \
$( SOURCEDIR) /Readers/Kaldi2Reader/HTKMLFReader.cpp \
$( SOURCEDIR) /Readers/Kaldi2Reader/HTKMLFWriter.cpp \
$( SOURCEDIR) /Readers/Kaldi2Reader/KaldiSequenceTrainingDerivative.cpp \
$( SOURCEDIR) /Readers/Kaldi2Reader/UtteranceDerivativeBuffer.cpp \
2015-09-02 18:43:31 +03:00
KALDI2READER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( KALDI2READER_SRC) )
KALDI2READER := $( LIBDIR) /Kaldi2Reader.so
ALL += $( KALDI2READER)
SRC += $( KALDI2READER_SRC)
2015-08-11 23:58:18 +03:00
$(KALDI2READER) : $( KALDI 2READER_OBJ ) | $( CNTKMATH_LIB )
2015-09-02 18:43:31 +03:00
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( KALDI_LIBPATH) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( KALDI_LIBPATH) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH) $( KALDI_LIBS)
e n d i f
2015-10-13 22:02:35 +03:00
########################################
# ImageReader plugin
########################################
i f d e f O P E N C V _ P A T H
2016-08-17 16:27:15 +03:00
i f d e f B O O S T _ P A T H
INCLUDEPATH += $( BOOST_PATH) /include
2016-02-20 04:41:40 +03:00
2016-02-23 05:21:10 +03:00
IMAGE_READER_LIBS += -lopencv_core -lopencv_imgproc -lopencv_imgcodecs
2016-02-20 04:41:40 +03:00
i f d e f L I B Z I P _ P A T H
CPPFLAGS += -DUSE_ZIP
INCLUDEPATH += $( LIBZIP_PATH) /lib/libzip/include
2016-02-23 05:21:10 +03:00
IMAGE_READER_LIBS += -lzip
2016-02-20 04:41:40 +03:00
e n d i f
2015-10-13 22:02:35 +03:00
IMAGEREADER_SRC = \
2016-02-25 21:48:13 +03:00
$( SOURCEDIR) /Readers/ImageReader/Exports.cpp \
$( SOURCEDIR) /Readers/ImageReader/ImageConfigHelper.cpp \
$( SOURCEDIR) /Readers/ImageReader/ImageDataDeserializer.cpp \
$( SOURCEDIR) /Readers/ImageReader/ImageTransformers.cpp \
$( SOURCEDIR) /Readers/ImageReader/ImageReader.cpp \
$( SOURCEDIR) /Readers/ImageReader/ZipByteReader.cpp \
2015-12-15 11:58:24 +03:00
2015-10-13 22:02:35 +03:00
IMAGEREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( IMAGEREADER_SRC) )
IMAGEREADER := $( LIBDIR) /ImageReader.so
ALL += $( IMAGEREADER)
SRC += $( IMAGEREADER_SRC)
2015-12-03 21:52:05 +03:00
INCLUDEPATH += $( OPENCV_PATH) /include
2016-02-01 15:10:43 +03:00
LIBPATH += $( OPENCV_PATH) /lib $( OPENCV_PATH) /release/lib
2015-12-03 21:52:05 +03:00
2015-10-13 22:02:35 +03:00
$(IMAGEREADER) : $( IMAGEREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
2016-02-23 05:21:10 +03:00
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH) $( IMAGE_READER_LIBS)
2015-10-13 22:02:35 +03:00
e n d i f
2016-08-17 16:27:15 +03:00
e n d i f
2015-10-13 22:02:35 +03:00
2016-01-14 01:29:19 +03:00
########################################
# 1bit SGD setup
########################################
i f e q ( "$(CNTK_ENABLE_1BitSGD)" , "true" )
2016-01-29 15:05:12 +03:00
i f e q ( , $( wildcard Source /1BitSGD /*.h ) )
$( error Build with 1bit-SGD was requested but cannot find the code. Please check https://github.com/Microsoft/CNTK/wiki/Enabling-1bit-SGD for instructions)
e n d i f
2016-03-10 03:36:34 +03:00
INCLUDEPATH += $( SOURCEDIR) /1BitSGD
2016-01-14 01:29:19 +03:00
2016-04-19 02:18:49 +03:00
COMMON_FLAGS += -DCNTK_PARALLEL_TRAINING_SUPPORT
2016-03-10 03:36:34 +03:00
# temporarily adding to 1bit, need to work with others to fix it
2016-01-14 01:29:19 +03:00
e n d i f
2015-09-02 18:43:31 +03:00
########################################
# cntk
########################################
CNTK_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /CNTK/CNTK.cpp \
$( SOURCEDIR) /CNTK/ModelEditLanguage.cpp \
$( SOURCEDIR) /CNTK/tests.cpp \
$( SOURCEDIR) /ActionsLib/TrainActions.cpp \
$( SOURCEDIR) /ActionsLib/EvalActions.cpp \
$( SOURCEDIR) /ActionsLib/OtherActions.cpp \
2016-01-22 20:42:57 +03:00
$( SOURCEDIR) /ActionsLib/SpecialPurposeActions.cpp \
2016-03-22 07:34:41 +03:00
$( SOURCEDIR) /ActionsLib/NetworkFactory.cpp \
2016-03-10 11:19:54 +03:00
$( SOURCEDIR) /ActionsLib/NetworkDescriptionLanguage.cpp \
$( SOURCEDIR) /ActionsLib/SimpleNetworkBuilder.cpp \
2016-03-11 16:31:27 +03:00
$( SOURCEDIR) /ActionsLib/NDLNetworkBuilder.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /CNTK/BrainScript/BrainScriptEvaluator.cpp \
$( SOURCEDIR) /CNTK/BrainScript/BrainScriptParser.cpp \
2015-09-02 18:43:31 +03:00
2016-06-27 12:43:56 +03:00
CNTK_SRC += $( SGDLIB_SRC)
2016-06-11 22:21:15 +03:00
CNTK_SRC += $( CNTK_COMMON_SRC)
CNTK_SRC += $( COMPUTATION_NETWORK_LIB_SRC)
CNTK_SRC += $( SEQUENCE_TRAINING_LIB_SRC)
2015-09-26 03:22:58 +03:00
CNTK_OBJ := $( patsubst %.cu, $( OBJDIR) /%.o, $( patsubst %.cpp, $( OBJDIR) /%.o, $( CNTK_SRC) ) )
2015-09-02 18:43:31 +03:00
CNTK := $( BINDIR) /cntk
ALL += $( CNTK)
2016-03-29 10:19:00 +03:00
SRC += $( CNTK_SRC)
2015-09-02 18:43:31 +03:00
2016-03-29 10:19:00 +03:00
$(CNTK) : $( CNTK_OBJ ) | $( CNTKMATH_LIB )
2015-09-02 18:43:31 +03:00
@echo $( SEPARATOR)
@mkdir -p $( dir $@ )
@echo building output for $( ARCH) with build type $( BUILDTYPE)
2016-07-27 17:14:34 +03:00
$( CXX) $( LDFLAGS) $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) $( GDK_NVML_LIB_PATH) ) $( patsubst %,$( RPATH) %, $( ORIGINLIBDIR) $( LIBPATH) ) -o $@ $^ $( LIBS) -l$( CNTKMATH) -fopenmp
2015-09-02 18:43:31 +03:00
2016-03-07 04:40:58 +03:00
# deployable resources: standard library of BS
2016-03-06 11:25:39 +03:00
CNTK_CORE_BS := $( BINDIR) /cntk.core.bs
ALL += $( CNTK_CORE_BS)
$(CNTK_CORE_BS) : $( SOURCEDIR ) /CNTK /BrainScript /CNTKCoreLib /CNTK .core .bs
2016-03-07 04:40:58 +03:00
@mkdir -p $( dir $@ )
@echo bin-placing deployable resource files
2016-03-06 08:27:04 +03:00
cp -f $^ $@
2016-06-30 15:57:16 +03:00
########################################
# Unit Tests
########################################
2016-07-19 10:34:31 +03:00
# only build unit tests when Boost is available
i f d e f B O O S T _ P A T H
INCLUDEPATH += $( BOOST_PATH) /include
BOOSTLIB_PATH = $( BOOST_PATH) /lib
2016-07-29 19:58:49 +03:00
BOOSTLIBS := -lboost_unit_test_framework -lboost_filesystem -lboost_system
2016-06-30 15:57:16 +03:00
UNITTEST_EVAL_SRC = \
$( SOURCEDIR) /../Tests/UnitTests/EvalTests/EvalExtendedTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/EvalTests/stdafx.cpp
UNITTEST_EVAL_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( UNITTEST_EVAL_SRC) )
UNITTEST_EVAL := $( BINDIR) /evaltests
2016-07-19 10:34:31 +03:00
ALL += $( UNITTEST_EVAL)
SRC += $( UNITTEST_EVAL_SRC)
2016-06-30 15:57:16 +03:00
$(UNITTEST_EVAL) : $( UNITTEST_EVAL_OBJ ) | $( EVAL_LIB ) $( CNTKMATH_LIB )
@echo $( SEPARATOR)
@mkdir -p $( dir $@ )
@echo building $@ for $( ARCH) with build type $( BUILDTYPE)
2016-07-29 19:58:49 +03:00
$( CXX) $( LDFLAGS) $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) $( GDK_NVML_LIB_PATH) $( BOOSTLIB_PATH) ) $( patsubst %, $( RPATH) %, $( ORIGINLIBDIR) $( LIBPATH) $( BOOSTLIB_PATH) ) -o $@ $^ $( BOOSTLIBS) $( LIBS) -l$( EVAL) -l$( CNTKMATH)
2016-06-30 15:57:16 +03:00
2016-07-12 17:36:38 +03:00
#TODO: create project specific makefile or rules to avoid adding project specific path to the global path
2016-06-30 15:57:16 +03:00
INCLUDEPATH += $( SOURCEDIR) /Readers/CNTKTextFormatReader
UNITTEST_READER_SRC = \
$( SOURCEDIR) /../Tests/UnitTests/ReaderTests/CNTKTextFormatReaderTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/ReaderTests/HTKLMFReaderTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/ReaderTests/ImageReaderTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/ReaderTests/ReaderLibTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/ReaderTests/stdafx.cpp \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/Indexer.cpp \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/TextParser.cpp \
UNITTEST_READER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( UNITTEST_READER_SRC) )
UNITTEST_READER := $( BINDIR) /readertests
2016-07-19 10:34:31 +03:00
ALL += $( UNITTEST_READER)
SRC += $( UNITTEST_READER_SRC)
2016-06-30 15:57:16 +03:00
$(UNITTEST_READER) : $( UNITTEST_READER_OBJ ) | $( HTKMLFREADER ) $( HTKDESERIALIZERS ) $( UCIFASTREADER ) $( COMPOSITEDATAREADER ) $( IMAGEREADER ) $( CNTKMATH_LIB )
@echo $( SEPARATOR)
@mkdir -p $( dir $@ )
@echo building $@ for $( ARCH) with build type $( BUILDTYPE)
2016-07-29 19:58:49 +03:00
$( CXX) $( LDFLAGS) $( patsubst %,-L%, $( LIBDIR) $( BOOSTLIB_PATH) ) $( patsubst %, $( RPATH) %, $( ORIGINLIBDIR) $( BOOSTLIB_PATH) ) -o $@ $^ $( BOOSTLIBS) -l$( CNTKMATH) -ldl
2016-06-30 15:57:16 +03:00
UNITTEST_NETWORK_SRC = \
$( SOURCEDIR) /../Tests/UnitTests/NetworkTests/OperatorEvaluation.cpp \
$( SOURCEDIR) /../Tests/UnitTests/NetworkTests/stdafx.cpp \
$( SOURCEDIR) /CNTK/ModelEditLanguage.cpp \
$( SOURCEDIR) /ActionsLib/TrainActions.cpp \
$( SOURCEDIR) /ActionsLib/EvalActions.cpp \
$( SOURCEDIR) /ActionsLib/OtherActions.cpp \
$( SOURCEDIR) /ActionsLib/SpecialPurposeActions.cpp \
$( SOURCEDIR) /ActionsLib/NetworkFactory.cpp \
$( SOURCEDIR) /ActionsLib/NetworkDescriptionLanguage.cpp \
$( SOURCEDIR) /ActionsLib/SimpleNetworkBuilder.cpp \
$( SOURCEDIR) /ActionsLib/NDLNetworkBuilder.cpp \
$( SOURCEDIR) /CNTK/BrainScript/BrainScriptEvaluator.cpp \
$( SOURCEDIR) /CNTK/BrainScript/BrainScriptParser.cpp \
UNITTEST_NETWORK_SRC += $( COMPUTATION_NETWORK_LIB_SRC)
UNITTEST_NETWORK_SRC += $( CNTK_COMMON_SRC)
UNITTEST_NETWORK_SRC += $( SEQUENCE_TRAINING_LIB_SRC)
UNITTEST_NETWORK_SRC += $( SGDLIB_SRC)
UNITTEST_NETWORK_OBJ := $( patsubst %.cu, $( OBJDIR) /%.o, $( patsubst %.cpp, $( OBJDIR) /%.o, $( UNITTEST_NETWORK_SRC) ) )
UNITTEST_NETWORK := $( BINDIR) /networktests
2016-07-19 10:34:31 +03:00
ALL += $( UNITTEST_NETWORK)
SRC += $( UNITTEST_NETWORK_SRC)
2016-06-30 15:57:16 +03:00
$(UNITTEST_NETWORK) : $( UNITTEST_NETWORK_OBJ ) | $( CNTKMATH_LIB ) $( CNTKTEXTFORMATREADER )
@echo $( SEPARATOR)
@mkdir -p $( dir $@ )
@echo building $@ for $( ARCH) with build type $( BUILDTYPE)
2016-07-29 19:58:49 +03:00
$( CXX) $( LDFLAGS) $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) $( GDK_NVML_LIB_PATH) $( BOOSTLIB_PATH) ) $( patsubst %, $( RPATH) %, $( ORIGINLIBDIR) $( LIBPATH) $( BOOSTLIB_PATH) ) -o $@ $^ $( BOOSTLIBS) $( LIBS) -l$( CNTKMATH) -fopenmp
2016-06-30 15:57:16 +03:00
UNITTEST_MATH_SRC = \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/BatchNormalizationEngineTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/BlockMultiplierTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/constants.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/ConvolutionEngineTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/CPUMatrixTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/CPUSparseMatrixTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/fixtures.cpp \
2016-09-01 17:31:42 +03:00
$( SOURCEDIR) /../Tests/UnitTests/MathTests/QuantizersTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/TensorTests.cpp \
2016-06-30 15:57:16 +03:00
$( SOURCEDIR) /../Tests/UnitTests/MathTests/GPUMatrixCudaBlasTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/GPUMatrixTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/GPUSparseMatrixTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/MatrixBlasTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/MatrixDataSynchronizationTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/MatrixFileWriteReadTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/MatrixQuantizerTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/MatrixSparseDenseInteractionsTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/MatrixTests.cpp \
$( SOURCEDIR) /../Tests/UnitTests/MathTests/stdafx.cpp \
2016-07-12 17:36:38 +03:00
UNITTEST_MATH_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( UNITTEST_MATH_SRC) )
2016-06-30 15:57:16 +03:00
UNITTEST_MATH := $( BINDIR) /mathtests
2016-07-19 10:34:31 +03:00
ALL += $( UNITTEST_MATH)
SRC += $( UNITTEST_MATH_SRC)
2016-06-30 15:57:16 +03:00
$(UNITTEST_MATH) : $( UNITTEST_MATH_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
@mkdir -p $( dir $@ )
@echo building $@ for $( ARCH) with build type $( BUILDTYPE)
2016-07-29 19:58:49 +03:00
$( CXX) $( LDFLAGS) $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) $( GDK_NVML_LIB_PATH) $( BOOSTLIB_PATH) ) $( patsubst %, $( RPATH) %, $( ORIGINLIBDIR) $( LIBPATH) $( BOOSTLIB_PATH) ) -o $@ $^ $( BOOSTLIBS) $( LIBS) -l$( CNTKMATH) -ldl -fopenmp
2016-06-30 15:57:16 +03:00
2016-08-02 10:18:08 +03:00
UNITTEST_BRAINSCRIPT_SRC = \
$( SOURCEDIR) /CNTK/BrainScript/BrainScriptEvaluator.cpp \
$( SOURCEDIR) /CNTK/BrainScript/BrainScriptParser.cpp \
$( SOURCEDIR) /../Tests/UnitTests/BrainScriptTests/ParserTests.cpp \
2016-08-09 12:31:47 +03:00
$( SOURCEDIR) /../Tests/UnitTests/BrainScriptTests/ComputationNetworkTests.cpp \
2016-08-02 10:18:08 +03:00
$( SOURCEDIR) /../Tests/UnitTests/BrainScriptTests/stdafx.cpp
2016-08-09 12:31:47 +03:00
UNITTEST_BRAINSCRIPT_SRC += $( COMPUTATION_NETWORK_LIB_SRC)
UNITTEST_BRAINSCRIPT_SRC += $( SEQUENCE_TRAINING_LIB_SRC)
2016-08-02 10:18:08 +03:00
2016-08-09 12:31:47 +03:00
UNITTEST_BRAINSCRIPT_OBJ := $( patsubst %.cu, $( OBJDIR) /%.o, $( patsubst %.cpp, $( OBJDIR) /%.o, $( UNITTEST_BRAINSCRIPT_SRC) ) )
2016-08-02 10:18:08 +03:00
UNITTEST_BRAINSCRIPT := $( BINDIR) /brainscripttests
ALL += $( UNITTEST_BRAINSCRIPT)
SRC += $( UNITTEST_BRAINSCRIPT_SRC)
2016-08-09 12:31:47 +03:00
$(UNITTEST_BRAINSCRIPT) : $( UNITTEST_BRAINSCRIPT_OBJ ) | $( CNTKMATH_LIB )
2016-08-02 10:18:08 +03:00
@echo $( SEPARATOR)
@mkdir -p $( dir $@ )
@echo building $@ for $( ARCH) with build type $( BUILDTYPE)
2016-08-09 12:31:47 +03:00
$( CXX) $( LDFLAGS) $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) $( GDK_NVML_LIB_PATH) $( BOOSTLIB_PATH) ) $( patsubst %, $( RPATH) %, $( ORIGINLIBDIR) $( LIBPATH) $( BOOSTLIB_PATH) ) -o $@ $^ $( BOOSTLIBS) $( LIBS) -ldl -l$( CNTKMATH)
2016-08-02 10:18:08 +03:00
unittests : $( UNITTEST_EVAL ) $( UNITTEST_READER ) $( UNITTEST_NETWORK ) $( UNITTEST_MATH ) $( UNITTEST_BRAINSCRIPT )
2016-06-30 15:57:16 +03:00
2016-07-19 10:34:31 +03:00
e n d i f
2016-06-30 15:57:16 +03:00
2015-09-02 18:43:31 +03:00
########################################
# General compile and dependency rules
########################################
VPATH := $( sort $( dir $( SRC) ) )
# Define object files
OBJ := $( patsubst %.cu, $( OBJDIR) /%.o, $( patsubst %.cpp, $( OBJDIR) /%.o, $( SRC) ) )
# C++ include dependencies generated by -MF compiler option
DEP := $( patsubst %.o, %.d, $( OBJ) )
# Include all C++ dependencies, like header files, to ensure that a change in those
# will result in the rebuild.
- i n c l u d e $ { D E P }
2016-06-09 18:53:06 +03:00
BUILD_CONFIGURATION := Makefile $( BUILD_TOP) /Config.make
2016-04-11 22:24:24 +03:00
2016-06-09 18:53:06 +03:00
$(OBJDIR)/%.o : %.cu $( BUILD_CONFIGURATION )
2015-09-02 18:43:31 +03:00
@echo $( SEPARATOR)
2015-12-15 11:58:24 +03:00
@echo creating $@ for $( ARCH) with build type $( BUILDTYPE)
2015-09-02 18:43:31 +03:00
@mkdir -p $( dir $@ )
2016-02-11 04:50:53 +03:00
$( NVCC) -c $< -o $@ $( COMMON_FLAGS) $( CUFLAGS) $( INCLUDEPATH:%= -I%) -Xcompiler "-fPIC -Werror"
2015-09-02 18:43:31 +03:00
2016-06-30 15:57:16 +03:00
$(OBJDIR)/%.o : %.cpp $( BUILD_CONFIGURATION )
2015-09-02 18:43:31 +03:00
@echo $( SEPARATOR)
2015-12-15 11:58:24 +03:00
@echo creating $@ for $( ARCH) with build type $( BUILDTYPE)
2015-09-02 18:43:31 +03:00
@mkdir -p $( dir $@ )
2016-02-11 04:50:53 +03:00
$( CXX) -c $< -o $@ $( COMMON_FLAGS) $( CPPFLAGS) $( CXXFLAGS) $( INCLUDEPATH:%= -I%) -MD -MP -MF ${ @ : .o=.d }
2015-09-02 18:43:31 +03:00
2016-06-30 15:57:16 +03:00
.PHONY : clean buildall all unittests
2015-09-02 18:43:31 +03:00
clean :
@echo $( SEPARATOR)
@rm -rf $( OBJDIR)
@rm -rf $( ALL)
2016-02-01 22:16:08 +03:00
@rm -rf $( BUILDINFO)
2015-12-15 11:58:24 +03:00
@echo finished cleaning up the project
2015-09-02 18:43:31 +03:00
buildall : $( ALL )
@echo $( SEPARATOR)
@echo finished building for $( ARCH) with build type $( BUILDTYPE)