CC_SOURCES = $(patsubst ./%, %, $(shell find . -name "*.cpp") )

C_SOURCES = $(patsubst ./%, %, $(shell find . -name "*.c") )

ASM_SOURCES = $(patsubst ./%, %, $(shell find . -name "*.asm") )

# Einstellungen in Abhaengigkeit vom Generierungssystem:
#
#    ASMOBJFORMAT: Ausgabeformat fuer den Assembler. Das Format muss dem
#                  jeweiligen Format des verwendeten C++ Compilers angepasst
#                  werde, damit gemischte Objektdateien gelinkt werden koennen.
#    OBJDIR:       Verzeichnis, in dem die Objektdateien abgelegt werden
#                  sollen.
#    DRIVE:        Laufwerk, auf das das System-Image geschrieben wird.
#    DELETE:       Name des Kommandos zum Loeschen von Dateien
#    ASM:          Zu benutzender Assembler
#    CC/CXX:       Zu benutzender C/C++-Compiler.
#    CFLAGS:       Flags fuer den Compileraufruf.
#    LD:           Zu benutzender Linker.
#    LDFLAGS:      Flags fuer den Linkeraufruf
#    LDLIBS:       Dazuzulinkende Bibliotheken
#    LDHEAD:       Am Anfang zu linkende Dateien
#    LDTAIL:       Am Ende zu linkende Dateien

ASMOBJFORMAT = elf
OBJDIR = build
DEPSDIR = deps
DRIVE = /dev/fd0
DELETE = rm
ASM = nasm

ACFLAGS := $(ACFLAGS) --no_line --keep_acc -r ac.repos
CFLAGS := $(CFLAGS) -g -Wall -I. -fno-exceptions
CXXFLAGS := $(CXXFLAGS) -g -O3 -Wall -I. -fno-rtti -fno-exceptions -ffunction-sections 
CXXFLAGS := $(CXXFLAGS) --include ../cfConfig.h
CC = gcc
CXX = ag++ $(ACFLAGS)
LD = ld

 
# -------------------------------------------------------------------------

# Namen der Unterverzeichnisse mit den Quelltexten
# (wird automatisch aus den Quelltextdateien ermittelt und vom Compiler
# benutzt, um die Quelltexte zu finden.)

VPATH = $(sort $(dir $(CC_SOURCES) $(C_SOURCES) $(ASM_SOURCES)))

# Listen mit den Objektdateien, die beim Kompilieren entstehen:
# (werden automatisch aus den Quelltextdateinamen ermittelt)

C_OBJECTS 	:= $(notdir $(C_SOURCES:.c=.o))
	
CC_OBJECTS 	:= $(CC_SOURCES:.cpp=.o)

ASM_OBJECTS := $(patsubst %.asm,_%.o, $(notdir $(ASM_SOURCES)))

CC_DEPS		:= $(addprefix $(DEPSDIR)/, $(CC_SOURCES:.cpp=.d))

DEPS		:= $(CC_DEPS)

OBJPRE := $(addprefix $(OBJDIR)/,$(ASM_OBJECTS) $(C_OBJECTS) $(CC_OBJECTS))

# --------------------------------------------------------------------------

# Regeln zur Erzeugung der Objektdateien


$(OBJDIR)/%.o : %.c
	@echo "CC        $@"
	@$(CC) -c $(CFLAGS) -o $@ $<

$(OBJDIR)/%.o : %.cpp
	@echo "C++       $@"
	@$(CXX) -c $(CXXFLAGS) -o $@ $<

$(OBJDIR)/_%.o : %.asm
	@echo "ASM       $@"
	@$(ASM) -f $(ASMOBJFORMAT) -o $@ $<

# -------------------------------------------------
# Default target

all: $(OBJDIR)/protection
#	echo $(CC_SOURCES)

# -------------------------------------------------
# Linken des Systems

$(OBJDIR)/protection: $(OBJDIR) $(OBJDIR)/$(FIRST_OBJECT) $(OBJPRE) sections
	@echo "LD        $@"
	g++ -Xlinker -T -Xlinker sections -o $(OBJDIR)/protection $(LDFLAGS) $(LDHEAD) $(OBJPRE) $(LDTAIL) $(LDLIBS)

# -------------------------------------------------
# Regel zur Erzeugung des Objektdateiverzeichnisses

$(OBJDIR) :
	@mkdir $(OBJDIR)
	@mkdir $(OBJDIR)/ciao
	@mkdir $(OBJDIR)/os

# -------------------------------------------------------------------------
# Ab hier folgt die Definition der targets,

.PHONY: clean depend


# 'make depend' 

$(DEPSDIR)/%.d: %.cc
	@echo "DEP       $@"
	@mkdir -p $(dir $@)
	@echo -ne "$@ " >$@
	@$(CXX) -MM -MT$(OBJDIR)/$(notdir $(<:.cc=.o)) $(CXXFLAGS) $< >>$@ 

# 'make clean' loescht alle Objektdateien, das erzeugte System, Sicherheits-
# kopien des Editors und die Zwischendateien, die bei der Erzeugung von
# Objektdateien aus Assembler-Quelltexten temporaer entstehen.

clean:	
	@rm -rf $(OBJDIR)
	@rm -rf $(DEPSDIR)
	@rm -f ac.repos

ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif

