2017-04-04 25 views
0

我使用的是一般的生成文件如下:通用生成文件讓PETSc

# 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 [email protected] $< 

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

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

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

.PHONY: clean 

的目錄結構如下所有cpp文件包含在目錄的src /和相應的報頭( .H )文件存在於目錄includes /中。現在我想添加PETSc庫。我怎麼做?

+0

你知道如何在命令行上做到這一點嗎?也就是說,這是一個PETSc問題還是一個問題? – Beta

+0

我想通了。檢查答案。順便說一句,它需要對PETSc以及makefile有相同的知識。可悲的是,我花了大約半天的時間來弄清楚。 – user3496912

回答

0

我想通了。如果有人在將來遇到困難,我會爲涉及PETSc的項目發佈通用Makefile。

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 [email protected] $< 

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