# Makefile fuer den Test-Build fuer eine Windows- oder Linux-Plattform


# Erster Test Makefile

# Fuer .o-File-Sourcen
VPATH = \
$(COMMON)\
$(PROJECT)\
..\

# Unterscheidung Windows/Linux
ifdef SystemRoot
  # Build auf Windows-System fuer Windows
  
  CC=gcc
  RM=del

  CFLAGS = -g -pg -Wall -Wextra -Wpedantic -std=c99\
  -Wsign-conversion -DGLCD_FRAMEBUFFER -DPLATFORM_PC
  
  # Flags, um SDL2 korrekt zuzulinken. Die Reihenfolge ist wichtig.
  LFLAGS = -lmingw32 -lSDL2main -llibSDL2  
  
  # Unter Windows darf das "ECHO"-Kommando keine Anfuehrungszeichen haben.
  ECHOQUOTE = 
  
  
  OUT_EXE = mock.exe
  
else
  # Build auf Linux-System fuer Linux
  
  CC=clang
  RM=rm -f

  CFLAGS = -ggdb -Wall -Wextra -pedantic -Wno-invalid-source-encoding \
  -std=c99\
  -DGLCD_FRAMEBUFFER -DPLATFORM_PC `sdl2-config --cflags --libs`

  #Fuer Clang
  #CFLAGS = -ggdb -Wall -Wextra -pedantic \
  #-DGLCD_FRAMEBUFFER `sdl2-config --cflags --libs` \
  #-Wno-invalid-source-encoding 
  
  # entfernte Flags:
  #-Qunused-arguments


  LFLAGS = `sdl2-config --libs`

  # Unter Linux braucht das "ECHO"-Kommando Trennzeichen, ansonsten wuerde es
  # Kommentarzeichen als solche interpretieren.
  ECHOQUOTE = '
  
  OUT_EXE = mock
  
endif

COMMON=../common
PROJECT=../project


# Dateien, bei denen es auf den Pfad ankommt, weil die Sourcen
# mehrmals existieren
CFILES = \
$(PROJECT)/comp2.c\
$(PROJECT)/comp3.c\


OFILES = main.o\
comp1.o\



build: $(CFILES) $(OFILES)
	$(CC) $(OFILES) -o $(CFLAGS) $(LFLAGS) -o $(OUT_EXE) $(CFILES) 

	
clean:
	$(RM) *.o *.d
	$(RM) svn_version.h
	$(RM) $(OUT_EXE)
	
rebuild: clean build	


run:
	./${OUT_EXE}


# Build nach impiziten Regeln:
# glcd_ks0108_sdl.o: glcd_ks0108_sdl.c glcd_ks0108.h
# das entspricht (implizite Regel):
# $(COMPILE.c) $(OUTPUT_OPTION) $< 
#
# COMPILE.c selbst ist wiederum defaultmaessig wie folgt aufgebaut:
# COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c



# Einzelner Quelltext mit besonders umfangreichen Warnings
glcd_ks0108.o:
	$(CC) -c $(CFLAGS) -Wconversion $<

# Versionsinformationen in Firmware einbetten
# svn_version.h muss vor der *.d-Datei erzeugt werden.
ui_infoscreen.o: ui_infoscreen.c svn_version.h ui_infoscreen.d


version=$(shell svnversion -n)


svn_version.hf: FORCE
	echo '\* File generated by make process */' > svn_version.h
	echo '#define SVN_REVISION "$(version)"' >> svn_version.h

	
# Hilfsdatei mit Subversion-Versionsnummer erzeugen
# In der Windows-Konsole darf das "ECHO"-Kommando keine Anfuehrungszeichen
# haben, in der Linux-Shell werden sie allerdings benoetigt, um die
# Anfuehrungszeichen im Text richtig zu uebernehmen.
svn_version.h: FORCE # korrekte Fassung, keine Lust, den Fehler zu suchen, deswegen unten
	> ../svn_version.h \
	echo $(ECHOQUOTE)/* File generated by make process */$(ECHOQUOTE)
	>> ../svn_version.h \
	echo $(ECHOQUOTE) #define SVN_REVISION "$(version)"$(ECHOQUOTE)

	
svn_version.hk: FORCE # Funktioniert auch dann, wenn SVN nicht erreichbar
	> svn_version.h \
	echo $(ECHOQUOTE)/* File generated by make process */$(ECHOQUOTE)
	>> ../svn_version.h \
	echo $(ECHOQUOTE) #define SVN_REVISION "1"$(ECHOQUOTE)

		
	

# Allgemein per Wildcard:
$(OFILES): %.o: %.c %.d


# Abhaengigkeiten aufloesen (nach Mecklenburg2004, S. 33f)
# statt ueber temporaere Datei wird hier ueber eine Pipe
# gegangen, da das auch unter Windows funktioniert:
#%.d: %.c
#	$(CC) -M $(CFLAGS) $< | \
#	sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@


#warum nicht?
%.d: %.c
	$(CC) -MM $(CFLAGS) $< > $*.d


# Abhaengigkeiten aufloesen (nach Mecklenburg2004, S. 33f)
#%.w: %.c
#	$(CC) -MM $(CFLAGS) $< > $*.d;\
#	$(CC) -M $(CFLAGS) $< > $@.$$$$;\			
#	sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;	\
	
#rm -f $@.$$$$

# leeres Hilfstarget, um Rebuild zu erzwingen
FORCE:
