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