forked from NOAA-GFDL/MOM6-examples
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
323 lines (269 loc) · 11.3 KB
/
Copy pathMakefile
File metadata and controls
323 lines (269 loc) · 11.3 KB
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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
# Helper Makefile for driving building, running, testing of MOM_parameter_doc files
# in ocean_only, ice_ocean_SIS2, and coupled_AM2_LM3_SIS2. The real work is done
# by Makefile in those directories.
#
# `make` or `make build` - builds the ocean_only and ice_ocean_SIS2 executables
# `make gfdl` - does the same and also builds coupled_AM2_LM3_SIS2
# (this will only work inside the GFDL firewall *and*
# with FMS_CODEBASE=src/FMS1)
# `make run.all` - runs the experiments in ocean_only. and ice_ocean_SIS2/
# (runs are conducted in a sub-directory "scratch" local to
# ocean_only/ and ice_ocean_SIS2/, e.g. ocean_only/scratch)
# `make run.gfdl` - ... also runs the experiments in coupled_AM2_LM3_SIS2/
# `make test.all` - tests the state of MOM_parameter_doc files for
# ocean_only/ and ice_ocean_SIS2/
# `make test.gfdl` - you guessed it! The same and also for coupled_AM2_LM3_SIS2
#
# Other ways to do things:
#
# `make BUILD=build123` - will build the executables in MOM6-examples/build123
# `make TESTDIR=tmp` - will run the executables in ocean_only/tmp/DOME/, etc.
# `make TESTDIR=.` - will run the executables in place
# `make FMS_CODEBASE=src/FMS1 - will build with FMS1 (FMS2 is the default)
-include config.mk
# Configuration
BUILD ?=
FMS_CODEBASE ?= src/FMS2_gpu
# Variable `export` replaces the default autoconf values with empty strings.
# This restores the default values.
CFLAGS ?= -g -O2
FCFLAGS ?= -g -O2
# Pass autoconf environment variables to submakes
export CPPFLAGS
export CC
export MPICC
export CFLAGS
export FC
export MPIFC
export FCFLAGS
export LDFLAGS
export LIBS
export PYTHON
export LAUNCHER
export LAUNCHER_NP_FLAG
export LAUNCHER_FLAGS
# Disable builtin rules and variables
MAKEFLAGS += -rR
#------
# make
# Public models
.PHONY: all
all: build.all
.PHONY: build.all
build build.all: ocean_only ice_ocean_SIS2
# GFDL-specific coupled models (requires access to GFDL intranet)
ifeq ($(FMS_CODEBASE), src/FMS2)
.PHONY: gfdl
gfdl: build.gfdl
build.gfdl:
echo "The build.gfdl target is not available using FMS_CODEBASE=src/FMS2"
else
.PHONY: gfdl
gfdl: build.gfdl
.PHONY: build.gfdl
build.gfdl: ocean_only ice_ocean_SIS2 coupled_AM2_LM3_SIS2
endif
# If BUILD is defined, override the default values and store as macros.
# These are passed to the submake build/run/test rules.
ifdef BUILD
FMS_BUILD = $(abspath $(BUILD)/fms)
ATMOS_NULL_BUILD = $(abspath $(BUILD)/atmos_null)
AM2_BUILD = $(abspath $(BUILD)/AM2)
LAND_NULL_BUILD = $(abspath $(BUILD)/land_null)
LM3_BUILD = $(abspath $(BUILD)/LM3)
ICEBERGS_BUILD = $(abspath $(BUILD)/icebergs)
ICE_PARAM_BUILD = $(abspath $(BUILD)/ice_param)
OCEAN_ONLY_BUILD = $(abspath $(BUILD)/ocean_only)
ICE_OCEAN_BUILD = $(abspath $(BUILD)/ice_ocean_SIS2)
COUPLED_BUILD = $(abspath $(BUILD)/coupled_AM2_LM3_SIS2)
FMS_BUILDFLAGS = BUILD=$(FMS_BUILD)
ATMOS_NULL_BUILDFLAGS = \
BUILD=$(ATMOS_NULL_BUILD) \
FMS_BUILD=$(FMS_BUILD)
AM2_BUILDFLAGS = \
BUILD=$(AM2_BUILD) \
FMS_BUILD=$(FMS_BUILD)
LAND_NULL_BUILDFLAGS = \
BUILD=$(LAND_NULL_BUILD) \
FMS_BUILD=$(FMS_BUILD)
LM3_BUILDFLAGS = \
BUILD=$(LM3_BUILD) \
FMS_BUILD=$(FMS_BUILD)
ICEBERGS_BUILDFLAGS = \
BUILD=$(ICEBERGS_BUILD) \
FMS_BUILD=$(FMS_BUILD)
ICE_PARAM_BUILDFLAGS = \
BUILD=$(ICE_PARAM_BUILD) \
FMS_BUILD=$(FMS_BUILD)
OCEAN_ONLY_BUILDFLAGS = \
BUILD=$(OCEAN_ONLY_BUILD) \
FMS_BUILD=$(FMS_BUILD)
ICE_OCEAN_BUILDFLAGS = \
BUILD=$(ICE_OCEAN_BUILD) \
FMS_BUILD=$(FMS_BUILD) \
ATMOS_BUILD=$(ATMOS_NULL_BUILD) \
LAND_BUILD=$(LAND_NULL_BUILD) \
ICEBERGS_BUILD=$(ICEBERGS_BUILD) \
ICE_PARAM_BUILD=$(ICE_PARAM_BUILD)
COUPLED_BUILDFLAGS = \
BUILD=$(COUPLED_BUILD) \
FMS_BUILD=$(FMS_BUILD) \
AM2_BUILD=$(AM2_BUILD) \
LM3_BUILD=$(LM3_BUILD) \
ICEBERGS_BUILD=$(ICEBERGS_BUILD) \
ICE_PARAM_BUILD=$(ICE_PARAM_BUILD)
else
# These reflect the default build locations used by the Makefile in each of shared/*/,
# ocean_only/, ice_ocean_SIS2/, and coupled_AM2_LM3_SIS2/
FMS_BUILD = shared/fms/build
ATMOS_NULL_BUILD = shared/atmos_null/build
AM2_BUILD = shared/AM2/build
LAND_NULL_BUILD = shared/land_null/build
LM3_BUILD = shared/LM3/build
ICEBERGS_BUILD = shared/icebergs/build
ICE_PARAM_BUILD = shared/ice_param/build
OCEAN_ONLY_BUILD = ocean_only/build
ICE_OCEAN_BUILD = ice_ocean_SIS2/build
COUPLED_BUILD = coupled_AM2_LM3_SIS2/build
endif
.PHONY: ocean_only
ocean_only: $(OCEAN_ONLY_BUILD)/MOM6
$(OCEAN_ONLY_BUILD)/MOM6: $(FMS_BUILD)/libFMS.a
$(OCEAN_ONLY_BUILD)/MOM6: $(wildcard src/MOM6/src/*/*)
$(OCEAN_ONLY_BUILD)/MOM6: $(wildcard src/MOM6/src/*/*/*)
$(OCEAN_ONLY_BUILD)/MOM6: $(wildcard src/MOM6/config_src/memory/*)
$(OCEAN_ONLY_BUILD)/MOM6: $(wildcard src/MOM6/config_src/infra/*/*)
$(OCEAN_ONLY_BUILD)/MOM6: $(wildcard src/MOM6/config_src/external/*/*)
$(OCEAN_ONLY_BUILD)/MOM6: $(wildcard src/MOM6/config_src/drivers/solo_driver/*)
@echo make[$(MAKELEVEL)] Building target $@ ...
$(MAKE) -C ocean_only $(OCEAN_ONLY_BUILDFLAGS) FMS_CODEBASE=$(abspath $(FMS_CODEBASE) )
@echo make[$(MAKELEVEL)] ... done building target $@
.PHONY: ice_ocean_SIS2
ice_ocean_SIS2: $(ICE_OCEAN_BUILD)/coupler_main
$(ICE_OCEAN_BUILD)/coupler_main: $(LAND_NULL_BUILD)/libland_null.a
$(ICE_OCEAN_BUILD)/coupler_main: $(ATMOS_NULL_BUILD)/libatmos_null.a
$(ICE_OCEAN_BUILD)/coupler_main: $(ICE_PARAM_BUILD)/libice_param.a
$(ICE_OCEAN_BUILD)/coupler_main: $(ICEBERGS_BUILD)/libicebergs.a
$(ICE_OCEAN_BUILD)/coupler_main: $(wildcard src/MOM6/src/*/*)
$(ICE_OCEAN_BUILD)/coupler_main: $(wildcard src/MOM6/src/*/*/*)
$(ICE_OCEAN_BUILD)/coupler_main: $(wildcard src/MOM6/config_src/memory/*)
$(ICE_OCEAN_BUILD)/coupler_main: $(wildcard src/MOM6/config_src/infra/*/*)
$(ICE_OCEAN_BUILD)/coupler_main: $(wildcard src/MOM6/config_src/external/*/*)
$(ICE_OCEAN_BUILD)/coupler_main: $(wildcard src/MOM6/config_src/drivers/FMS_cap/*)
@echo make[$(MAKELEVEL)] Building target $@ ...
$(MAKE) -C ice_ocean_SIS2 $(ICE_OCEAN_BUILDFLAGS) FMS_CODEBASE=$(abspath $(FMS_CODEBASE) )
@echo make[$(MAKELEVEL)] ... done building target $@
.PHONY: coupled_AM2_LM3_SIS2
coupled_AM2_LM3_SIS2: $(COUPLED_BUILD)/coupler_main
$(COUPLED_BUILD)/coupler_main: $(AM2_BUILD)/libAM2.a
$(COUPLED_BUILD)/coupler_main: $(LM3_BUILD)/libLM3.a
$(COUPLED_BUILD)/coupler_main: $(ICE_PARAM_BUILD)/libice_param.a
$(COUPLED_BUILD)/coupler_main: $(ICEBERGS_BUILD)/libicebergs.a
$(COUPLED_BUILD)/coupler_main: $(wildcard src/MOM6/src/*/*)
$(COUPLED_BUILD)/coupler_main: $(wildcard src/MOM6/src/*/*/*)
$(COUPLED_BUILD)/coupler_main: $(wildcard src/MOM6/config_src/memory/*)
$(COUPLED_BUILD)/coupler_main: $(wildcard src/MOM6/config_src/infra/*/*)
$(COUPLED_BUILD)/coupler_main: $(wildcard src/MOM6/config_src/external/*/*)
$(COUPLED_BUILD)/coupler_main: $(wildcard src/MOM6/config_src/drivers/FMS_cap/*)
@echo make[$(MAKELEVEL)] Building target $@ ...
$(MAKE) -C coupled_AM2_LM3_SIS2 $(COUPLED_BUILDFLAGS) FMS_CODEBASE=$(abspath $(FMS_CODEBASE) )
@echo make[$(MAKELEVEL)] ... done building target $@
.PHONY: land_null
land_null: $(LAND_NULL_BUILD)/libland_null.a
$(LAND_NULL_BUILD)/libland_null.a: $(FMS_BUILD)/libFMS.a
$(LAND_NULL_BUILD)/libland_null.a: $(wildcard src/land_null/*)
@echo make[$(MAKELEVEL)] Building target $@ ...
$(MAKE) -C shared/land_null $(LAND_NULL_BUILDFLAGS) FMS_CODEBASE=$(abspath $(FMS_CODEBASE) )
@echo make[$(MAKELEVEL)] ... done building target $@
.PHONY: LM3
LM3: $(LM3_BUILD)/libLM3.a
$(LM3_BUILD)/libLM3.a: $(FMS_BUILD)/libFMS.a
$(LM3_BUILD)/libLM3.a: $(wildcard src/LM3/*/* src/LM3/*/*/*)
@echo make[$(MAKELEVEL)] Building target $@ ...
$(MAKE) -C shared/LM3 $(LM3_BUILDFLAGS) FMS_CODEBASE=$(abspath $(FMS_CODEBASE) )
@echo make[$(MAKELEVEL)] ... done building target $@
.PHONY: atmos_null
atmos_null: $(ATMOS_NULL_BUILD)/libatmos_null.a
$(ATMOS_NULL_BUILD)/libatmos_null.a: $(FMS_BUILD)/libFMS.a
$(ATMOS_NULL_BUILD)/libatmos_null.a: $(wildcard src/atmos_null/*)
@echo make[$(MAKELEVEL)] Building target $@ ...
$(MAKE) -C shared/atmos_null $(ATMOS_NULL_BUILDFLAGS) FMS_CODEBASE=$(abspath $(FMS_CODEBASE) )
@echo make[$(MAKELEVEL)] ... done building target $@
.PHONY: AM2
AM2: $(AM2_BUILD)/libAM2.a
$(AM2_BUILD)/libAM2.a: $(FMS_BUILD)/libFMS.a
$(AM2_BUILD)/libAM2.a: $(wildcard src/AM2/*/* src/AM2/*/*/*)
@echo make[$(MAKELEVEL)] Building target $@ ...
$(MAKE) -C shared/AM2 $(AM2_BUILDFLAGS) FMS_CODEBASE=$(abspath $(FMS_CODEBASE) )
@echo make[$(MAKELEVEL)] ... done building target $@
.PHONY: icebergs
icebergs: $(ICEBERGS_BUILD)/libicebergs.a
$(ICEBERGS_BUILD)/libicebergs.a: $(FMS_BUILD)/libFMS.a
$(ICEBERGS_BUILD)/libicebergs.a: $(wildcard src/icebergs/src/*)
@echo make[$(MAKELEVEL)] Building target $@ ...
$(MAKE) -C shared/icebergs $(ICEBERGS_BUILDFLAGS) FMS_CODEBASE=$(abspath $(FMS_CODEBASE) )
@echo make[$(MAKELEVEL)] ... done building target $@
.PHONY: ice_param
ice_param: $(ICE_PARAM_BUILD)/libice_param.a
$(ICE_PARAM_BUILD)/libice_param.a: $(FMS_BUILD)/libFMS.a
$(ICE_PARAM_BUILD)/libice_param.a: $(wildcard src/ice_param/src/*)
@echo make[$(MAKELEVEL)] Building target $@ ...
$(MAKE) -C shared/ice_param $(ICE_PARAM_BUILDFLAGS) FMS_CODEBASE=$(abspath $(FMS_CODEBASE) )
@echo make[$(MAKELEVEL)] ... done building target $@
.PHONY: fms
fms: $(FMS_BUILD)/libFMS.a
$(FMS_BUILD)/libFMS.a: $(wildcard $(FMS_CODEBASE)/*/* $(FMS_CODEBASE)/*/*/*)
@echo make[$(MAKELEVEL)] Building target $@ ...
$(MAKE) -C shared/fms $(FMS_BUILDFLAGS) CODEBASE=$(abspath $(FMS_CODEBASE) )
@echo make[$(MAKELEVEL)] ... done building target $@
#----------
# make run
.PHONY: run.all
run.all: run.ocean_only run.ice_ocean_SIS2
.PHONY: run.gfdl
run.gfdl: run.ocean_only run.ice_ocean_SIS2 run.coupled_AM2_LM3_SIS2
.PHONY: run.ocean_only
run.ocean_only: ocean_only
$(MAKE) -C ocean_only/ run.all $(OCEAN_ONLY_BUILDFLAGS)
.PHONY: run.ice_ocean_SIS2
run.ice_ocean_SIS2: ice_ocean_SIS2
$(MAKE) -C ice_ocean_SIS2/ run.all $(ICE_OCEAN_BUILDFLAGS)
.PHONY: run.coupled_AM2_LM3_SIS2
run.coupled_AM2_LM3_SIS2: coupled_AM2_LM3_SIS2
$(MAKE) -C coupled_AM2_LM3_SIS2/ run.all $(COUPLED_BUILDFLAGS)
#-----------
# make test
.PHONY: test.all
test.all: test.ocean_only test.ice_ocean_SIS2
.PHONY: test.gfdl
test.gfdl: test.ocean_only test.ice_ocean_SIS2 test.coupled_AM2_LM3_SIS2
.PHONY: test.ocean_only
test.ocean_only: run.ocean_only
$(MAKE) -C ocean_only/ test.all $(OCEAN_ONLY_BUILDFLAGS)
.PHONY: test.ice_ocean_SIS2
test.ice_ocean_SIS2: run.ice_ocean_SIS2
$(MAKE) -C ice_ocean_SIS2/ test.all $(ICE_OCEAN_BUILDFLAGS)
.PHONY: test.coupled_AM2_LM3_SIS2
test.coupled_AM2_LM3_SIS2: run.coupled_AM2_LM3_SIS2
$(MAKE) -C coupled_AM2_LM3_SIS2/ test.all $(COUPLED_BUILDFLAGS)
# -----------
# make clean
# (TODO: not yet working)
MODELS = ocean_only ice_ocean_SIS2 coupled_AM2_LM3_SIS2
DEPS = \
atmos_null land_null icebergs ice_param AM2 LM3
.PHONY: clean
clean: $(foreach m,$(MODELS),clean.$(m)) clean.fms
clean.ocean_only:
$(MAKE) -C ocean_only/ $(OCEAN_ONLY_BUILDFLAGS) clean
clean.ice_ocean_SIS2:
$(MAKE) -C ice_ocean_SIS2/ $(ICE_OCEAN_BUILDFLAGS) clean
clean.coupled_AM2_LM3_SIS2:
$(MAKE) -C coupled_AM2_LM3_SIS2/ $(COUPLED_BUILDFLAGS) clean
clean.fms:
$(MAKE) -C shared/fms $(FMS_BUILDFLAGS) clean
.PHONY: $(foreach m,$(MODELS) $(DEPS) fms,$(m).clean)
$(foreach model,$(MODELS),$(model).clean):
$(MAKE) -C $(subst .clean,,$@) clean
$(foreach dep,$(DEPS) fms,$(dep).clean):
$(MAKE) -C shared/$(subst .clean,,$@) clean