Hallo ihr geduldigen Helfer
Ich habe dank euch einiges mehr verstanden. Dankeschön.
Meine jetzige Makefile sieht wiefolgt aus (wer Lust hat, kann ja mal drüber fliegen und Verbesserungsvorschläge o.ä. äußern, außerdem stehen darunter noch 2 Fragen)
Anmerkung: Alle nicht mit .o endenden Dateien, sind ausführbar. So für mich als "flag".
Code: Alles auswählen
# variablen fuer compiler, makros
CC = g++
# sql makros
SQLDIR = ./db
SQLFLAGS = -c -w
# die einzelnen Algos
ALGOS_SRC = $(wildcard algo/algo*.cpp)
ALGOS_OBJS = $(notdir $(patsubst %.cpp,%.o, $(ALGOS_SRC)))
# fuer die ausfuehrbare Binary werden noch Bibliotheken benoetigt
INCLUDES = -I$(SQLDIR)
LIBS = -lsqlite3 -lginac
# die einzelnen Schritte
STEP_SRC = $(wildcard algo/step*.cpp)
STEP_OBJS = $(notdir $(patsubst %.cpp,%.o, $(STEP_SRC)))
# die regeln
RULE_SRC = $(wildcard algo/rule*.cpp)
RULES_OBJS = $(notdir $(patsubst %.cpp,%.o, $(RULE_SRC)))
# abhaengigkeiten von der wurzel aus betrachten
#SRC2=algo/pansolver.h
#SRC = algo/algo0.cpp algo/tinhandling.cpp db/sql.h db/sql.cpp
#DEPENDFILE = .depend
#dep: $(SRC)
# $(CC) -MM -Idb/ -Ialgo/ $< > $(DEPENDFILE)
#dep2: $(SRC2)
# $(CC) -MM -Idb/ -Ialgo/ $< > $(DEPENDFILE)2
#
#-include $(DEPENDFILE)
all : pansolver
sql.o : db/sql.cpp db/sql.h
$(CC) $< $(SQLFLAGS) -o $@
tuple.o : algo/tuple.cpp algo/tuple.h
$(CC) -c $< -o $@
path.o : algo/path.cpp tuple.o
$(CC) -c $< -o $@
step%.o: algo/step%.cpp algo/steps.h
$(CC) -c $< -o $@
help.o : algo/help.cpp algo/help.h
$(CC) -c $< -o $@
node.o : algo/node.cpp algo/node.h help.o
$(CC) -c $< -o $@
tinahandling.o : algo/tinahandling.cpp algo/tinahandling.h node.o help.o tuple.o path.o
$(CC) -c $< -o $@
term.o : algo/term.cpp algo/term.h help.o
$(CC) -c $< -o $@
# alle rule?.cpp => .o
rule%.o : algo/rule%.cpp algo/rule%.h
$(CC) -c $< -o $@
# rule.o , das von rule%.o nicht abgefangen wird : % = not empty
rule.o : algo/rule.cpp algo/rule.h
$(CC) -c $< -o $@
pan.o : algo/pan.cpp algo/pan.h $(RULES_OBJS) node.o help.o tuple.o term.o
$(CC) -c $< -o $@
algo%.o : algo/algo%.cpp algo/pansolver.h
$(CC) -c $< $(INCLUDES) -o $@
sequence.o : algo/sequence.cpp algo/sequence.h
$(CC) -c $< -o $@
ginachandling.o : algo/ginachandling.cpp algo/ginachandling.h sequence.o
$(CC) -c $< -o $@
nodes.o : algo/nodes.cpp algo/nodes.h node.o
$(CC) -c $< -o $@
pansolver : algo/pansolver.cpp algo/pansolver.h sql.o $(ALGOS_OBJS) $(STEP_OBJS) pan.o path.o tinahandling.o help.o node.o tuple.o $(RULES_OBJS) nodes.o term.o sequence.o ginachandling.o
$(CC) $^ $(LIBS) $(INCLUDES) -o $@
th : $(TINAHANDLING) node help tuple.o path.o
$(CC) $(TINAHANDLING) -Dthmain node.o help.o tuple.o path.o -o $@
gh : algo/ginachandling.cpp algo/ginachandling.h sequence.o
$(CC) $^ -lginac -Dginac_main -o $@
pan : algo/testmain.cpp node.o help.o $(RULES_OBJS) tuple.o ginachandling.o term.o pan.o nodes.o node.o sequence.o
$(CC) $^ -lginac -o $@
clean :
rm -f *.o pansolver
@echo alles entfernt
1.
Bei rule%.o und rule.o habe ich nun 2 Regeln erstellt. Kann man das mit einer Regel abfangen? Aber nicht mit rul%.o , das wäre ein Hack, den ich nicht möchte
2.
Bei step%.o: step.h beschreibt eine Klasse mit mehreren Funktionen. In step.cpp ist nur Standardkram (im Moment nur ein Konstruktor). In step%.cpp stehen jeweils die Implementierungen der einzelnen Funktionen, die in step.h beschrieben sind.
Am liebsten (warum auch immer) hätte ich alles in einer .o (wenn das mit g++ ginge):
Code: Alles auswählen
$ g++ -c algo/step*.cpp -o steps.o
g++: cannot specify -o with -c or -S with multiple files
Geht sowas überhaupt?
Das sind jetzt nur noch Schönheitsoperationen, keine lebenswichtigen. Immerhin läuft mein Makefile jetzt