Skip to content

Instantly share code, notes, and snippets.

@sadatnfs
Last active March 25, 2019 16:14
Show Gist options
  • Save sadatnfs/8c28a1024fbec239fa29347bea456918 to your computer and use it in GitHub Desktop.
Save sadatnfs/8c28a1024fbec239fa29347bea456918 to your computer and use it in GitHub Desktop.
Makefile for building INLA in Debian:Stretch
## Makefile for downloading the source code and building
## a binary package of R-INLA on Debian:Stretch
## using a custom version of R and Intel MKL
## Intended for use by : Institute for Health Metrics and Evaluation
##
## Maintained by : Nafis Sadat, [email protected]
##
#### 2018/01/28 Update: removing r-mathlib and adding metis5
#### 2018/03/23 Update: update path to new MKL version installation
#### 2018/04/25 Update: remove metis installs (pointing to Metis 5.1.0 instead)
#### 2018/05/03 Update: pointing to custom Metis install
#### 2018/05/13 Update: remove Metis pointer, and update MKL paths (also remove mkldnn)
#### 2018/05/22 Update: Point to older branch (18.05.08)
#### 2018/05/23 Update: Use own forked version with Pardiso linked in 'inla' Makefile
#### 2018/06/10 Update: INLA main repo fixed Pardiso issue, reverting to that; x11 fmesher
#### 2018/06/11 Update: Untagging hg clone, and cleaning up some flags so that fmesher actually builds
#### 2018/06/15 Update: New MKL build (3.222)
#### 2018/07/16 Update: Add bunch more flags to the other Intel products
#### 2018/07/18 Update: AVX2 is not recommended
#### 2018/10/02 Update: Rename explicit folder names from 2018 MKL reference to generic path
#### NOTE: -I/opt/R/lib/R/include/ MUST be included explicitly in the FLAGS variable
## NOTE: Changes to the Makefile should be made as needed for compilers and flags
SHELL = /bin/bash
## This Makefile is only supported for platform 'linux':
PLATFORM = linux
## Must match the machine architecture (32 or 64):
BITS = 64
## Compiler flags
## Set up the flags for MKL bindings
MKLROOT=/opt/intel/compilers_and_libraries/linux/mkl
MKL=-L/opt/intel/compilers_and_libraries/linux/mkl/lib/intel64_lin -lRmath -Wl,--no-as-needed -lmkl_gf_lp64 -Wl,--start-group -lmkl_gnu_thread -lmkl_core -Wl,--end-group -fopenmp -dl -lpthread -lm
## Point to the R headers
INLA_LIBR="/opt/R/lib/R/lib -I/opt/R/lib/R/include/"
## Common compile flags
## Common compile flags
FLAGS = -m64 -w -g -O3 -mtune=generic -mavx -msse2 -msse3 -msse4.1 -msse4.2 -mfpmath=sse \
-msse2 -L/opt/R/lib/R/lib -lR -lRmath \
-I/opt/R/lib/R/include/ \
-L/usr/local/lib64/ \
-funroll-loops -fPIC -ftracer -pipe \
-I/usr/include -I${MKLROOT}/include \
-L/usr/local/lib -L/usr/lib -L${MKLROOT}/lib/intel64_lin \
-L/opt/intel/tbb/lib/intel64_lin/gcc4.7 -L/opt/intel/daal/lib/intel64_lin
FLAGS_INLA = $(FLAGS) -std=gnu99 -fopenmp
FLAGS_FMESHER = $(FLAGS) -std=c++11
## For Debian or Ubuntu package installation in lib-install:
APT=aptitude
## Path configuration:
MAINDIR=$(PWD)
PREFIX = $(MAINDIR)/local
BINPREFIX = $(PREFIX)/bin/$(PLATFORM)
LIBPREFIX = $(PREFIX)/lib
INCPREFIX = $(PREFIX)/include
## Compiler options:
#CC=mpicc
#CXX=mpic++
#FC=mpifort
CC=gcc
CXX=g++
FC=gfortran
LD=$(CXX)
ARGS = CC="$(CC)" CXX="$(CXX)" FC="$(FC)" LD="$(LD)"
all :;
@(echo "";\
echo "Edit this Makefile, especially the 'FLAGS_COMMON' variable,";\
echo "check if you need to run 'sudo $(MAKE) lib-install', then do";\
echo "";\
echo " $(MAKE) lib-install";\
echo " $(MAKE) download";\
echo " $(MAKE) bin";\
echo " $(MAKE) package";\
echo "";\
echo "If all goes well, you should have binaries for inla and fmesher at";\
echo "";\
echo " $(BINPREFIX)";\
echo "";\
echo "and an INLA_*.tgz binary R package in your working directory.";\
echo "";\
echo "To later download and build an updated package, do";\
echo "";\
echo " $(MAKE) update";\
echo "";\
echo "To build a package for the JSS 2015 paper, do";\
echo "";\
echo " $(MAKE) download-jss2014 && $(MAKE) bin && $(MAKE) package";\
echo "";\
echo "Note: Not all lapack versions contain all the needed routines,";\
echo "so make sure that /usr/lib/lapack/liblapack.so is selected in";\
echo "";\
echo " sudo update-alternatives --config liblapack.so";\
echo "";\
echo "It's possible to link to both lapack and lapack_atlas.";\
echo "";\
echo "For x11 enabled fmesher, use lib-install-x11 and bin-x11.";\
echo "";\
echo "To deactivate the use of libR, use '$(MAKE) bin INLA_WITHOUT_LIBR=1'.";\
echo "";)
## Package list updated 2017-12-01
LIBPKG = libgsl0-dev zlib1g-dev \
libsuitesparse-dev \
libxdmcp-dev libx11-dev libc6-dev \
libmuparser-dev \
libmetis-dev libmetis5-dbg libmetis5
LIBPKGX = $(LIBPKG) libx11-dev
lib-install :
$(APT) install -y $(LIBPKG)
lib-install-x11 :
$(APT) install $(LIBPKGX)
init :
@mkdir -p $(LIBPREFIX)
@mkdir -p $(BINPREFIX)
@mkdir -p $(INCPREFIX)
download : init
@( test -d inla && $(MAKE) download-update ) || \
( rm -rf inla && hg clone https://bitbucket.org/hrue/r-inla inla )
@ln -sTf $(PREFIX) inla/local
download-update : init
@cd inla ; hg pull ; hg update
@ln -sTf $(PREFIX) inla/local
download-jss2014 :
@$(MAKE) download
@cd inla ; hg update -r jss2014
@ln -sTf $(PREFIX) inla/local
bin :
$(MAKE) taucs
$(MAKE) fmesher
$(MAKE) GMRFLib
$(MAKE) inla
bin-x11 :
$(MAKE) taucs
$(MAKE) fmesher-x11
$(MAKE) GMRFLib
$(MAKE) inla
update :
$(MAKE) download-update
$(MAKE) bin
$(MAKE) package
fmesher-x11:
$(MAKE) -C inla/fmesher PREFIX=$(PREFIX) $(ARGS) -k clean
$(MAKE) -C inla/fmesher PREFIX=$(PREFIX) FMESHER_USE_X=1 FLAGS="$(FLAGS) -I/usr/include -I/usr/include/gsl -I/opt/R/lib/R/include/ -I${MKLROOT}/include ${MKL}" $(ARGS) EXTLIBS="-lX11 -lgsl -lgslcblas -lxcb -lpthread -lXau -lXdmcp"
$(MAKE) -C inla/fmesher PREFIX=$(PREFIX) $(ARGS) install
@rsync -a $(PREFIX)/bin/fmesher $(BINPREFIX)/fmesher$(BITS)
@rm $(PREFIX)/bin/fmesher
fmesher :
$(MAKE) -C inla/fmesher PREFIX=$(PREFIX) $(ARGS) -k clean
$(MAKE) -C inla/fmesher PREFIX=$(PREFIX) FLAGS="$(FLAGS) -I/usr/include -I/usr/include/gsl -I/opt/R/lib/R/include/ -I${MKLROOT}/include ${MKL}" $(ARGS) EXTLIBS="-lX11 -lgsl -lgslcblas -lxcb -lpthread -lXau -lXdmcp"
$(MAKE) -C inla/fmesher PREFIX=$(PREFIX) $(ARGS) install
@rsync -a $(PREFIX)/bin/fmesher $(BINPREFIX)/fmesher$(BITS)
@rm $(PREFIX)/bin/fmesher
inla :
ln -sTf /usr/include $(INCPREFIX)/muParser
$(MAKE) -C inla/inlaprog PREFIX=$(PREFIX) FLAGS="-lRmath $(FLAGS) -I/usr/include -I/opt/R/lib/R/include/ -I${MKLROOT}/include ${MKL}" $(ARGS) -k clean
$(MAKE) -C inla/inlaprog PREFIX=$(PREFIX) FLAGS="-lRmath $(FLAGS) -I/usr/include -I/opt/R/lib/R/include/ -I${MKLROOT}/include ${MKL}" $(ARGS)
$(MAKE) -C inla/inlaprog PREFIX=$(PREFIX) FLAGS="-lRmath $(FLAGS) -I/usr/include -I/opt/R/lib/R/include/ -I${MKLROOT}/include ${MKL}" $(ARGS) install
@rsync -a $(PREFIX)/bin/inla $(BINPREFIX)/inla$(BITS)
@rm $(PREFIX)/bin/inla $(PREFIX)/bin/inla-snapshot
GMRFLib :
$(MAKE) -C inla/gmrflib PREFIX=$(PREFIX) FLAGS="$(FLAGS) -lRmath -I/usr/include -I/opt/R/lib/R/include/ -I${MKLROOT}/include ${MKL}" $(ARGS) -k clean
$(MAKE) -C inla/gmrflib PREFIX=$(PREFIX) FLAGS="$(FLAGS) -lRmath -I/usr/include -I/opt/R/lib/R/include/ -I${MKLROOT}/include ${MKL}" $(ARGS)
$(MAKE) -C inla/gmrflib PREFIX=$(PREFIX) FLAGS="$(FLAGS) -lRmath -I/usr/include -I/opt/R/lib/R/include/ -I${MKLROOT}/include ${MKL}" $(ARGS) install
sync-taucs :
mkdir -p $(MAINDIR)/tmp
-rm -rf $(MAINDIR)/tmp/taucs-2.2--my-fix
cp inla/extlibs/taucs-2.2--my-fix.tgz $(MAINDIR)/tmp/
cd $(MAINDIR)/tmp ; tar -zxf taucs-2.2--my-fix.tgz
taucs : sync-taucs
$(MAKE) -C $(MAINDIR)/tmp/taucs-2.2--my-fix CFLAGS="$(FLAGS)" FFLAGS="$(FLAGS)" $(ARGS) -k clean
$(MAKE) -C $(MAINDIR)/tmp/taucs-2.2--my-fix CFLAGS="$(FLAGS)" FFLAGS="$(FLAGS)" $(ARGS)
@cp -v -f $(MAINDIR)/tmp/taucs-2.2--my-fix/lib/linux/libtaucs.a $(PREFIX)/lib
package :
@rm -f inla/INLA_*.tgz
cd inla ; utils/build-package-bin $(PREFIX)/bin $(MAINDIR)/tmp
clean :
rm -rf inla
.PHONY: all inla GMRFLib taucs download download-update update fmesher bin init download-jss2014 sync-taucs package clean
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment