File: Makefile

package info (click to toggle)
abpoa 1.5.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,048 kB
  • sloc: ansic: 8,445; sh: 762; makefile: 194; python: 123
file content (208 lines) | stat: -rw-r--r-- 7,265 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
.PHONY: default
default: abpoa

#CC          = gcc
OS          := $(shell uname)
ARCH        := $(shell uname -m)
# add -fno-tree-vectorize to avoid certain vectorization errors in O3 optimization
# right now, we are using -O3 for the best performance, and no vectorization errors were found
EXTRA_FLAGS = -Wall -Wno-unused-function -Wno-misleading-indentation# -fno-tree-vectorize

# SIMDE
EXTRA_FLAGS += -DUSE_SIMDE -DSIMDE_ENABLE_NATIVE_ALIASES

# for debug
ifneq ($(debug),)
	EXTRA_FLAGS  += -D __DEBUG__
endif
ifneq ($(sdebug),)
	EXTRA_FLAGS  += -D __SIMD_DEBUG__
endif

# for gdb
ifneq ($(gdb),)
	OPT_FLAGS = -g
else
	OPT_FLAGS = -O3
endif

CFLAGS        += $(CPPFLAGS) $(OPT_FLAGS) $(EXTRA_FLAGS) $(LDFLAGS)

# for gprof
ifneq ($(pg),)
	PG_FLAG  =   -pg
	CFLAGS  +=   -pg
endif

LIB     = -lm -lz -lpthread
ifneq ($(PREFIX),)
	OUT_PRE_DIR = $(PREFIX)
else
	OUT_PRE_DIR = .
endif

BIN_DIR = $(OUT_PRE_DIR)/bin
LIB_DIR = $(OUT_PRE_DIR)/lib
INC_DIR = ./include
SRC_DIR = ./src

# This is everything that gets bundled into our main library
BASIC_OBJS = $(addprefix $(SRC_DIR)/, abpoa_align.o abpoa_graph.o abpoa_plot.o abpoa_seed.o abpoa_seq.o abpoa_output.o abpoa_simd.o kalloc.o kstring.o utils.o)

OBJS = ${BASIC_OBJS} $(addprefix $(SRC_DIR)/, abpoa_align_simd.o)

# auto-detect some appropriate defaults -- this helps users in the common case of macOS with arm
# use ABPOA_DISPATCH_SIMD for x86_64
ifeq ($(ARCH), $(filter $(ARCH), x86_64 amd64))
	# SIMD_FLAG = -march=native
	OBJS = ${BASIC_OBJS} $(addprefix $(SRC_DIR)/, abpoa_align_simd_sse2.o abpoa_align_simd_sse41.o abpoa_align_simd_avx2.o abpoa_align_simd_avx512bw.o \
	                      abpoa_dispatch_simd_sse2.o abpoa_dispatch_simd_sse41.o abpoa_dispatch_simd_avx2.o abpoa_dispatch_simd_avx512bw.o)
endif

ifeq ($(ARCH), $(filter $(ARCH), aarch64 arm64))
ifeq ($(OS), Darwin)
	SIMD_FLAG = -mcpu=apple-m1 -D__AVX2__
	OBJS = ${BASIC_OBJS} $(addprefix $(SRC_DIR)/, abpoa_align_simd.o)
else
	SIMD_FLAG = -march=armv8-a+simd -D__AVX2__
	OBJS = ${BASIC_OBJS} $(addprefix $(SRC_DIR)/, abpoa_align_simd.o)
endif
endif

# override if user specified
ifneq ($(armv7),) # for ARMv7
	SIMD_FLAG   =  -march=armv7-a -mfpu=neon -D__AVX2__
	OBJS = ${BASIC_OBJS} $(addprefix $(SRC_DIR)/, abpoa_align_simd.o)
else
ifneq ($(armv8),) # for ARMv8
ifneq ($(aarch64),) # for Aarch64
	SIMD_FLAG   =  -march=armv8-a+simd -D__AVX2__
	OBJS = ${BASIC_OBJS} $(addprefix $(SRC_DIR)/, abpoa_align_simd.o)
else # for Aarch32
	SIMD_FLAG   =  -march=armv8-a+simd -mfpu=auto -D__AVX2__
	OBJS = ${BASIC_OBJS} $(addprefix $(SRC_DIR)/, abpoa_align_simd.o)
endif
endif
endif

# some more possible overrides
FLAG_SSE2     = -msse2
FLAG_SSE41    = -msse4.1
FLAG_AVX2     = -mavx2
FLAG_AVX512BW = -mavx512bw


$(SRC_DIR)/%.o: $(SRC_DIR)/%.c
		$(CC) -c $(CFLAGS) $^ -I$(INC_DIR) -o $@

BIN      = $(BIN_DIR)/abpoa
ifneq ($(gdb),)
	BIN  = $(BIN_DIR)/gdb_abpoa
endif
ABPOALIB = $(LIB_DIR)/libabpoa.a

ifneq ($(sse2),)
	SIMD_FLAG=$(FLAG_SSE2)
	BIN = $(BIN_DIR)/abpoa_sse2
	OBJS = ${BASIC_OBJS} $(addprefix $(SRC_DIR)/, abpoa_align_simd.o)
	ifneq ($(gdb),)
		BIN = $(BIN_DIR)/gdb_abpoa_sse2
	endif
	ABPOALIB = $(LIB_DIR)/libabpoa_sse2.a
	py_SIMD_FLAG = SSE2=1
else ifneq ($(sse41),)
	SIMD_FLAG=$(FLAG_SSE41)
	BIN = $(BIN_DIR)/abpoa_sse41
	OBJS = ${BASIC_OBJS} $(addprefix $(SRC_DIR)/, abpoa_align_simd.o)
	ifneq ($(gdb),)
		BIN = $(BIN_DIR)/gdb_abpoa_sse41
	endif
	ABPOALIB = $(LIB_DIR)/libabpoa_sse41.a
	py_SIMD_FLAG = SSE41=1
else ifneq ($(avx2),)
	SIMD_FLAG=$(FLAG_AVX2)
	py_SIMD_FLAG = AVX2=1
	BIN = $(BIN_DIR)/abpoa_avx2
	OBJS = ${BASIC_OBJS} $(addprefix $(SRC_DIR)/, abpoa_align_simd.o)
	ifneq ($(gdb),)
		BIN = $(BIN_DIR)/gdb_abpoa_avx2
	endif
	ABPOALIB = $(LIB_DIR)/libabpoa_avx2.a
else ifneq ($(avx512bw),)
	SIMD_FLAG=$(FLAG_AVX512BW)
	BIN = $(BIN_DIR)/abpoa_avx512bw
	OBJS = ${BASIC_OBJS} $(addprefix $(SRC_DIR)/, abpoa_align_simd.o)
	ifneq ($(gdb),)
		BIN = $(BIN_DIR)/gdb_abpoa_avx512bw
	endif
	ABPOALIB = $(LIB_DIR)/libabpoa_avx512bw.a
	py_SIMD_FLAG = AVX512BW=1
endif

EXAMPLE  = example


all:       $(BIN) 
abpoa:     $(BIN)
libabpoa:  $(ABPOALIB)
example:   $(EXAMPLE)

$(BIN):$(SRC_DIR)/abpoa.o $(ABPOALIB)
	if [ ! -d $(BIN_DIR) ]; then mkdir $(BIN_DIR); fi
# nm -g $(ABPOALIB)
	$(CC) $(CFLAGS) $< -I$(INC_DIR) $(ABPOALIB) $(LIB) -o $@ $(PG_FLAG)

# multiple SSE versions
multi:
	make clean all sse2=1
	make clean all sse41=1
	make clean all avx2=1
	make clean all avx512bw=1

$(EXAMPLE):example.c $(ABPOALIB)
	$(CC) $(CFLAGS) $< -o $@ -I$(INC_DIR) $(ABPOALIB) $(LIB)

$(ABPOALIB):$(OBJS)
	if [ ! -d $(LIB_DIR) ]; then mkdir $(LIB_DIR); fi
	$(AR) -csr $@ $(OBJS)

$(SRC_DIR)/abpoa.o:$(SRC_DIR)/abpoa.c $(SRC_DIR)/abpoa.h $(SRC_DIR)/abpoa_graph.h $(SRC_DIR)/abpoa_align.h \
                   $(SRC_DIR)/abpoa_seq.h $(SRC_DIR)/utils.h $(SRC_DIR)/simd_instruction.h
	$(CC) -c $(CFLAGS) -I$(INC_DIR) $< -o $@

$(SRC_DIR)/simd_check.o:$(SRC_DIR)/simd_check.c $(SRC_DIR)/simd_instruction.h
	$(CC) -c $(CFLAGS) $(SIMD_FLAG) -I$(INC_DIR) $< -o $@

$(SRC_DIR)/abpoa_align_simd.o:$(SRC_DIR)/abpoa_align_simd.c $(SRC_DIR)/abpoa_graph.h $(SRC_DIR)/abpoa_align.h $(SRC_DIR)/simd_instruction.h $(SRC_DIR)/utils.h
	$(CC) -c $(CFLAGS) $(SIMD_FLAG) -I$(INC_DIR) $< -o $@

$(SRC_DIR)/abpoa_align_simd_sse2.o:$(SRC_DIR)/abpoa_align_simd.c $(SRC_DIR)/abpoa_graph.h $(SRC_DIR)/abpoa_align.h $(SRC_DIR)/simd_instruction.h $(SRC_DIR)/utils.h
	$(CC) -c $(CFLAGS) -DABPOA_SIMD_DISPATCH -msse2 -U__SSE4_1__ -I$(INC_DIR) $< -o $@
$(SRC_DIR)/abpoa_align_simd_sse41.o:$(SRC_DIR)/abpoa_align_simd.c $(SRC_DIR)/abpoa_graph.h $(SRC_DIR)/abpoa_align.h $(SRC_DIR)/simd_instruction.h $(SRC_DIR)/utils.h
	$(CC) -c $(CFLAGS) -DABPOA_SIMD_DISPATCH -msse4.1 -I$(INC_DIR) $< -o $@
$(SRC_DIR)/abpoa_align_simd_avx2.o:$(SRC_DIR)/abpoa_align_simd.c $(SRC_DIR)/abpoa_graph.h $(SRC_DIR)/abpoa_align.h $(SRC_DIR)/simd_instruction.h $(SRC_DIR)/utils.h
	$(CC) -c $(CFLAGS) -DABPOA_SIMD_DISPATCH -mavx2 -I$(INC_DIR) $< -o $@
$(SRC_DIR)/abpoa_align_simd_avx512bw.o:$(SRC_DIR)/abpoa_align_simd.c $(SRC_DIR)/abpoa_graph.h $(SRC_DIR)/abpoa_align.h $(SRC_DIR)/simd_instruction.h $(SRC_DIR)/utils.h
	$(CC) -c $(CFLAGS) -DABPOA_SIMD_DISPATCH -mavx512bw -I$(INC_DIR) $< -o $@
$(SRC_DIR)/abpoa_dispatch_simd_sse2.o:$(SRC_DIR)/abpoa_dispatch_simd.c $(SRC_DIR)/abpoa.h
	$(CC) -c $(CFLAGS) -DABPOA_SIMD_DISPATCH -msse2 -U__SSE4_1__ -I$(INC_DIR) $< -o $@
$(SRC_DIR)/abpoa_dispatch_simd_sse41.o:$(SRC_DIR)/abpoa_dispatch_simd.c $(SRC_DIR)/abpoa.h
	$(CC) -c $(CFLAGS) -DABPOA_SIMD_DISPATCH -msse4.1 -I$(INC_DIR) $< -o $@
$(SRC_DIR)/abpoa_dispatch_simd_avx2.o:$(SRC_DIR)/abpoa_dispatch_simd.c $(SRC_DIR)/abpoa.h
	$(CC) -c $(CFLAGS) -DABPOA_SIMD_DISPATCH -mavx2 -I$(INC_DIR) $< -o $@
$(SRC_DIR)/abpoa_dispatch_simd_avx512bw.o:$(SRC_DIR)/abpoa_dispatch_simd.c $(SRC_DIR)/abpoa.h
	$(CC) -c $(CFLAGS) -DABPOA_SIMD_DISPATCH -mavx512bw -I$(INC_DIR) $< -o $@

install_py: setup.py python/cabpoa.pxd python/pyabpoa.pyx python/README.md
	${py_SIMD_FLAG} python setup.py install
	
sdist: setup.py python/cabpoa.pxd python/pyabpoa.pyx python/README.md
	${py_SIMD_FLAG} python setup.py sdist #bdist_wheel

publish_pypi: clean_py sdist
	twine upload dist/*

clean:
	rm -f $(SRC_DIR)/*.[oa] $(LIB_DIR)/*.[oa] $(BIN)
clean_py:
	rm -rf build/ dist/ pyabpoa.egg-info/ python/pyabpoa.c pyabpoa.cpython-*.so