Search code examples
c++makefileheader-filespetsc

Generic Makefile for PETSc


I am using a general makefile as follows:

# Determine the platform
UNAME_S := $(shell uname -s)

# CC
CC := g++

# Folders
SRCDIR := src
BUILDDIR := build
TARGETDIR := bin

# Targets
EXECUTABLE := NSDG
TARGET := $(TARGETDIR)/$(EXECUTABLE)

# Final Paths
INSTALLBINDIR := /usr/local/bin

# Code Lists
SRCEXT := cpp
SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))

# Folder Lists
# Note: Intentionally excludes the root of the include folder so the lists are clean
INCDIRS := $(shell find includes/**/* -name '*.h' -exec dirname {} \; | sort | uniq)
INCLIST := $(patsubst includes/%,-I include/%,$(INCDIRS))
BUILDLIST := $(patsubst includes/%,$(BUILDDIR)/%,$(INCDIRS))

# Shared Compiler Flags
CFLAGS := -c
INC := -I include $(INCLIST) -I /usr/local/include
LIB := -L /usr/local/lib -lblas -llapacke -lgsl -lgslcblas -lm

# Platform Specific Compiler Flags
CFLAGS += -std=c++11

$(TARGET): $(OBJECTS)
    @mkdir -p $(TARGETDIR)
    @echo "Linking..."
    @echo "  Linking $(TARGET)"; $(CC) $^ -o $(TARGET) $(LIB)

$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
    @mkdir -p $(BUILDLIST)
    @echo "Compiling $<..."; $(CC) $(CFLAGS) $(INC) -c -o $@ $<

clean:
    @echo "Cleaning $(TARGET)..."; $(RM) -r $(BUILDDIR) $(TARGET)

install:
    @echo "Installing $(EXECUTABLE)..."; cp $(TARGET) $(INSTALLBINDIR)

distclean:
    @echo "Removing $(EXECUTABLE)"; rm $(INSTALLBINDIR)/$(EXECUTABLE)

.PHONY: clean

The directory structure is as follows all the .cpp files are contained in the directory src/ and the corresponding header(.h) files are present in directory includes/. Now I want to add PETSc libraries to it. How do I do that?


Solution

  • I figured it out. If someone gets stuck in the future I am posting the generic Makefile for a project involving PETSc.

    include ${PETSC_DIR}/lib/petsc/conf/variables
    include ${PETSC_DIR}/lib/petsc/conf/rules
    
    # Determine the platform
    UNAME_S := $(shell uname -s)
    
    # CC
    CC := ${PETSC_DIR}/${PETSC_ARCH}/bin/mpicxx -Wall -Wwrite-strings -Wno-strict-aliasing -Wno-unknown-pragmas -fvisibility=hidden -g3 -std=c++11
    
    # Folders
    SRCDIR := src
    BUILDDIR := build
    TARGETDIR := bin
    
    # Targets
    EXECUTABLE := dg_petsc
    TARGET := $(TARGETDIR)/$(EXECUTABLE)
    
    # Final Paths
    INSTALLBINDIR := /usr/local/bin
    
    # Code Lists
    SRCEXT := cpp
    SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
    OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
    
    # Folder Lists
    # Note: Intentionally excludes the root of the include folder so the lists are clean
    INCDIRS := $(shell find includes/**/* -name '*.h' -exec dirname {} \; | sort | uniq)
    INCLIST := $(patsubst includes/%,-I include/%,$(INCDIRS))
    BUILDLIST := $(patsubst includes/%,$(BUILDDIR)/%,$(INCDIRS))
    
    # Shared Compiler Flags
    CFLAGS := -c
    INC := -I include $(INCLIST) -I /usr/local/include -I ${PETSC_DIR}/include -I ${PETSC_DIR}/${PETSC_ARCH}/include
    LIB := -L /usr/local/lib ${PETSC_SYS_LIB}
    
    # Platform Specific Compiler Flags
    CFLAGS += -std=c++11
    
    $(TARGET): $(OBJECTS)
        @mkdir -p $(TARGETDIR)
        @echo "Linking..."
        @echo "  Linking $(TARGET)"; $(CC) $^ -o $(TARGET) $(LIB)
    
    $(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
        @mkdir -p $(BUILDLIST)
        @echo "Compiling $<..."; $(CC) $(CFLAGS) $(INC) -c -o $@ $<
    
    clean_project:
        @echo "Cleaning $(TARGET)..."; $(RM) -r $(BUILDDIR) $(TARGET)
    
    install:
        @echo "Installing $(EXECUTABLE)..."; cp $(TARGET) $(INSTALLBINDIR)
    
    distclean:
        @echo "Removing $(EXECUTABLE)"; rm $(INSTALLBINDIR)/$(EXECUTABLE)
    
    .PHONY: clean