Project-5/Makefile
2023-12-17 13:32:36 +01:00

122 lines
2.9 KiB
Makefile

# The compiler
CC=g++
# Flags
CFLAGS=-Wall -larmadillo -std=c++11 -O3 -fopenmp
PROFFLAGS=-fno-inline-functions
DBGFLAGS=-DDBG -g
MKDIR=mkdir -p
RMDIR=rm -rf
INSTRUMENT=scorep
# Directories for binaries
BINDIR=./bin
PROFDIR=./prof
DEBUGDIR=./debug
# Directories for object files
BUILDDIR=./build
BINOBJDIR=$(BUILDDIR)/objs
PROFOBJDIR=$(BUILDDIR)/prof
DEBUGOBJDIR=$(BUILDDIR)/debug
# Directory for latex source
LATEXDIR=./latex
# Source directories
SRC=./src
LIB=./lib
INCLUDE=./include
# Source files and object file locations
#SRCFILES=utils.cpp testlib.cpp
#SRCS=$(addprefix $(SRC)/, $(SRCS))
#BINOBJS=$(addprefix $(BINOBJDIR)/, $(SRCFILES:.cpp=.o))
#PROFOBJS=$(addprefix $(PROFOBJDIR)/, $(SRCFILES:.cpp=.o))
#DEBUGOBJS=$(addprefix $(DEBUGOBJDIR)/, $(SRCFILES:.cpp=.o))
# Lib files
LIBSRCS=$(notdir $(shell find $(LIB) -type f))
LIBBINOBJS=$(addprefix $(BINOBJDIR)/, $(LIBSRCS:.cpp=.o))
LIBPROFOBJS=$(addprefix $(PROFOBJDIR)/, $(LIBSRCS:.cpp=.o))
LIBDEBUGOBJS=$(addprefix $(DEBUGOBJDIR)/, $(LIBSRCS:.cpp=.o))
# Location for Binaries
EXEC=$(basename $(notdir $(shell find $(SRC) -type f)))
BINS=$(addprefix $(BINDIR)/, $(EXEC))
PROFBINS=$(addprefix $(PROFDIR)/, $(EXEC))
DEBUGBINS=$(addprefix $(DEBUGDIR)/, $(EXEC))
# List phony targets
.PHONY: all profile debug latex clean binclean objclean latexclean
# "Commands"
all: $(BINS)
profile: $(PROFBINS)
debug: $(DEBUGBINS)
# build latex file
latex:
$(MAKE) -C $(LATEXDIR)
# Rule for binaries
$(BINDIR)/%: $(BINOBJDIR)/%.o $(LIBBINOBJS)
$(MKDIR) $(BINDIR)
$(CC) $^ -o $@ $(CFLAGS) -I$(INCLUDE)
# Rule for profiling binaries
$(PROFDIR)/%: $(PROFOBJDIR)/%.o $(LIBPROFOBJS)
$(MKDIR) $(PROFDIR)
$(INSTRUMENT) $(CC) $^ -o $@ $(CFLAGS) $(PROFFLAGS) -I$(INCLUDE)
# Rule for debug binaries
$(DEBUGDIR)/%: $(DEBUGOBJDIR)/%.o $(LIBDEBUGOBJS)
$(MKDIR) $(DEBUGDIR)
$(CC) $^ -o $@ $(CFLAGS) $(DBGFLAGS) -I$(INCLUDE)
# Rule for object files
$(BINOBJDIR)/%.o: $(SRC)/%.cpp
$(MKDIR) $(BINOBJDIR)
echo $(LIBBINOBJS)
$(CC) -c $^ -o $@ $(CFLAGS) -I$(INCLUDE)
# Rule for instrumented object files
$(PROFOBJDIR)/%.o: $(SRC)/%.cpp
$(MKDIR) $(PROFOBJDIR)
$(INSTRUMENT) $(CC) -c $^ -o $@ $(CFLAGS) $(PROFFLAGS) -I$(INCLUDE)
# Rule for debug object files
$(DEBUGOBJDIR)/%.o: $(SRC)/%.cpp
$(MKDIR) $(DEBUGOBJDIR)
$(CC) -c $^ -o $@ $(CFLAGS) $(DBGFLAGS) -I$(INCLUDE)
# Rule for object files
$(BINOBJDIR)/%.o: $(LIB)/%.cpp
$(MKDIR) $(BINOBJDIR)
$(CC) -c $^ -o $@ $(CFLAGS) -I$(INCLUDE)
# Rule for instrumented object files
$(PROFOBJDIR)/%.o: $(LIB)/%.cpp
$(MKDIR) $(PROFOBJDIR)
$(INSTRUMENT) $(CC) -c $^ -o $@ $(CFLAGS) $(PROFFLAGS) -I$(INCLUDE)
# Rule for debug object files
$(DEBUGOBJDIR)/%.o: $(LIB)/%.cpp
$(MKDIR) $(DEBUGOBJDIR)
$(CC) -c $^ -o $@ $(CFLAGS) $(DBGFLAGS) -I$(INCLUDE)
# Cleaning
clean: objclean binclean latexclean
latexclean:
$(MAKE) -C $(LATEXDIR) clean
objclean:
$(RMDIR) $(BUILDDIR)
binclean:
$(RMDIR) $(BINDIR) $(PROFDIR) $(DEBUGDIR)