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