# Copyright (c) 2017-2018, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. LLNL-CODE-734707. # All Rights reserved. See files LICENSE and NOTICE for details. # # This file is part of CEED, a collection of benchmarks, miniapps, software # libraries and APIs for efficient high-order finite element and spectral # element discretizations for exascale applications. For more information and # source code availability see http://github.com/ceed. # # The CEED research is supported by the Exascale Computing Project 17-SC-20-SC, # a collaborative effort of two U.S. Department of Energy organizations (Office # of Science and the National Nuclear Security Administration) responsible for # the planning and preparation of a capable exascale ecosystem, including # software, applications, hardware, advanced system engineering and early # testbed platforms, in support of the nation's exascale computing imperative. # Note: PETSC_ARCH can be undefined or empty for installations which do not use # PETSC_ARCH - for example when using PETSc installed through Spack. PETSc.pc := $(PETSC_DIR)/$(PETSC_ARCH)/lib/pkgconfig/PETSc.pc CEED_DIR ?= ../.. ceed.pc := $(CEED_DIR)/lib/pkgconfig/ceed.pc CC = $(call pkgconf, --variable=ccompiler $(PETSc.pc) $(ceed.pc)) CFLAGS = -std=c99 \ $(call pkgconf, --variable=cflags_extra $(PETSc.pc)) \ $(call pkgconf, --cflags-only-other $(PETSc.pc)) \ $(OPT) CPPFLAGS = $(call pkgconf, --cflags-only-I $(PETSc.pc) $(ceed.pc)) \ $(call pkgconf, --variable=cflags_dep $(PETSc.pc)) LDFLAGS = $(call pkgconf, --libs-only-L --libs-only-other $(PETSc.pc) $(ceed.pc)) LDFLAGS += $(patsubst -L%, $(call pkgconf, --variable=ldflag_rpath $(PETSc.pc))%, $(call pkgconf, --libs-only-L $(PETSc.pc) $(ceed.pc))) LDLIBS = $(call pkgconf, --libs-only-l $(PETSc.pc) $(ceed.pc)) -lm OBJDIR := build SRCDIR := src src.c := elasticity.c $(sort $(wildcard $(SRCDIR)/*.c)) src.o = $(src.c:%.c=$(OBJDIR)/%.o) all: elasticity elasticity: $(src.o) | $(PETSc.pc) $(ceed.pc) $(call quiet,LINK.o) $(CEED_LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $@ .SECONDEXPANSION: # to expand $$(@D)/.DIR %/.DIR : @mkdir -p $(@D) @touch $@ # Output using the 216-color rules mode rule_file = $(notdir $(1)) rule_path = $(patsubst %/,%,$(dir $(1))) last_path = $(notdir $(patsubst %/,%,$(dir $(1)))) ansicolor = $(shell echo $(call last_path,$(1)) | cksum | cut -b1-2 | xargs -IS expr 2 \* S + 17) emacs_out = @printf " %10s %s/%s\n" $(1) $(call rule_path,$(2)) $(call rule_file,$(2)) color_out = @if [ -t 1 ]; then \ printf " %10s \033[38;5;%d;1m%s\033[m/%s\n" \ $(1) $(call ansicolor,$(2)) \ $(call rule_path,$(2)) $(call rule_file,$(2)); else \ printf " %10s %s\n" $(1) $(2); fi # if TERM=dumb, use it, otherwise switch to the term one output = $(if $(TERM:dumb=),$(call color_out,$1,$2),$(call emacs_out,$1,$2)) # if V is set to non-nil, turn the verbose mode quiet = $(if $(V),$($(1)),$(call output,$1,$@);$($(1))) $(OBJDIR)/%.o : %.c | $$(@D)/.DIR $(call quiet,CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $(abspath $<) # Rules for building the examples #%: %.c print: $(PETSc.pc) $(ceed.pc) $(info CC : $(CC)) $(info CFLAGS : $(CFLAGS)) $(info CPPFLAGS: $(CPPFLAGS)) $(info LDFLAGS : $(LDFLAGS)) $(info LDLIBS : $(LDLIBS)) @true clean: $(RM) -r $(OBJDIR) elasticity *.vtu $(PETSc.pc): $(if $(wildcard $@),,$(error \ PETSc config not found at $@. Please set PETSC_DIR and PETSC_ARCH)) .PHONY: all print clean pkgconf = $(shell pkg-config $1 | sed -e 's/^"//g' -e 's/"$$//g') -include $(src.o:%.o=%.d)