# Generic Makefile for GEMMA
#
# Supported platforms
#
#       Unix / Linux               	LNX (default)
#       Mac                        	MAC
#
# Compilation options
#       static compilation    		FORCE_STATIC
#
# Examples:
#
#    Make GEMMA on Linux with OPENBLAS support:
#
#      make WITH_OPENBLAS=1
#
#    Disable debug info and checks (slightly faster release mode)
#
#      make WITH_OPENBLAS=1 DEBUG=
#
#    Force static compilation
#
#      make FORCE_STATIC=1
#
#    Run tests with
#
#      make check
#
#    See also the INSTALL.md document in the source tree at
#
#      https://github.com/genetics-statistics/GEMMA/blob/master/INSTALL.md

GEMMA_VERSION = $(shell cat ./VERSION)

# Set this variable to either LNX or MAC
SYS                    = MAC # LNX|MAC (Linux is the default)
# Leave blank after "=" to disable; put "= 1" to enable
DIST_NAME              = gemma-$(GEMMA_VERSION)
DEBUG                  =     # DEBUG mode, set DEBUG= for a release
SHOW_COMPILER_WARNINGS =
WITH_LAPACK            = 1
WITH_OPENBLAS          =     # Defaults to LAPACK - OPENBLAS may be faster
FORCE_STATIC           =     # Static linking of libraries
GCC_FLAGS              = -O3 -I/usr/local/Cellar/gsl/2.4/include -I./eigen \
                         -I/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers
TRAVIS_CI              =     # used by TRAVIS for testing
EIGEN_INCLUDE_PATH=
CXX = g++

# --------------------------------------------------------------------
# Edit below this line with caution
# --------------------------------------------------------------------

BIN_DIR  = ./bin
SRC_DIR  = ./src
TEST_SRC_DIR  = ./test/src

ifdef CXX # CXX defined in environment
  CPP = $(CXX)
  CC = $(CXX)
else
  CPP = g++
endif

ifdef OPENBLAS
  WITH_LAPACK =  # OPENBLAS usually includes LAPACK
endif

ifdef DEBUG
  CPPFLAGS = -g $(GCC_FLAGS) -std=gnu++11 -isystem/$(EIGEN_INCLUDE_PATH) -Icontrib/catch-1.9.7 -Isrc
else
  # release mode
  CPPFLAGS = -DNDEBUG $(GCC_FLAGS) -std=gnu++11 -isystem/$(EIGEN_INCLUDE_PATH) -Icontrib/catch-1.9.7 -Isrc
endif

ifdef SHOW_COMPILER_WARNINGS
  CPPFLAGS += -Wall
endif

OUTPUT = $(BIN_DIR)/gemma

SOURCES = $(SRC_DIR)/main.cpp

HDR =

# Detailed libary paths, D for dynamic and S for static
LIBS += -framework Accelerate \
  /usr/local/opt/zlib/lib/libz.a \
  /usr/local/Cellar/gsl/2.4/lib/libgsl.a \
  /usr/local/Cellar/gsl/2.4/lib/libgslcblas.a

HDR          = $(wildcard src/*.h) ./src/version.h
SOURCES      = $(wildcard src/*.cpp)

# all
OBJS = $(SOURCES:.cpp=.o)

all: $(OUTPUT)

./src/version.h:
	./scripts/gen_version_info.sh > src/version.h

<print-% : ; @echo $* = $($*)

$(OUTPUT): $(OBJS)
	$(CPP) $(CPPFLAGS) $(OBJS) $(LIBS) -o $(OUTPUT)

$(OBJS)  : $(HDR)

.cpp.o:
	$(CPP) $(CPPFLAGS) $(HEADERS) -c $*.cpp -o $*.o
.SUFFIXES : .cpp .c .o $(SUFFIXES)

unittests: all contrib/catch-1.9.7/catch.hpp $(TEST_SRC_DIR)/unittests-main.o $(TEST_SRC_DIR)/unittests-math.o
	$(CPP) $(CPPFLAGS) $(TEST_SRC_DIR)/unittests-main.o  $(TEST_SRC_DIR)/unittests-math.o $(filter-out src/main.o, $(OBJS)) $(LIBS) -o ./bin/unittests-gemma
	./bin/unittests-gemma

fast-check: all unittests
	rm -vf test/output/*
	cd test && ./dev_test_suite.sh | tee ../dev_test.log
	grep -q 'success rate: 100%' dev_test.log

slow-check: all
	rm -vf test/output/*
	cd test && ./test_suite.sh | tee ../test.log
	grep -q 'success rate: 100%' test.log

lengthy-check: all
	rm -vf test/output/*
	cd test && ./lengthy_test_suite.sh | tee ../lengthy_test.log
	grep -q 'success rate: 100%' lengthy_test.log

check: fast-check slow-check

check-all: check lengthy-check

clean:
	rm -vf $(SRC_DIR)/version.h
	rm -vf $(SRC_DIR)/*.o
	rm -vf $(SRC_DIR)/*~
	rm -vf $(TEST_SRC_DIR)/*.o
	rm -vf $(OUTPUT)
	rm -vf ./bin/unittests-gemma

DIST_COMMON = COPYING.txt README.txt Makefile
DIST_SUBDIRS = src doc example bin

tar:
	mkdir -p ./$(DIST_NAME)
	cp $(DIST_COMMON) ./$(DIST_NAME)/
	cp -r $(DIST_SUBDIRS) ./$(DIST_NAME)/
	tar cvzf $(DIST_NAME).tar.gz ./$(DIST_NAME)/
	rm -r ./$(DIST_NAME)