-
Notifications
You must be signed in to change notification settings - Fork 5.3k
/
Makefile
199 lines (163 loc) · 6.71 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
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
# This is the top-level Makefile for Kaldi.
# Also see kaldi.mk which supplies options and some rules
# used by the Makefiles in the subdirectories.
SHELL := /bin/bash
# Please keep sorted alphabetically, and start each with a letter which
# is different from the first one in the last word one the row above it.
SUBDIRS := base bin chain chainbin cudamatrix decoder \
feat featbin fgmmbin fstbin fstext \
gmm gmmbin hmm \
ivector ivectorbin kws kwsbin \
lat latbin lm lmbin matrix \
nnet nnetbin nnet2 nnet2bin nnet3 nnet3bin \
online2 online2bin rnnlm rnnlmbin \
transform tree util
# Will also build these if configured with --with-cudadecoder
# (default 'true' if CUDA is used, else 'false')
CUDADECODER = cudafeat cudafeatbin cudadecoder cudadecoderbin
MEMTESTDIRS = $(filter-out chainbin cudamatrix rnnlmbin $(SUBDIRS))
CUDAMEMTESTDIR = cudamatrix
# Optional subdirectories
EXT_SUBDIRS := online onlinebin sgmm2 sgmm2bin # python-kaldi-decoding
EXT_SUBDIRS_LIB = $(filter-out %bin, $(EXT_SUBDIRS))
include kaldi.mk
ifeq ($(CUDA), true)
ifeq ($(WITH_CUDADECODER), true)
SUBDIRS += $(CUDADECODER)
endif
endif
SUBDIRS_LIB = $(filter-out %bin, $(SUBDIRS))
SUBDIRS_BIN = $(filter %bin, $(SUBDIRS))
KALDI_SONAME ?= libkaldi.so
# Reset the default goal, so that the all target will become default
.DEFAULT_GOAL :=
all: $(SUBDIRS) matrix/test
-echo Done
mklibdir:
test -d $(KALDILIBDIR) || mkdir $(KALDILIBDIR)
# Don't call rm -rf.
rmlibdir:
ifneq ($(KALDILIBDIR), )
-rm $(KALDILIBDIR)/*{.so,.a,.o}
-rmdir $(KALDILIBDIR)
else
@true
endif
.PHONY: checkversion
checkversion:
ifeq ($(shell ./configure --version),$(CONFIGURE_VERSION))
@echo "The version of configure script matches kaldi.mk version. Good."
else
@echo ""
@echo "The kaldi.mk file was generated using a different version of configure script. Please rerun the configure again"
@test -f ./kaldi.mk && echo "Hint: Previous configure command line: " && head -n 2 ./kaldi.mk | grep configure | sed 's/^# *//g'
@echo ""
@false
endif
biglib: $(SUBDIRS_LIB)
ifeq ($(KALDI_FLAVOR), dynamic)
ifeq ($(shell uname), Darwin)
$(CXX) -dynamiclib -o $(KALDILIBDIR)/libkaldi.dylib -install_name @rpath/libkaldi.dylib -framework Accelerate $(LDFLAGS) $(wildcard $(SUBDIRS_LIB:=/*.dylib))
else
ifeq ($(shell uname), Linux)
# $(warning the following command will probably fail, in that case add -fPIC to your CXXFLAGS and remake all)
$(CXX) -shared -o $(KALDILIBDIR)/$(KALDI_SONAME) -Wl,-soname=$(KALDI_SONAME),--whole-archive $(wildcard $(SUBDIRS_LIB:=/kaldi-*.a)) -Wl,--no-whole-archive $(LDLIBS)
else
$(error Dynamic libraries not supported on this platform. Run configure with --static flag. )
endif
endif
endif
biglibext: $(EXT_SUBDIRS_LIB)
ifeq ($(KALDI_FLAVOR), dynamic)
ifeq ($(shell uname), Darwin)
$(CXX) -dynamiclib -o $(KALDILIBDIR)/libkaldi_ext.dylib -install_name @rpath/libkaldi_ext.dylib -framework Accelerate $(LDFLAGS) $(EXT_SUBDIRS_LIB:=/*.dylib)
else
ifeq ($(shell uname), Linux)
# $(warning The following command will probably fail, in that case add -fPIC to your CXXFLAGS and remake all.)
$(CXX) -shared -o $(KALDILIBDIR)/libkaldi_ext.so -Wl,-soname=libkaldi_ext.so,--whole-archive $(EXT_SUBDIRS_LIB:=/kaldi-*.a) -Wl,--no-whole-archive
else
$(error Dynamic libraries not supported on this platform. Run configure with --static flag. )
endif
endif
endif
kaldi.mk:
@[ -f kaldi.mk ] || { echo "kaldi.mk does not exist; you have to run ./configure"; exit 1; }
# Compile optional stuff
ext: ext_depend $(SUBDIRS) $(EXT_SUBDIRS)
-echo Done
check_portaudio:
@[ -d ../tools/portaudio ] || ( cd ../tools; ./install_portaudio.sh )
clean: rmlibdir
-for x in $(SUBDIRS) $(EXT_SUBDIRS); do $(MAKE) -C $$x clean; done
distclean: clean
-for x in $(SUBDIRS) $(EXT_SUBDIRS); do $(MAKE) -C $$x distclean; done
test: $(addsuffix /test, $(SUBDIRS_LIB))
ext_test: $(addsuffix /test, $(EXT_SUBDIRS_LIB))
# Define an implicit rule, expands to e.g.:
# base/test: base
# $(MAKE) -C base test
%/test: % mklibdir
$(MAKE) -C $< test
cudavalgrind:
-for x in $(CUDAMEMTESTDIR); do $(MAKE) -C $$x valgrind || { echo "valgrind on $$x failed"; exit 1; }; done
valgrind:
-for x in $(MEMTESTDIRS); do $(MAKE) -C $$x valgrind || { echo "valgrind on $$x failed"; exit 1; }; done
base/.depend.mk:
$(MAKE) depend
depend: $(addsuffix /depend, $(SUBDIRS))
%/depend:
$(MAKE) -C $(dir $@) depend
ext_depend: check_portaudio
-for x in $(EXT_SUBDIRS); do $(MAKE) -C $$x depend; done
# 'make libs' to skip binaries, and build only libraries.
.PHONY: libs $(SUBDIRS_LIB)
libs: $(SUBDIRS_LIB) ;
$(SUBDIRS_LIB) : checkversion kaldi.mk mklibdir
$(MAKE) -C $@
.PHONY: bins $(SUBDIRS_BIN) libs
$(SUBDIRS_BIN) : checkversion kaldi.mk mklibdir
$(MAKE) -C $@
.PHONY: $(EXT_SUBDIRS)
$(EXT_SUBDIRS) : checkversion kaldi.mk mklibdir ext_depend
$(MAKE) -C $@
### Dependency list ###
# Three base libraries that mostly everything depends on
BMU = base matrix util
# this is necessary for correct parallel compilation
#1) The tools depend on all the libraries (which is a nonsense)
bin chainbin featbin fgmmbin fstbin gmmbin ivectorbin \
kwsbin latbin lmbin nnet2bin nnet3bin nnetbin online2bin rnnlmbin sgmm2bin: \
$(BMU) chain cudamatrix decoder feat fstext gmm hmm ivector \
kws lat lm nnet nnet2 nnet3 online2 rnnlm sgmm2 transform tree
#2) The libraries have inter-dependencies
base: base/.depend.mk
matrix: base
util: base matrix
feat: $(BMU) gmm transform tree
tree: $(BMU)
gmm: $(BMU) tree
transform: $(BMU) gmm tree
sgmm2: $(BMU) gmm hmm transform tree
fstext: $(BMU) tree
hmm: $(BMU) tree
lm: $(BMU) fstext
decoder: $(BMU) fstext gmm hmm lat transform tree
lat: $(BMU) hmm tree
cudamatrix: $(BMU)
nnet: $(BMU) cudamatrix hmm tree
nnet2: $(BMU) cudamatrix gmm hmm lat transform tree
nnet3: $(BMU) chain cudamatrix decoder fstext gmm hmm lat transform tree
rnnlm: $(BMU) cudamatrix hmm lm nnet3
chain: $(BMU) cudamatrix fstext hmm lat tree
ivector: $(BMU) gmm transform tree
#3) Dependencies for optional parts of Kaldi
onlinebin: $(BMU) cudamatrix decoder feat fstext gmm hmm lat lm nnet nnet2 online sgmm2 transform tree
# python-kaldi-decoding: $(BMU) decoder feat fstext gmm hmm lat online sgmm2 transform tree
online: $(BMU) decoder feat gmm hmm lat transform tree
online2: $(BMU) chain cudamatrix decoder feat gmm hmm ivector lat nnet2 nnet3 transform tree
kws: $(BMU) hmm lat tree
#4) CUDA decoder library and binary dependencies.
cudafeat: $(BMU) cudamatrix feat gmm online2 transform tree
cudafeatbin: cudafeat
cudadecoder: chain cudafeat cudamatrix feat fstext ivector lat nnet3 online2 transform
cudadecoderbin: cudadecoder cudafeat