forked from RapidsAtHKUST/CommunityDetectionCodes
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
184 lines (138 loc) · 4.93 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
CXXFLAGS = -Wall -pipe
LDFLAGS =
CXX_CLANG := $(shell $(CXX) --version 2>/dev/null | grep clang)
ifeq "$(findstring debug, $(MAKECMDGOALS))" "debug"
CXXFLAGS += -O0 -g
else
ifeq "$(CXX_CLANG)" ""
CXXFLAGS += -O4
ifneq "$(findstring noomp, $(MAKECMDGOALS))" "noomp"
CXXFLAGS += -fopenmp
LDFLAGS += -fopenmp
endif
else
CXXFLAGS += -O3
endif
endif
##################################################
# General file dependencies
##################################################
HEADERS := $(shell find src -name "*.h")
SOURCES := $(shell find src -name "*.cpp")
# Only one main
SOURCES := $(filter-out src/Informatter.cpp,$(SOURCES))
OBJECTS := $(SOURCES:src/%.cpp=build/Infomap/%.o)
##################################################
# Stand-alone C++ targets
##################################################
INFORMATTER_OBJECTS = $(OBJECTS:Infomap.o=Informatter.o)
.PHONY: all noomp test debug
Infomap: $(OBJECTS)
@echo "Linking object files to target $@..."
$(CXX) $(LDFLAGS) -o $@ $^
@echo "-- Link finished --"
Infomap-formatter: $(INFORMATTER_OBJECTS)
@echo "Making Informatter..."
$(CXX) $(LDFLAGS) -o $@ $^
all: Infomap Infomap-formatter
@true
## Generic compilation rule for object files from cpp files
build/Infomap/%.o : src/%.cpp $(HEADERS) Makefile
@mkdir -p $(dir $@)
$(CXX) $(CXXFLAGS) -c $< -o $@
noomp: Infomap
@true
debug: Infomap
@true
##################################################
# JavaScript through Emscripten
##################################################
.PHONY: js js-worker
js: build/js/Infomap.js
@echo "Built $^"
js-worker: build/js/Infomap-worker.js
@echo "Built $^"
# em++ -O0 -s PROXY_TO_WORKER=1 -s PROXY_TO_WORKER_FILENAME='Infomap.js' -o Infomap.js $^
# em++ -O0 -s PROXY_TO_WORKER=1 -s EXPORT_NAME='Infomap' -s MODULARIZE=1 -o Infomap.js $^
build/js/Infomap-worker.js: $(SOURCES)
@echo "Compiling Infomap to run in a worker in the browser..."
@mkdir -p $(dir $@)
em++ -O0 -s ALLOW_MEMORY_GROWTH=1 --pre-js interfaces/js/pre-worker-module.js -o build/js/Infomap-worker.js $^
build/js/Infomap.js: $(SOURCES)
@echo "Compiling Infomap for Node.js..."
@mkdir -p $(dir $@)
em++ -O0 -o build/js/Infomap.js $^
##################################################
# Static C++ library
##################################################
# Use separate object files to compile with definitions
# NS_INFOMAP: Wrap code in namespace infomap
# AS_LIB: Skip main function
LIB_DIR = build/lib
LIB_HEADERS := $(HEADERS:src/%.h=include/%.h)
LIB_OBJECTS := $(SOURCES:src/%.cpp=build/lib/%.o)
.PHONY: lib
lib: lib/libInfomap.a $(LIB_HEADERS)
@echo "Wrote static library to lib/ and headers to include/"
lib/libInfomap.a: $(LIB_OBJECTS) Makefile
@echo "Creating static library..."
@mkdir -p lib
ar rcs $@ $^
# Rule for $(LIB_HEADERS)
include/%.h: src/%.h
@mkdir -p $(dir $@)
@cp -a $^ $@
# Rule for $(LIB_OBJECTS)
build/lib/%.o: src/%.cpp
@mkdir -p $(dir $@)
$(CXX) $(CXXFLAGS) -DNS_INFOMAP -DAS_LIB -c $< -o $@
##################################################
# General SWIG helpers
##################################################
SWIG_FILES := $(shell find interfaces/swig -name "*.i")
##################################################
# Python module
##################################################
PY_BUILD_DIR = build/py
PY_HEADERS := $(HEADERS:src/%.h=$(PY_BUILD_DIR)/src/%.h)
PY_SOURCES := $(SOURCES:src/%.cpp=$(PY_BUILD_DIR)/src/%.cpp)
.PHONY: python py-build
# Use python distutils to compile the module
python: py-build Makefile
@cp -a interfaces/python/setup.py $(PY_BUILD_DIR)/
cd $(PY_BUILD_DIR) && python setup.py build_ext --inplace
@true
# Generate wrapper files from source and interface files
py-build: $(PY_HEADERS) $(PY_SOURCES)
@mkdir -p $(PY_BUILD_DIR)
@cp -a $(SWIG_FILES) $(PY_BUILD_DIR)/
swig -c++ -python -outdir $(PY_BUILD_DIR) -o $(PY_BUILD_DIR)/infomap_wrap.cpp $(PY_BUILD_DIR)/Infomap.i
# Rule for $(PY_HEADERS) and $(PY_SOURCES)
$(PY_BUILD_DIR)/src/%: src/%
@mkdir -p $(dir $@)
@cp -a $^ $@
##################################################
# R module
##################################################
R_BUILD_DIR = build/R
R_HEADERS := $(HEADERS:src/%.h=$(R_BUILD_DIR)/src/%.h)
R_SOURCES := $(SOURCES:src/%.cpp=$(R_BUILD_DIR)/src/%.cpp)
.PHONY: R R-build
# Use R to compile the module
R: R-build Makefile
cd $(R_BUILD_DIR) && CXX="$(CXX)" PKG_CPPFLAGS="$(CXXFLAGS) -DAS_LIB" PKG_LIBS="$(LDFLAGS)" R CMD SHLIB infomap_wrap.cpp $(SOURCES)
@true
# Generate wrapper files from source and interface files
R-build: Makefile $(R_HEADERS) $(R_SOURCES)
@mkdir -p $(R_BUILD_DIR)
@cp -a $(SWIG_FILES) $(R_BUILD_DIR)/
swig -c++ -r -outdir $(R_BUILD_DIR) -o $(R_BUILD_DIR)/infomap_wrap.cpp $(R_BUILD_DIR)/Infomap.i
# Rule for $(R_HEADERS) and $(R_SOURCES)
$(R_BUILD_DIR)/src/%: src/%
@mkdir -p $(dir $@)
@cp -a $^ $@
##################################################
# Clean
##################################################
clean:
$(RM) -r Infomap Infomap-formatter build lib include