# Zu ?bersetzende Dateien f?r jedes Generierungssystem:

CC_SOURCES 		= $(patsubst ./%, %, $(shell find . -name "*.cpp") )
ACC_SOURCES 	= $(patsubst ./%, %, $(shell find . -name "*.ah") )
C_SOURCES 		= $(patsubst ./%, %, $(shell find . -name "*.c") )
ASM_SOURCES 	= $(patsubst ./%, %, $(shell find . -name "*.asm") )
TARGET 			= instantiation

# 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
LDFLAGS := $(LDFLAGS) --gc-sections

CC = gcc
CXX = ag++ $(ACFLAGS)
LD = g++

# -Xlinker vor jedes LDFlag
LDFLAGS := $(patsubst %,-Xlinker %, $(LDFLAGS))
$(warning CXXFLAGS = $(CXXFLAGS))
 
# -------------------------------------------------------------------------

# 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 $(ACC_SOURCES)
	@echo "C++       $@"
	$(CXX) -c $(CXXFLAGS) -o $@ $<

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

# -------------------------------------------------
# Default target
SEARCH = "::"
all: $(OBJDIR)/$(TARGET)
	@echo "The following global instances are in $<:"
	@nm --demangle $< | grep $(SEARCH)  

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

$(OBJDIR)/$(TARGET): $(OBJDIR) $(OBJDIR)/$(FIRST_OBJECT) $(OBJPRE)
	@echo "LDX        $@"
	@$(LD) -o $(OBJDIR)/$(TARGET) $(LDFLAGS) $(LDHEAD) $(OBJPRE) $(LDTAIL) $(LDLIBS)

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

$(OBJDIR) :
	@mkdir -p $(OBJDIR)/ciao/krn/std
	@mkdir -p $(OBJDIR)/ciao/dev/std
	@mkdir -p $(OBJDIR)/os/krn/std
	@mkdir -p $(OBJDIR)/os/dev/std
	@mkdir -p $(OBJDIR)/hw/dev
	@mkdir -p $(OBJDIR)/hw/hal



# -------------------------------------------------------------------------
# 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

