xref: /honee/Makefile (revision a39fefe2f8165811cd0b417fe1598d64201cc77a)
10006be33SJames WrightCONFIG ?= config.mk
2066464baSJames Wright-include $(CONFIG)
30006be33SJames WrightCOMMON ?= common.mk
44f863122SJeremy L Thompson-include $(COMMON)
54f863122SJeremy L Thompson
60006be33SJames Wrightpkgconf-path = $(if $(wildcard $(1)/$(2).pc),$(1)/$(2).pc,$(2))
7ea10196cSJeremy L Thompson
80006be33SJames Wright# Library dependencies
90006be33SJames Wright# Note: PETSC_ARCH can be undefined or empty for installations which do not use
100006be33SJames Wright#       PETSC_ARCH - for example when using PETSc installed through Spack.
110006be33SJames Wrightifneq ($(wildcard ../petsc/lib/libpetsc.*),)
120006be33SJames Wright  PETSC_DIR ?= ../petsc
130006be33SJames Wrightendif
140006be33SJames Wrightpetsc.pc := $(call pkgconf-path,$(PETSC_DIR)/$(PETSC_ARCH)/lib/pkgconfig,petsc)
150006be33SJames Wright
160006be33SJames WrightCEED_DIR ?= $(if $(wildcard $(PETSC_DIR)/$(PETSC_ARCH)/lib/pkgconfig/ceed.pc),$(PETSC_DIR)/$(PETSC_ARCH),../libCEED)
170006be33SJames Wrightceed.pc  := $(call pkgconf-path,$(CEED_DIR)/lib/pkgconfig,ceed)
180006be33SJames Wright
19*a39fefe2SJeremy L Thompsonpkgconf   = $(shell pkg-config $(if $(STATIC),--static) $1 | $(SED) -e 's/^"//g' -e 's/"$$//g')
200006be33SJames Wright
210006be33SJames Wright# Error checking flags
220006be33SJames WrightPEDANTIC      ?=
230006be33SJames WrightPEDANTICFLAGS ?= -Werror -pedantic
240006be33SJames Wright
250006be33SJames WrightCC        = $(call pkgconf, --variable=ccompiler $(petsc.pc) $(ceed.pc))
26a515125bSLeila GhaffariCFLAGS    = -std=c99 \
270006be33SJames Wright  $(call pkgconf, --variable=cflags_extra $(petsc.pc)) \
280006be33SJames Wright  $(call pkgconf, --cflags-only-other $(petsc.pc)) \
290006be33SJames Wright  $(OPT)
300006be33SJames WrightCPPFLAGS  = $(call pkgconf, --cflags-only-I $(petsc.pc) $(ceed.pc)) \
310006be33SJames Wright  $(call pkgconf, --variable=cflags_dep $(petsc.pc))
320006be33SJames WrightCXX       = $(call pkgconf, --variable=cxxcompiler $(petsc.pc) $(ceed.pc))
334c07ec22SJames WrightCXXFLAGS  = -std=c++17 -Wno-deprecated -Wno-tautological-compare
340006be33SJames WrightLDFLAGS   = $(call pkgconf, --libs-only-L --libs-only-other $(petsc.pc) $(ceed.pc))
350006be33SJames WrightLDFLAGS  += $(patsubst -L%, $(call pkgconf, --variable=ldflag_rpath $(petsc.pc))%, $(call pkgconf, --libs-only-L $(petsc.pc) $(ceed.pc)))
360006be33SJames WrightLDLIBS    = $(call pkgconf, --libs-only-l $(petsc.pc) $(ceed.pc)) -lm -lstdc++
37ea10196cSJeremy L Thompson
384c07ec22SJames Wright# ASAN must be left empty if you don't want to use it
394c07ec22SJames WrightASAN    ?=
400006be33SJames Wright
414c07ec22SJames WrightAFLAGS  ?= -fsanitize=address
427df379d9SJames WrightCFLAGS  += $(if $(ASAN),$(AFLAGS))
437df379d9SJames WrightFFLAGS  += $(if $(ASAN),$(AFLAGS))
447df379d9SJames WrightLDFLAGS += $(if $(ASAN),$(AFLAGS))
450006be33SJames Wright
4645101827SJames WrightCPPFLAGS += -I./include
477df379d9SJames Wright
48*a39fefe2SJeremy L Thompson# External tools
49*a39fefe2SJeremy L ThompsonPYTHON   ?= python3
50*a39fefe2SJeremy L ThompsonSED      ?= sed
51*a39fefe2SJeremy L Thompson
524c07ec22SJames Wright# LibTorch
534c07ec22SJames WrightUSE_TORCH ?=
544c07ec22SJames Wrightifeq ($(USE_TORCH),1)
55*a39fefe2SJeremy L Thompson  libtorch.pc := $(shell $(PYTHON) ./pytorch_pkgconfig.py)
564c07ec22SJames Wright  CPPFLAGS += $(call pkgconf, --cflags-only-I $(libtorch.pc))
574c07ec22SJames Wright  CXXFLAGS += $(call pkgconf, --cflags-only-other $(libtorch.pc))
584c07ec22SJames Wright  LDFLAGS += $(call pkgconf, --libs-only-L --libs-only-other $(libtorch.pc))
590006be33SJames Wright  LDFLAGS += $(patsubst -L%, $(call pkgconf, --variable=ldflag_rpath $(petsc.pc))%, $(call pkgconf, --libs-only-L $(libtorch.pc)))
604c07ec22SJames Wright  LDLIBS += $(call pkgconf, --libs-only-l $(libtorch.pc))
614c07ec22SJames Wright
624c07ec22SJames Wright  src.cpp += $(sort $(wildcard $(PROBLEMDIR)/torch/*.cpp))
634c07ec22SJames Wright  src.c += $(sort $(wildcard $(PROBLEMDIR)/torch/*.c))
644c07ec22SJames Wright
654c07ec22SJames Wright  # Intel Pytorch EXtension (IPEX)
664c07ec22SJames Wright  IPEX_DIR ?=
674c07ec22SJames Wright  ifdef IPEX_DIR
684c07ec22SJames Wright      LDFLAGS += -L$(IPEX_DIR)/lib/
694c07ec22SJames Wright      LDFLAGS += -Wl,-rpath,$(IPEX_DIR)/lib/
704c07ec22SJames Wright      LDLIBS += -lintel-ext-pt-gpu
714c07ec22SJames Wright  endif
724c07ec22SJames Wrightendif
734c07ec22SJames Wright
744c07ec22SJames Wright# Source Files
75a515125bSLeila GhaffariOBJDIR := build
76a515125bSLeila GhaffariSRCDIR := src
77a515125bSLeila GhaffariPROBLEMDIR := problems
78ea10196cSJeremy L Thompson
79a515125bSLeila Ghaffarisrc.c := navierstokes.c $(sort $(wildcard $(PROBLEMDIR)/*.c)) $(sort $(wildcard $(SRCDIR)/*.c))
804c07ec22SJames Wrightsrc.o = $(src.c:%.c=$(OBJDIR)/%.o) $(src.cpp:%.cpp=$(OBJDIR)/%.o)
81a515125bSLeila Ghaffari
829e6f9b5eSJames Wright# Path to install directory for SmartRedis. Example: /software/smartredis/install
839e6f9b5eSJames WrightSMARTREDIS_DIR ?=
849e6f9b5eSJames Wrightifdef SMARTREDIS_DIR
859e6f9b5eSJames Wright	hiredis.pc := $(SMARTREDIS_DIR)/lib/pkgconfig/hiredis.pc
869e6f9b5eSJames Wright	lsmartredis:= -lsmartredis
879e6f9b5eSJames Wright	redis++.pc = $(wildcard $(SMARTREDIS_DIR)/lib/pkgconfig/redis++.pc $(SMARTREDIS_DIR)/lib64/pkgconfig/redis++.pc)
889e6f9b5eSJames Wright
899e6f9b5eSJames Wright	CPPFLAGS += $(call pkgconf, --cflags-only-I $(hiredis.pc) $(redis++.pc))
909e6f9b5eSJames Wright	LDFLAGS += $(call pkgconf, --libs-only-L --libs-only-other $(hiredis.pc) $(redis++.pc))
910006be33SJames Wright	LDFLAGS += $(patsubst -L%, $(call pkgconf, --variable=ldflag_rpath $(petsc.pc))%, $(call pkgconf, --libs-only-L $(hiredis.pc) $(redis++.pc)))
929e6f9b5eSJames Wright	LDLIBS += $(call pkgconf, --libs-only-l $(hiredis.pc) $(redis++.pc)) $(lsmartredis)
939e6f9b5eSJames Wright	src.c += $(sort $(wildcard $(SRCDIR)/smartsim/*.c))
949e6f9b5eSJames Wrightendif
959e6f9b5eSJames Wright
96a515125bSLeila Ghaffariall: navierstokes
97a515125bSLeila Ghaffari
980006be33SJames Wright$(OBJDIR)/navierstokes: $(src.o) | navierstokes
990006be33SJames Wrightnavierstokes: $(src.o) | $(petsc.pc) $(ceed.pc)
1000006be33SJames Wright	$(call quiet,LINK.o) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $(OBJDIR)/$@
101a515125bSLeila Ghaffari
102a515125bSLeila Ghaffari.SECONDEXPANSION: # to expand $$(@D)/.DIR
103a515125bSLeila Ghaffari%/.DIR :
104a515125bSLeila Ghaffari	@mkdir -p $(@D)
105a515125bSLeila Ghaffari	@touch $@
106ea10196cSJeremy L Thompson
1074f863122SJeremy L Thompson# Quiet, color output
1084f863122SJeremy L Thompsonquiet ?= $($(1))
1094f863122SJeremy L Thompson
110b92b660dSJames Wright$(OBJDIR)/%.o : %.c  Makefile | $$(@D)/.DIR
111a515125bSLeila Ghaffari	$(call quiet,CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $(abspath $<)
112a515125bSLeila Ghaffari
113b92b660dSJames Wright$(OBJDIR)/%.o : %.cpp Makefile | $$(@D)/.DIR
1144c07ec22SJames Wright	$(call quiet,CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(abspath $<)
1154c07ec22SJames Wright
1160006be33SJames Wrightprint: $(petsc.pc) $(ceed.pc)
117ea10196cSJeremy L Thompson	$(info CC      : $(CC))
118ea10196cSJeremy L Thompson	$(info CFLAGS  : $(CFLAGS))
119ea10196cSJeremy L Thompson	$(info CPPFLAGS: $(CPPFLAGS))
120ea10196cSJeremy L Thompson	$(info LDFLAGS : $(LDFLAGS))
121ea10196cSJeremy L Thompson	$(info LDLIBS  : $(LDLIBS))
122ea10196cSJeremy L Thompson	$(info OPT     : $(OPT))
123ea10196cSJeremy L Thompson	@true
124ea10196cSJeremy L Thompson
1250e8fe9d5SJames Wrightprint-% :
1260e8fe9d5SJames Wright	$(info [ variable name]: $*)
1270e8fe9d5SJames Wright	$(info [        origin]: $(origin $*))
1280e8fe9d5SJames Wright	$(info [        flavor]: $(flavor $*))
1290e8fe9d5SJames Wright	$(info [         value]: $(value $*))
1300e8fe9d5SJames Wright	$(info [expanded value]: $($*))
1310e8fe9d5SJames Wright	$(info )
1320e8fe9d5SJames Wright	@true
1330e8fe9d5SJames Wright
134ea10196cSJeremy L Thompsonclean:
135a515125bSLeila Ghaffari	$(RM) -r $(OBJDIR) navierstokes *.vtu *.bin* *.csv *.png
136ea10196cSJeremy L Thompson
1370006be33SJames Wright$(petsc.pc):
138ea10196cSJeremy L Thompson	$(if $(wildcard $@),,$(error \
139ea10196cSJeremy L Thompson	  PETSc config not found. Please set PETSC_DIR and PETSC_ARCH))
140ea10196cSJeremy L Thompson
141ea10196cSJeremy L Thompson.PHONY: all print clean
142ea10196cSJeremy L Thompson
1430006be33SJames Wright# Fluid Dynamics Examples
1440006be33SJames Wrightfluidsexamples.c  := $(sort $(wildcard *.c))
1450006be33SJames Wrightfluidsexamples.py := smartsim_regression_framework.py
1460006be33SJames Wrightfluidsexamples    := $(fluidsexamples.c:%.c=$(OBJDIR)/%)
1470006be33SJames Wrightfluidsexamples    += $(fluidsexamples.py:%.py=$(OBJDIR)/%)
1480006be33SJames Wright
1490006be33SJames Wright$(OBJDIR)/$(fluidsexamples.py): $(OBJDIR)/navierstokes
1500006be33SJames Wright
1510006be33SJames Wrightexamples := $(fluidsexamples)
1520006be33SJames Wright
1530006be33SJames Wright$(examples) : $(libceed)
1540006be33SJames Wright$(tests) : $(libceed)
1550006be33SJames Wright
156*a39fefe2SJeremy L Thompson# Tidy
157*a39fefe2SJeremy L ThompsonCLANG_TIDY     ?= clang-tidy
158*a39fefe2SJeremy L ThompsonTIDY_OPTS      ?= --quiet
159*a39fefe2SJeremy L ThompsonTIDY_FILE_OPTS += $(CPPFLAGS) --std=c99
160*a39fefe2SJeremy L Thompson
161*a39fefe2SJeremy L Thompson%.c.tidy : %.c
162*a39fefe2SJeremy L Thompson	$(call quiet,CLANG_TIDY) $(TIDY_OPTS) $^ -- $(TIDY_FILE_OPTS)
163*a39fefe2SJeremy L Thompson
164*a39fefe2SJeremy L Thompsontidy-c   : $(src.c:%=%.tidy)
165*a39fefe2SJeremy L Thompson
166*a39fefe2SJeremy L Thompsontidy     : tidy-c
167*a39fefe2SJeremy L Thompson
168*a39fefe2SJeremy L Thompson# Style
169*a39fefe2SJeremy L ThompsonCLANG_FORMAT  ?= clang-format
170*a39fefe2SJeremy L ThompsonFORMAT_OPTS   += -style=file -i
171*a39fefe2SJeremy L ThompsonAUTOPEP8      ?= autopep8
172*a39fefe2SJeremy L ThompsonAUTOPEP8_OPTS += --in-place --aggressive --max-line-length 120
173*a39fefe2SJeremy L ThompsonSED_FMT_OPTS  += -r 's/\s+$$//' -i
174*a39fefe2SJeremy L Thompson
175*a39fefe2SJeremy L Thompson%.format : %
176*a39fefe2SJeremy L Thompson	$(call quiet,CLANG_FORMAT) $(FORMAT_OPTS) $^
177*a39fefe2SJeremy L Thompson
178*a39fefe2SJeremy L Thompsonformat.ch := $(shell git ls-files *.[ch]pp *.[ch])
179*a39fefe2SJeremy L Thompsonformat.py := $(filter-out tests/junit-xml/junit_xml/__init__.py, $(shell git ls-files '*.py'))
180*a39fefe2SJeremy L Thompsonformat.ot := $(shell git ls-files *.md)
181*a39fefe2SJeremy L Thompson
182*a39fefe2SJeremy L Thompsonformat-c  :
183*a39fefe2SJeremy L Thompson	$(call quiet,CLANG_FORMAT) $(FORMAT_OPTS) $(format.ch)
184*a39fefe2SJeremy L Thompson
185*a39fefe2SJeremy L Thompsonformat-py :
186*a39fefe2SJeremy L Thompson	$(call quiet,AUTOPEP8) $(AUTOPEP8_OPTS) $(format.py)
187*a39fefe2SJeremy L Thompson
188*a39fefe2SJeremy L Thompsonformat-ot :
189*a39fefe2SJeremy L Thompson	$(call quiet,SED) $(SED_FMT_OPTS) $(format.ot)
190*a39fefe2SJeremy L Thompson
191*a39fefe2SJeremy L Thompsonformat    : format-c format-py format-ot
192*a39fefe2SJeremy L Thompson
1930006be33SJames Wright# Testing
1940006be33SJames Wrightifeq ($(COVERAGE), 1)
1950006be33SJames Wright  CFLAGS  += --coverage
1960006be33SJames Wright  LDFLAGS += --coverage
1970006be33SJames Wrightendif
1980006be33SJames Wright
1990006be33SJames WrightPROVE      ?= prove
2000006be33SJames WrightPROVE_OPTS ?= -j $(NPROCS)
2010006be33SJames Wright
2020006be33SJames Wright# Set libCEED backends for testing
2030006be33SJames WrightCEED_BACKENDS ?= /cpu/self
2040006be33SJames Wrightexport CEED_BACKENDS
2050006be33SJames Wright
2060006be33SJames Wright# Set number processes for testing
2070006be33SJames WrightNPROC_TEST ?= 1
2080006be33SJames Wrightexport NPROC_TEST
2090006be33SJames Wright
2100006be33SJames Wright# Set pool size for testing
2110006be33SJames WrightNPROC_POOL ?= 1
2120006be33SJames Wrightexport NPROC_POOL
2130006be33SJames Wright
2140006be33SJames WrightJUNIT_BATCH ?= ''
2150006be33SJames Wright
2160006be33SJames Wrightrun-% : $(OBJDIR)/%
2170006be33SJames Wright	@$(PYTHON) tests/junit.py --ceed-backends $(CEED_BACKENDS) --mode tap $(if $(SMARTREDIS_DIR),--smartredis_dir $(SMARTREDIS_DIR) ) $(if $(USE_TORCH),--has_torch $(USE_TORCH) )--nproc $(NPROC_TEST) --pool-size $(NPROC_POOL) $(<:$(OBJDIR)/%=%)
2180006be33SJames Wright
2190006be33SJames Wright# The test and prove targets can be controlled via pattern searches. The default
2200006be33SJames Wright# is to run all tests and examples. Examples of finer grained control:
2210006be33SJames Wright#
2220006be33SJames Wright#   make prove search='t3'    # t3xx series tests
2230006be33SJames Wright#   make junit search='t ex'  # core tests and examples
2240006be33SJames Wrightsearch    ?= navierstokes
2250006be33SJames Wrightrealsearch = $(search:%=%%)
2260006be33SJames Wrightmatched    = $(foreach pattern,$(realsearch),$(filter $(OBJDIR)/$(pattern),$(tests) $(examples)))
2270006be33SJames Wright
2280006be33SJames Wright# Test
2290006be33SJames Wrighttest    : $(matched:$(OBJDIR)/%=run-%)
2300006be33SJames Wright
2310006be33SJames Wrighttst     : ;@$(MAKE) $(MFLAGS) V=$(V) test
2320006be33SJames Wright
2330006be33SJames Wright# Test with TAP output
2340006be33SJames Wrightprove   : $(matched)
2350006be33SJames Wright	$(info Running unit tests)
2360006be33SJames Wright	$(info - Testing with libCEED backends: $(CEED_BACKENDS))
2370006be33SJames Wright	$(info - Testing on $(NPROC_TEST) processes)
2380006be33SJames Wright	$(PROVE) $(PROVE_OPTS) --exec '$(PYTHON) tests/junit.py --petsc-arch $(or $(PETSC_ARCH),$(PETSC_DIR)) --ceed-backends $(CEED_BACKENDS) --mode tap $(if $(SMARTREDIS_DIR),--smartredis_dir $(SMARTREDIS_DIR) ) $(if $(USE_TORCH),--has_torch $(USE_TORCH) )--nproc $(NPROC_TEST) --pool-size $(NPROC_POOL)' $(matched:$(OBJDIR)/%=%)
2390006be33SJames Wright
2400006be33SJames Wrightprv     : ;@$(MAKE) $(MFLAGS) V=$(V) prove
2410006be33SJames Wright
2420006be33SJames Wrightprove-all :
2430006be33SJames Wright	+$(MAKE) prove realsearch=%
2440006be33SJames Wright
2450006be33SJames Wright# Test with JUNIT output
2460006be33SJames Wrightjunit-% : $(OBJDIR)/%
2470006be33SJames Wright	@printf "  %10s %s\n" TEST $(<:$(OBJDIR)/%=%); $(PYTHON) tests/junit.py --junit-batch $(JUNIT_BATCH) --petsc-arch $(or $(PETSC_ARCH),$(PETSC_DIR)) --ceed-backends $(CEED_BACKENDS) $(if $(SMARTREDIS_DIR),--smartredis_dir $(SMARTREDIS_DIR) ) $(if $(USE_TORCH),--has_torch $(USE_TORCH) )--nproc $(NPROC_TEST) --pool-size $(NPROC_POOL) $(<:$(OBJDIR)/%=%)
2480006be33SJames Wright
2490006be33SJames Wrightjunit   : $(matched:$(OBJDIR)/%=junit-%)
2500006be33SJames Wright
2510006be33SJames Wright
2520006be33SJames Wright# Configure
2530006be33SJames Wright# "make configure" detects any variables passed on the command line or
2540006be33SJames Wright# previously set in config.mk, caching them in config.mk as simple
2550006be33SJames Wright# (:=) variables.  Variables set in config.mk or on the command line
2560006be33SJames Wright# take precedence over the defaults provided in the file.  Typical
2570006be33SJames Wright# usage:
2580006be33SJames Wright#
2590006be33SJames Wright#   make configure CC=/path/to/my/cc CUDA_DIR=/opt/cuda
2600006be33SJames Wright#   make
2610006be33SJames Wright#   make prove
2620006be33SJames Wright#
2630006be33SJames Wright# The values in the file can be updated by passing them on the command
2640006be33SJames Wright# line, e.g.,
2650006be33SJames Wright#
2660006be33SJames Wright#   make configure CC=/path/to/other/clang
2670006be33SJames Wright
2680006be33SJames Wright# All variables to consider for caching
2690006be33SJames WrightCONFIG_VARS = CEED_DIR PETSC_DIR PETSC_ARCH CCOPT CFLAGS CPPFLAGS AR ARFLAGS LDFLAGS LDLIBS SED USE_TORCH SMARTREDIS_DIR
2700006be33SJames Wright
2710006be33SJames Wright# $(call needs_save,CFLAGS) returns true (a nonempty string) if CFLAGS
2720006be33SJames Wright# was set on the command line or in config.mk (where it will appear as
2730006be33SJames Wright# a simple variable).
2740006be33SJames Wrightneeds_save = $(or $(filter command line,$(origin $(1))),$(filter simple,$(flavor $(1))))
2750006be33SJames Wright
2760006be33SJames Wrightconfigure :
2770006be33SJames Wright	$(file > $(CONFIG))
2780006be33SJames Wright	$(foreach v,$(CONFIG_VARS),$(if $(call needs_save,$(v)),$(file >> $(CONFIG),$(v) := $($(v)))))
2790006be33SJames Wright	@echo "Configuration cached in $(CONFIG):"
2800006be33SJames Wright	@cat $(CONFIG)
281a515125bSLeila Ghaffari
282a515125bSLeila Ghaffari-include $(src.o:%.o=%.d)
283