1# Linux/OS X Makefile for PLINK 2.00.
2#
3# Compilation options (leave blank after "=" to disable, put "= 1" to enable):
4#   Do not use AVX2 instructions: NO_AVX2
5#   Do not use SSE4.2 instructions: NO_SSE42
6#   Print clear error message if SSE42/AVX2 needed but missing: CPU_CHECK
7#   Do not link to LAPACK: NO_LAPACK
8#   Use cblas_f77 instead of cblas: FORCE_CBLAS_F77
9#   Use only -O2 optimization for zstd (may be necessary for gcc 4.x): ZSTD_O2
10#   Statically link zlib: STATIC_ZLIB
11#   Statically link zstd: STATIC_ZSTD
12#   Link to MKL with 64-bit indexes (dynamically): DYNAMIC_MKL
13#     (this also requires MKLROOT and MKL_IOMP5_DIR to be defined, and
14#     LD_LIBRARY_PATH to include the appropriate directories)
15#   32-bit binary (also sets STATIC_ZLIB and ZSTD_O2):
16#     FORCE_32BIT (warning: you may need to add a zconf.h symlink to make that
17#     work)
18#   Debug symbols: set DEBUG to -g
19NO_AVX2 = 1
20NO_SSE42 =
21CPU_CHECK = 1
22NO_LAPACK =
23PREFER_CBLAS_F77 =
24ZSTD_O2 = 1
25STATIC_ZLIB =
26STATIC_ZSTD = 1
27DYNAMIC_MKL =
28MKLROOT = /home/ubuntu/intel/mkl
29MKL_IOMP5_DIR = /home/ubuntu/intel/compilers_and_libraries_2017.2.174/linux/compiler/lib/intel64
30FORCE_32BIT =
31DEBUG =
32
33BASEFLAGS=-DZSTD_MULTITHREAD
34# ***** end configuration *****
35
36BASEFLAGS += ${DEBUG}
37
38include ../Makefile.src
39
40LINKFLAGS=-lm -lpthread ${DEBUG}
41ZLIB=
42ARCH32=
43CPUCHECK_FLAGS = ${DEBUG}
44
45ifdef FORCE_32BIT
46  # this is targeted at Scientific Linux 6.
47  STATIC_ZLIB = 1
48  ZSTD_O2 = 1
49  ARCH32 = -m32 -march=i686
50  CXXFLAGS = -std=c++0x
51else
52  ifdef NO_AVX2
53    ifndef NO_SSE42
54      BASEFLAGS += -msse4.2
55      ifdef CPU_CHECK
56        BASEFLAGS += -DCPU_CHECK_SSE42
57        CPUCHECK_FLAGS = -O2 -DCPU_CHECK_SSE42 ${CXXWARN2}
58      endif
59    endif
60  else
61    BASEFLAGS += -mavx2 -mbmi -mbmi2 -mlzcnt
62    ifdef CPU_CHECK
63      BASEFLAGS += -DCPU_CHECK_AVX2
64      CPUCHECK_FLAGS = -O2 -DCPU_CHECK_AVX2 ${CXXWARN2}
65    endif
66  endif
67  CXXFLAGS = -std=c++11
68endif
69BASEFLAGS += ${ARCH32}
70
71CFLAGS=-O2 -std=gnu99
72# zstd appears to be seriously targeted at -O3; see 26 Jul 2016 entry at
73# cbloom.com/rants.html
74ifdef ZSTD_O2
75  ZCFLAGS=-O2 -std=gnu99
76else
77  ZCFLAGS=-O3 -std=gnu99
78endif
79# this actually needs to be named "CXXFLAGS"
80CXXFLAGS += -O2
81
82ifdef FORCE_CBLAS_F77
83  BASEFLAGS += -DFORCE_CBLAS_F77
84  BLASFLAGS=-llapack -lf77blas -latlas
85else
86  BLASFLAGS=-llapack -lblas -lcblas -latlas
87endif
88
89ifdef STATIC_ZLIB
90  BASEFLAGS += -DSTATIC_ZLIB
91  LINKFLAGS += -L. ../../zlib-1.2.11/libz.a
92else
93  LINKFLAGS += -lz
94endif
95
96SKIP_STATIC_ZSTD =
97ifdef STATIC_ZSTD
98  BASEFLAGS += -DSTATIC_ZSTD
99else
100  ZCSRC2 =
101  SKIP_STATIC_ZSTD = echo
102  OBJ = $(CSRC:.c=.o) $(CCSRC:.cc=.o)
103  OBJ2 = $(notdir $(OBJ))
104  LINKFLAGS += -lzstd
105endif
106
107UNAME := $(shell uname)
108ifeq ($(UNAME), Darwin)
109  ifdef FORCE_32BIT
110    $(error 32-bit OS X builds are not supported)
111  endif
112  ifdef DYNAMIC_MKL
113    $(error MKL is not currently supported on OS X)
114  endif
115  BLASFLAGS=-framework Accelerate
116  CXXFLAGS += -stdlib=libc++
117else
118  ifdef DYNAMIC_MKL
119    ifdef NO_LAPACK
120      $(error DYNAMIC_MKL and NO_LAPACK conflict)
121    endif
122    ifdef FORCE_32BIT
123      $(error DYNAMIC_MKL + FORCE_32BIT not supported)
124    endif
125    BASEFLAGS += -DDYNAMIC_MKL -DLAPACK_ILP64 -I${MKLROOT}/include
126    BLASFLAGS = -L${MKLROOT}/lib/intel64 -L${MKL_IOMP5_DIR} -Wl,--no-as-needed -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -liomp5
127    LINKFLAGS += -ldl
128  endif
129endif
130
131ifdef NO_LAPACK
132  BASEFLAGS += -DNOLAPACK
133  BLASFLAGS=
134endif
135
136CFLAGS += ${BASEFLAGS} ${CWARN2} ${CINCLUDE2}
137ZCFLAGS += ${BASEFLAGS} ${CWARN2} ${ZSTD_INCLUDE2}
138CXXFLAGS += ${BASEFLAGS} ${CXXWARN2}
139
140ifdef FORCE_32BIT
141  CXXFLAGS += -Wno-sign-compare
142endif
143
144all: plink2 pgen_compress
145
146plink2: $(CSRC2) $(ZCSRC2) $(CCSRC2) ../plink2_cpu.cc
147	gcc $(CFLAGS) $(CSRC2) -c
148	$(SKIP_STATIC_ZSTD) gcc $(ZCFLAGS) $(ZCSRC2) -c
149	g++ $(CXXFLAGS) $(CCSRC2) -c
150	g++ $(CPUCHECK_FLAGS) ../plink2_cpu.cc -c
151	g++ $(OBJ2) plink2_cpu.o $(ARCH32) -o plink2 $(BLASFLAGS) $(LINKFLAGS)
152
153pgen_compress: $(PGCSRC2)
154	g++ $(CXXFLAGS) $(PGCSRC2) -o pgen_compress
155
156.PHONY: clean
157clean:
158	rm -f *.o
159	rm -f plink2
160	rm -f pgen_compress
161