xref: /petsc/gmakefile (revision e799b094d107dd9c7a452fb893aeda23290d25c1)
1# -*- mode: makefile-gmake -*-
2
3include $(PETSC_DIR)/conf/variables
4
5OBJDIR := $(PETSC_ARCH)/obj-gmake
6LIBDIR := $(abspath $(PETSC_ARCH)/lib)
7
8pkgs := sys vec mat dm ksp snes ts
9
10libpetsc_shared := $(LIBDIR)/libpetsc.so
11libpetsc_static := $(LIBDIR)/libpetsc.$(AR_LIB_SUFFIX)
12libpetscpkgs_shared := $(foreach pkg, $(pkgs), $(LIBDIR)/libpetsc$(pkg).so)
13libpetscpkgs_static := $(foreach pkg, $(pkgs), $(LIBDIR)/libpetsc$(pkg).$(AR_LIB_SUFFIX))
14
15ifeq ($(PETSC_WITH_EXTERNAL_LIB),)
16  libpetscall_shared := $(libpetscpkgs_shared)
17  libpetscall_static := $(libpetscpkgs_static)
18else
19  libpetscall_shared := $(libpetsc_shared)
20  libpetscall_static := $(libpetsc_static)
21endif
22libpetscall := $(if $(filter-out no,$(BUILDSHAREDLIB)),$(libpetscall_shared),$(libpetscall_static))
23
24generated := $(PETSC_ARCH)/conf/files
25
26all : $(generated) $(libpetscall)
27
28.SECONDEXPANSION:		# to expand $$(@D)/.DIR
29
30ifeq ($(V),)
31  quiet_HELP := "Use \"$(MAKE) V=1\" to see the verbose compile lines.\n"
32  quiet = @printf $(quiet_HELP)$(eval quiet_HELP:=)"  %10s %s\n" "$1$2" "$@"; $($1)
33else ifeq ($(V),0)		# Same, but do not print any help
34  quiet = @printf "  %10s %s\n" "$1$2" "$@"; $($1)
35else				# Show the full command line
36  quiet = $($1)
37endif
38
39$(PETSC_ARCH)/conf/files :
40	$(PYTHON) conf/gmakegen.py --petsc-arch=$(PETSC_ARCH)
41
42-include $(generated)
43
44ifeq ($(PETSC_LANGUAGE),CXXONLY)
45  cc_name := CXX
46else
47  cc_name := CC
48endif
49
50PETSC_DEPFLAGS.c := -MMD -MP
51PETSC_DEPFLAGS.cxx := -MMD -MP
52PETSC_DEPFLAGS.F := -MMD -MP
53
54PETSC_COMPILE.c = $(call quiet,$(cc_name)) -c $(PCC_FLAGS) $(CFLAGS) $(CCPPFLAGS) $(PETSC_DEPFLAGS.c)
55PETSC_COMPILE.cxx = $(call quiet,CXX) -c $(PCC_FLAGS) $(CFLAGS) $(CCPPFLAGS) $(PETSC_DEPFLAGS.cxx)
56PETSC_COMPILE.cu = $(call quiet,CUDAC) -c $(CUDAC_FLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)"
57PETSC_GENDEPS.cu = $(call quiet,CUDAC,.dep) --generate-dependencies $(CUDAC_FLAGS) --compiler-options="$(PCC_FLAGS) $(CXXFLAGS) $(CCPPFLAGS)"
58PETSC_COMPILE.F = $(call quiet,FC) -c $(FC_FLAGS) $(FFLAGS) $(FCPPFLAGS) $(PETSC_DEPFLAGS.F)
59
60langs := c cu cxx F
61concatlang = $(foreach lang, $(langs), $(srcs-$(1).$(lang):%.$(lang)=$(OBJDIR)/%.o))
62srcs.o := $(foreach pkg, $(pkgs), $(call concatlang,$(pkg)))
63
64# with-single-library=1 (default)
65$(libpetsc_shared) : $(srcs.o) | $$(@D)/.DIR
66	$(call quiet,CLINKER) -shared -o $@ $^ $(PETSC_EXTERNAL_LIB_BASIC)
67
68$(libpetsc_static) : obj := $(srcs.o)
69
70%.$(AR_LIB_SUFFIX) : $$(obj) | $$(@D)/.DIR
71	@$(RM) $@
72	$(call quiet,AR) $(AR_FLAGS) $@ $^
73	$(call quiet,RANLIB) $@
74
75# with-single-library=0
76libpkg = $(foreach pkg, $1, $(LIBDIR)/libpetsc$(pkg).so)
77$(LIBDIR)/libpetscsys.so  : obj    := $(call concatlang,sys)
78$(LIBDIR)/libpetscvec.so  : obj    := $(call concatlang,vec)
79$(LIBDIR)/libpetscvec.so  : libdep := $(call libpkg,sys)
80$(LIBDIR)/libpetscmat.so  : obj    := $(call concatlang,mat)
81$(LIBDIR)/libpetscmat.so  : libdep := $(call libpkg,vec sys)
82$(LIBDIR)/libpetscdm.so   : obj    := $(call concatlang,dm)
83$(LIBDIR)/libpetscdm.so   : libdep := $(call libpkg,mat vec sys)
84$(LIBDIR)/libpetscksp.so  : obj    := $(call concatlang,ksp)
85$(LIBDIR)/libpetscksp.so  : libdep := $(call libpkg,dm mat vec sys)
86$(LIBDIR)/libpetscsnes.so : obj    := $(call concatlang,snes)
87$(LIBDIR)/libpetscsnes.so : libdep := $(call libpkg,ksp dm mat vec sys)
88$(LIBDIR)/libpetscts.so   : obj    := $(call concatlang,ts)
89$(LIBDIR)/libpetscts.so   : libdep := $(call libpkg,snes ksp dm mat vec sys)
90$(LIBDIR)/libpetscsys.$(AR_LIB_SUFFIX)  : $(call concatlang,sys)
91$(LIBDIR)/libpetscvec.$(AR_LIB_SUFFIX)  : $(call concatlang,vec)
92$(LIBDIR)/libpetscmat.$(AR_LIB_SUFFIX)  : $(call concatlang,mat)
93$(LIBDIR)/libpetscdm.$(AR_LIB_SUFFIX)   : $(call concatlang,dm)
94$(LIBDIR)/libpetscksp.$(AR_LIB_SUFFIX)  : $(call concatlang,ksp)
95$(LIBDIR)/libpetscsnes.$(AR_LIB_SUFFIX) : $(call concatlang,snes)
96$(LIBDIR)/libpetscts.$(AR_LIB_SUFFIX)   : $(call concatlang,ts)
97
98# The package libraries technically depend on each other (not just in an order-only way), but only
99# ABI changes like new or removed symbols requires relinking the dependent libraries.  ABI should
100# only occur when a header is changed, which would trigger recompilation and relinking anyway.
101# RELINK=1 causes dependent libraries to be relinked anyway.
102ifeq ($(RELINK),1)
103  libdep_true = $$(libdep)
104  libdep_order =
105else
106  libdep_true =
107  libdep_order = $$(libdep)
108endif
109$(libpetscpkgs_shared) : $$(obj) $(libdep_true) | $(libdep_order) $$(@D)/.DIR
110	$(call quiet,CLINKER) -shared -o $@ $(obj) $(libdep) $(PETSC_EXTERNAL_LIB_BASIC)
111
112$(OBJDIR)/%.o : %.c | $$(@D)/.DIR
113	$(PETSC_COMPILE.c) $< -o $@
114
115$(OBJDIR)/%.o : %.cxx | $$(@D)/.DIR
116	$(PETSC_COMPILE.cxx) $< -o $@
117
118$(OBJDIR)/%.o : %.cu | $$(@D)/.DIR
119	$(PETSC_COMPILE.cu) $< -o $@ # Compile first so that if there is an error, it comes from a normal compile
120	@$(PETSC_GENDEPS.cu) $< -o $(@:%.o=%.d) # Generate the dependencies for later
121
122$(OBJDIR)/%.o : %.F | $$(@D)/.DIR
123	$(PETSC_COMPILE.F) $< -o $@ $(FC_MODULE_OUTPUT_FLAG)$(PETSC_ARCH)/include
124
125%/.DIR :
126	@mkdir -p $(@D)
127	@touch $@
128
129.PRECIOUS: %/.DIR
130
131.SUFFIXES: # Clear .SUFFIXES because we don't use implicit rules
132.DELETE_ON_ERROR:               # Delete likely-corrupt target file if rule fails
133
134.PHONY: clean all print
135
136clean:
137	rm -rf $(OBJDIR) $(LIBDIR)/libpetsc* $(PETSC_ARCH)/include/*.mod $(generated)
138
139# make print VAR=the-variable
140print:
141	@echo $($(VAR))
142
143allobj.d := $(srcs.o:%.o=%.d)
144# Tell make that allobj.d are all up to date.  Without this, the include
145# below has quadratic complexity, taking more than one second for a
146# do-nothing build of PETSc (much worse for larger projects)
147$(allobj.d) : ;
148
149-include $(allobj.d)
150