-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathmakefile
218 lines (183 loc) · 9.92 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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# Copyright 2019, University of Maryland and the MANGO development team.
#
# This file is part of MANGO.
#
# MANGO is free software: you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# MANGO is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with MANGO. If not, see
# <https://www.gnu.org/licenses/>.
.PHONY: all clean examples test test_make unit_tests write_make_variables
all: lib/libmango.a examples examples/packages_available write_make_variables
# cp obj/mango.mod* include
# cp obj/mango.MOD* include
include makefile.system-dependent
ifeq ($(MANGO_PETSC_AVAILABLE),T)
EXTRA_C_COMPILE_FLAGS += -DMANGO_PETSC_AVAILABLE
EXTRA_F_COMPILE_FLAGS += -DMANGO_PETSC_AVAILABLE
EXTRA_LINK_FLAGS += $(PETSC_LIB)
MANGO_AVAILABLE_PACKAGES += petsc
else ifneq ($(MANGO_PETSC_AVAILABLE),F)
$(error MANGO_PETSC_AVAILABLE must be set to either T or F (case-sensitive))
endif
ifeq ($(MANGO_HOPSPACK_AVAILABLE),T)
# See if hopspack files are present in the expected location
ifeq (,$(wildcard external_packages/hopspack/src/HOPSPACK_MangoEvaluator.cpp))
$(error HOPSPACK modified source files are not present in the expected location external_packages/hopspack/src. You probably need to run "cd external_packages; ./install_hopspack.sh")
endif
EXTRA_C_COMPILE_FLAGS += -DMANGO_HOPSPACK_AVAILABLE -I external_packages/hopspack/src
EXTRA_F_COMPILE_FLAGS += -DMANGO_HOPSPACK_AVAILABLE
HOPSPACK_CPP_SRC_FILES = $(wildcard external_packages/hopspack/src/*.cpp)
HOPSPACK_C_SRC_FILES = $(wildcard external_packages/hopspack/src/*.c)
MANGO_AVAILABLE_PACKAGES += hopspack
else ifneq ($(MANGO_HOPSPACK_AVAILABLE),F)
$(error MANGO_HOPSPACK_AVAILABLE must be set to either T or F (case-sensitive))
endif
ifeq ($(MANGO_NLOPT_AVAILABLE),T)
EXTRA_C_COMPILE_FLAGS += -DMANGO_NLOPT_AVAILABLE
EXTRA_F_COMPILE_FLAGS += -DMANGO_NLOPT_AVAILABLE
MANGO_AVAILABLE_PACKAGES += nlopt
else ifneq ($(MANGO_NLOPT_AVAILABLE),F)
$(error MANGO_NLOPT_AVAILABLE must be set to either T or F (case-sensitive))
endif
ifeq ($(MANGO_GSL_AVAILABLE),T)
EXTRA_C_COMPILE_FLAGS += -DMANGO_GSL_AVAILABLE
EXTRA_F_COMPILE_FLAGS += -DMANGO_GSL_AVAILABLE
MANGO_AVAILABLE_PACKAGES += gsl
else ifneq ($(MANGO_GSL_AVAILABLE),F)
$(error MANGO_GSL_AVAILABLE must be set to either T or F (case-sensitive))
endif
ifeq ($(MANGO_DAKOTA_AVAILABLE),T)
EXTRA_C_COMPILE_FLAGS += -DMANGO_DAKOTA_AVAILABLE
EXTRA_F_COMPILE_FLAGS += -DMANGO_DAKOTA_AVAILABLE
MANGO_AVAILABLE_PACKAGES += dakota
else ifneq ($(MANGO_DAKOTA_AVAILABLE),F)
$(error MANGO_DAKOTA_AVAILABLE must be set to either T or F (case-sensitive))
endif
ifeq ($(MANGO_EIGEN_AVAILABLE),T)
EXTRA_C_COMPILE_FLAGS += -DMANGO_EIGEN_AVAILABLE
EXTRA_F_COMPILE_FLAGS += -DMANGO_EIGEN_AVAILABLE
MANGO_AVAILABLE_PACKAGES += mango
else ifneq ($(MANGO_EIGEN_AVAILABLE),F)
$(error MANGO_EIGEN_AVAILABLE must be set to either T or F (case-sensitive))
endif
# Put .mod files in the ./obj/ directory:
EXTRA_C_COMPILE_FLAGS += -J obj -I obj -I include -I src/algorithms
EXTRA_F_COMPILE_FLAGS += -J obj -I obj
export
CXX = $(CC)
# Automatically detect all the source files
F_SRC_FILES = $(wildcard src/api/*.F90)
F_OBJ_FILES = $(patsubst src/api/%.F90, obj/%.f.o, $(F_SRC_FILES))
CPP_SRC_FILES = $(wildcard src/api/*.cpp)
CPP_OBJ_FILES = $(patsubst src/api/%.cpp, obj/%.cpp.o, $(CPP_SRC_FILES))
ALGORITHM_SRC_FILES = $(wildcard src/algorithms/*.cpp)
ALGORITHM_OBJ_FILES = $(patsubst src/algorithms/%.cpp, obj/%.cpp.o, $(ALGORITHM_SRC_FILES))
HOPSPACK_CPP_OBJ_FILES = $(patsubst external_packages/hopspack/src/%.cpp, obj/%.cpp.o, $(HOPSPACK_CPP_SRC_FILES))
HOPSPACK_C_OBJ_FILES = $(patsubst external_packages/hopspack/src/%.c, obj/%.c.o, $(HOPSPACK_C_SRC_FILES))
HOPSPACK_HEADERS = $(wildcard external_packages/hopspack/src/*.h) $(wildcard external_packages/hopspack/src/*.hpp)
HEADER_FILES = $(wildcard src/api/*.hpp) $(wildcard src/algorithms/*.hpp)
TEST_SRC_FILES = $(wildcard src/api/tests/*.cpp)
TEST_OBJ_FILES = $(patsubst src/api/tests/%.cpp, obj/%.cpp.o, $(TEST_SRC_FILES))
ALGORITHM_TEST_SRC_FILES = $(wildcard src/algorithms/tests/*.cpp)
ALGORITHM_TEST_OBJ_FILES = $(patsubst src/algorithms/tests/%.cpp, obj/%.cpp.o, $(ALGORITHM_TEST_SRC_FILES))
MAKE_VARIABLES_FILE = lib/mangoMakeVariables
include makefile.dependencies
# For info about the "Static pattern rules" below, see e.g.
# https://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Static-Usage.html
# https://stackoverflow.com/questions/4320416/how-to-use-a-variable-list-as-a-target-in-a-makefile
# For now, I'll make all the .o files depend on _all_ the .hpp files. This causes some unnecessary recompiling when .hpp files change, but it eliminates the need for a detailed list of dependencies.
$(F_OBJ_FILES): obj/%.f.o: src/api/%.F90
$(FC) $(EXTRA_F_COMPILE_FLAGS) -c $< -o $@
$(CPP_OBJ_FILES): obj/%.cpp.o: src/api/%.cpp $(HEADER_FILES)
$(CXX) $(EXTRA_C_COMPILE_FLAGS) -I src/api -c $< -o $@
$(ALGORITHM_OBJ_FILES): obj/%.cpp.o: src/algorithms/%.cpp $(HEADER_FILES)
$(CXX) $(EXTRA_C_COMPILE_FLAGS) -I src/api -c $< -o $@
$(TEST_OBJ_FILES): obj/%.cpp.o: src/api/tests/%.cpp $(HEADER_FILES)
$(CXX) $(EXTRA_C_COMPILE_FLAGS) -I external_packages/catch2 -I src/api -c $< -o $@
$(ALGORITHM_TEST_OBJ_FILES): obj/%.cpp.o: src/algorithms/tests/%.cpp $(HEADER_FILES)
$(CXX) $(EXTRA_C_COMPILE_FLAGS) -I external_packages/catch2 -I src/api -I src/algorithms -c $< -o $@
# Each hopspack file does not actually depend on _all_ the hopspack headers, but it is easier to impose a dependency on all the headers than the more precise dependencies.
# Similarly, only the modified hopspack source files depend on mango.hpp, but it is easier to make the dependency apply to all hopspack files here.
$(HOPSPACK_CPP_OBJ_FILES): obj/%.cpp.o: external_packages/hopspack/src/%.cpp $(HOPSPACK_HEADERS) $(HEADER_FILES)
$(CXX) $(EXTRA_C_COMPILE_FLAGS) -I src/api -c $< -o $@
$(HOPSPACK_C_OBJ_FILES): obj/%.c.o: external_packages/hopspack/src/%.c $(HOPSPACK_HEADERS)
$(CC) $(EXTRA_C_COMPILE_FLAGS) -c $< -o $@
lib/libmango.a: $(F_OBJ_FILES) $(CPP_OBJ_FILES) $(ALGORITHM_OBJ_FILES) $(HOPSPACK_CPP_OBJ_FILES) $(HOPSPACK_C_OBJ_FILES)
ar rcs lib/libmango.a $(F_OBJ_FILES) $(CPP_OBJ_FILES) $(ALGORITHM_OBJ_FILES) $(HOPSPACK_CPP_OBJ_FILES) $(HOPSPACK_C_OBJ_FILES)
cp obj/mango_mod.* include
# rm include/mango.o
# cp obj/mango.* include
# May need to copy any fortran module files from obj to include here?
examples: lib/libmango.a
$(MAKE) -C examples
examples/packages_available:
@echo $(MANGO_AVAILABLE_PACKAGES) > examples/packages_available
clean:
rm -f obj/* include/*.mod include/*.MOD include/*.Mod lib/* *~ src/*~ src/api/*~ examples/packages_available tests/unit_tests $(MAKE_VARIABLES_FILE)
$(MAKE) -C examples clean
tests/unit_tests: $(TEST_OBJ_FILES) $(ALGORITHM_TEST_OBJ_FILES) lib/libmango.a
$(CLINKER) -o $@ $^ $(EXTRA_C_LINK_FLAGS)
# Also we have a unit_tests target without "tests/" in front so you don't have to type tests/unit_tests all the time.
unit_tests: tests/unit_tests
test: $(TARGET) unit_tests
cd tests && ./run_mpi_unit_tests
@echo "Beginning functional tests." && cd examples && export MANGO_RETEST=no && ./run_examples
# This next target is used by examples/run_examples to get MANGO_COMMAND_TO_SUBMIT_JOB when run_examples is run standalone.
print_command_to_submit_job:
@echo $(MANGO_COMMAND_TO_SUBMIT_JOB)
# Write a file that can be included in the build system for user applications.
write_make_variables:
@echo MANGO_C_COMPILE_FLAGS = -I $(PWD)/include > $(MAKE_VARIABLES_FILE)
@echo >> $(MAKE_VARIABLES_FILE)
@echo MANGO_F_COMPILE_FLAGS = -I $(PWD)/include >> $(MAKE_VARIABLES_FILE)
@echo >> $(MAKE_VARIABLES_FILE)
@echo MANGO_C_LINK_FLAGS = -L $(PWD)/lib -lmango $(EXTRA_C_LINK_FLAGS) >> $(MAKE_VARIABLES_FILE)
@echo >> $(MAKE_VARIABLES_FILE)
@echo MANGO_F_LINK_FLAGS = -L $(PWD)/lib -lmango $(EXTRA_F_LINK_FLAGS) >> $(MAKE_VARIABLES_FILE)
test_make:
@echo MANGO_HOST is $(MANGO_HOST)
@echo HOSTNAME is $(HOSTNAME)
@echo CC is $(CC)
@echo CXX is $(CXX)
@echo FC is $(FC)
@echo CLINKER is $(CLINKER)
@echo FLINKER is $(FLINKER)
@echo MANGO_PETSC_AVAILABLE is $(MANGO_PETSC_AVAILABLE)
@echo MANGO_HOPSPACK_AVAILABLE is $(MANGO_HOPSPACK_AVAILABLE)
@echo MANGO_NLOPT_AVAILABLE is $(MANGO_NLOPT_AVAILABLE)
@echo MANGO_GSL_AVAILABLE is $(MANGO_GSL_AVAILABLE)
@echo MANGO_DAKOTA_AVAILABLE is $(MANGO_DAKOTA_AVAILABLE)
@echo MANGO_EIGEN_AVAILABLE is $(MANGO_EIGEN_AVAILABLE)
@echo MANGO_AVAILABLE_PACKAGES is $(MANGO_AVAILABLE_PACKAGES)
@echo EXTRA_F_COMPILE_FLAGS is $(EXTRA_F_COMPILE_FLAGS)
@echo EXTRA_C_COMPILE_FLAGS is $(EXTRA_C_COMPILE_FLAGS)
@echo EXTRA_LINK_FLAGS is $(EXTRA_LINK_FLAGS)
@echo EXTRA_F_LINK_FLAGS is $(EXTRA_F_LINK_FLAGS)
@echo EXTRA_C_LINK_FLAGS is $(EXTRA_C_LINK_FLAGS)
@echo F_SRC_FILES is $(F_SRC_FILES)
@echo F_OBJ_FILES is $(F_OBJ_FILES)
@echo CPP_SRC_FILES is $(CPP_SRC_FILES)
@echo CPP_OBJ_FILES is $(CPP_OBJ_FILES)
@echo ALGORITHM_SRC_FILES is $(ALGORITHM_SRC_FILES)
@echo ALGORITHM_OBJ_FILES is $(ALGORITHM_OBJ_FILES)
@echo HEADER_FILES is $(HEADER_FILES)
@echo TEST_SRC_FILES is $(TEST_SRC_FILES)
@echo TEST_OBJ_FILES is $(TEST_OBJ_FILES)
@echo ALGORITHM_TEST_SRC_FILES is $(ALGORITHM_TEST_SRC_FILES)
@echo ALGORITHM_TEST_OBJ_FILES is $(ALGORITHM_TEST_OBJ_FILES)
@echo HOPSPACK_CPP_SRC_FILES is $(HOPSPACK_CPP_SRC_FILES)
@echo HOPSPACK_CPP_SRC_FILES is $(HOPSPACK_C_SRC_FILES)
@echo HOPSPACK_C_OBJ_FILES is $(HOPSPACK_CPP_OBJ_FILES)
@echo HOPSPACK_C_OBJ_FILES is $(HOPSPACK_C_OBJ_FILES)
@echo HOPSPACK_HEADERS is $(HOPSPACK_HEADERS)
@echo "********************* Below are the results of examples/make test_make **********************"
$(MAKE) -C examples test_make