-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMakefile
158 lines (115 loc) · 3.85 KB
/
Makefile
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
BUILD_SOURCES=build-sources.inc
# backend flags
TENSOR_BACKEND_CLAPACK=0
TENSOR_BACKEND_GSL=1
TENSOR_BACKEND_BLAS=2
# set backend
TENSOR_BACKEND=$(TENSOR_BACKEND_CLAPACK)
# general pascal flags
TENSOR_USE_UXHW=0
TENSOR_USE_SIMD=0
TENSOR_PRINT_VERBOSE=0
TENSOR_USE_ASSERT=0
# arbiter flags
ARBITER_VERBOSE=0
ARBITER_STDERR_LOG_DIR=
ENTRYPOINT=main
# source directories
SRC_DIR=src
PYTHON_SRC=python-src
# other directories
BUILD_DIR=build
INCLUDE_DIR=include
LIBS_DIR=libs
TESTS_DIR=tests
CONFIGS_DIR=configs
EXAMPLES_DIR=examples
BENCHMARKS_DIR=benchmarks
DOCS_DIR=docs
# get platform name. Should be darwin (macOs) or linux (Linux)
PLATFORM=$(shell uname -s | awk '{print tolower($$0)}')
LIB=$(LIBS_DIR)/libpascal.a
# default initial compile flags
INCLUDE_FLAGS= -I$(INCLUDE_DIR) -Iarbiter/include
LDFLAGS=-L$(LIBS_DIR) -lpascal
CFLAGS=
FRAMEWORK_FLAGS=
# default optimisation level and debug flags
OPTFLAGS=-O3
DEBUG_FLAGS=
CC=clang
LD=ld
PYTHON=python
CONFIGURATION=default
include $(CONFIGS_DIR)/$(CONFIGURATION).conf
CFLAGS+=-D'TENSOR_PRINT_VERBOSE=$(TENSOR_PRINT_VERBOSE)' -D'TESTS_VERBOSE=$(TESTS_VERBOSE)' -D'TESTS_STDERR_LOG_DIR="$(TESTS_STDERR_LOG_DIR)"' -D'TENSOR_USE_SIMD=$(TENSOR_USE_SIMD)' -D'TENSOR_USE_ASSERT=$(TENSOR_USE_ASSERT)' -D'TENSOR_USE_UXHW=$(TENSOR_USE_UXHW)' -D'TENSOR_BACKEND_GSL=$(TENSOR_BACKEND_GSL)' -D'TENSOR_BACKEND_BLAS=$(TENSOR_BACKEND_BLAS)' -D'TENSOR_BACKEND_CLAPACK=$(TENSOR_BACKEND_CLAPACK)'
include $(BUILD_SOURCES)
SOURCES_FLAT:= $(SOURCES:$(SRC_DIR)/%=%)
OBJECTS := $(SOURCES_FLAT:%=$(BUILD_DIR)/%.o)
TESTS := \
$(TESTS_DIR)/load_data \
$(TESTS_DIR)/tensor_integration \
$(TESTS_DIR)/tensor \
$(TESTS_DIR)/tensor_random_sample \
$(TESTS_DIR)/tensor_utils \
$(TESTS_DIR)/autodiff \
$(TESTS_DIR)/autodiff_primitives \
$(TESTS_DIR)/tensor_broadcast \
$(TESTS_DIR)/tensor_iterate \
EXAMPLES := \
bnn-simple \
gp-simple \
nn-simple \
bnn-inference
EXPERIMENTS := \
BENCHMARKS := \
tensor-single \
.PHONY := \
default \
lib \
test \
examples \
benchmarks \
clean \
docs \
default: lib
lib: $(LIB)
$(LIB): Makefile $(OBJECTS)
mkdir -p $(dir $@)
ar r $@ $(filter-out $<,$^)
$(BUILD_DIR)/$(ENTRYPOINT).o: Makefile $(ENTRYPOINT).c
mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(OPTFLAGS) $(DEBUG_FLAGS) $(INCLUDE_FLAGS) -c $(filter-out $<,$^) -o $@
$(BUILD_DIR)/%.o: Makefile $(SRC_DIR)/%.c
mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(OPTFLAGS) $(DEBUG_FLAGS) $(INCLUDE_FLAGS) -c $(filter-out $<,$^) -o $@
$(BUILD_DIR)/arbiter/src/arbiter.o: Makefile arbiter/src/arbiter.c arbiter/include/arbiter.h
mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(OPTFLAGS) $(DEBUG_FLAGS) $(INCLUDE_FLAGS) -D'ARBITER_STDERR_LOG_DIR="$(ARBITER_STDERR_LOG_DIR)"' -D'ARBITER_VERBOSE=$(ARBITER_VERBOSE)' -c arbiter/src/arbiter.c -o $@
$(TESTS_DIR)/%/test: $(TESTS_DIR)/%/test.o $(BUILD_DIR)/arbiter/src/arbiter.o $(LIB)
$(LD) $< $(BUILD_DIR)/arbiter/src/arbiter.o $(FRAMEWORK_FLAGS) -o $@ $(LDFLAGS)
$(TESTS_DIR)/%/test.o: $(TESTS_DIR)/%/test.c
$(CC) $(OPTFLAGS) $(CFLAGS) -c $< $(INCLUDE_FLAGS) -o $@
test: $(TESTS:%=%/test)
$(foreach executable,$^,$(executable);)
.SECONDEXPANSION:
$(addprefix eg-,$(EXAMPLES)): $(EXAMPLES_DIR)/$$(patsubst eg-%,%,$$@)/Makefile $(LIB)
@cd $(EXAMPLES_DIR)/$(patsubst eg-%,%,$@); make run PYTHON=$(PYTHON); echo
.SECONDEXPANSION:
$(addprefix bm-,$(BENCHMARKS)): $(BENCHMARKS_DIR)/$$(patsubst bm-%,%,$$@)/Makefile $(LIB)
cd $(BENCHMARKS_DIR)/$(patsubst bm-%,%,$@); make run PYTHON=$(PYTHON)
examples: $(EXAMPLES:%=eg-%)
benchmarks: $(BENCHMARKS:%=bm-%)
clean:
rm -rfv $(BUILD_DIR)/*
rm -fv $(ENTRYPOINT) \
$(LIB) \
$(OBJECTS) \
$(TESTS:%=%/test) \
$(TESTS:%=%/test.o) \
$(TESTS:%=$(TESTS_DIR)/%/test) \
$(TESTS:%=$(TESTS_DIR)/%/test) \
$(if $(EXAMPLES), cd $(EXAMPLES:%=$(EXAMPLES_DIR)/%); make clean, )
$(if $(BENCHMARKS), cd $(BENCHMARKS:%=$(BENCHMARKS_DIR)/%); make clean, )
docs : $(DOCS_DIR)/config
doxygen $(DOCS_DIR)/config