Forum: PC-Programmierung Makefile eigener Output/Temp Ordner und Unterordner


von Bronko P. (bronko99)


Lesenswert?

Hallo,

hab folgendes makefile:
1
TARGET = program
2
#
3
MODULES  = . src1 src2
4
INCLUDES = $(foreach MODULE,$(MODULES),-I$(MODULE))
5
6
###############################################:
7
CFLAGS  = -Wall -Os -c -g -dA
8
AFLAGS  = 
9
LFLAGS   = -o $(TARGET).elf 
10
11
CC      = m32c-elf-gcc
12
AS      = m32c-elf-gcc
13
LD      = m32c-elf-gcc
14
#######################################
15
ECHO    = @-echo
16
17
# folder where the output hexfile is placed
18
OUTDIR  = OUTPUT
19
# all temporary files will be generated into TEMPDIR
20
TEMPDIR = TEMP
21
22
CFILES  := $(foreach MODULE, $(MODULES), $(wildcard $(MODULE)/*.c))
23
HFILES  := $(foreach MODULE, $(MODULES), $(wildcard $(MODULE)/*.h))
24
SFILES  := $(foreach MODULE, $(MODULES), $(wildcard $(MODULE)/*.S))
25
26
OBJECTS := $(addprefix $(TEMPDIR)/, $(notdir $(SFILES:.S=.o)))
27
OBJECTS += $(addprefix $(TEMPDIR)/, $(notdir $(CFILES:.c=.o)))
28
29
OBJECTS_NO_PATH := $(notdir $(OBJECTS))
30
31
###########################################################################
32
33
$(TARGET): $(OBJECTS)
34
  @echo Linking $(TARGET).
35
  @$(CC) $(CFLAGS)  $(OBJECTS) $(LFLAGS)
36
37
$(TEMPDIR)/%.o: %.c
38
  @echo -----------------------------------------
39
  @echo COMPILING DEPENDENCY FILE FOR $@
40
  $(CC) -MM $(INCLUDES) $(CFLAGS) $< > $(TEMPDIR)/$(addsuffix .d, $(notdir $(basename $@)))
41
  @echo -----------------------------------------
42
  @echo COMPILING OBJECT FILE $@
43
  $(CC) -c $(INCLUDES) $(CFLAGS) $< -o $@
44
  $(ECHO) ===========================================================================
45
46
$(TEMPDIR)/%.o: %.S
47
  $(ECHO) ===========================================================================
48
  $(ECHO) ... assembling $@ from $< ...
49
  $(AS) $(AFLAGS) 
50
51
52
-include $(OBJECTS:.o=.d)
53
54
clean:
55
  $(REMOVE) $(TEMPDIR)/*.*
56
  $(REMOVE) $(OUTDIR)/*.*
57
58
test:
59
  @echo CFILES: $(CFILES)
60
  @echo HFILES: $(HFILES)
61
  @echo SFILES: $(SFILES)
62
  @echo OBJECTS: $(OBJECTS)
63
  @echo OBJECTS_NO_PATH: $(OBJECTS_NO_PATH)
Wie zu sehen ist, habe ich mehrere Quelldatei-Ordner sowie Qelldateien 
im Root-Ordner. Alles temporäre soll nach TEMPDIR (*.d, *.o), das 
Hexfile soll im OUTPUT Ordner landen. Bin seit Tagen am 
probieren...dieser verdammte SCHEISS.

Sobald ich make eingebe kommt:
1
make: *** Keine Regel vorhanden, um das Target »TEMP/mod1.o«, 
2
  benötigt von »program«, zu erstellen.  Schluss.
Irgendiwe klappt das mit den Verzeichnisse nicht so.
Hat jemand ne Idee?

Gruß Bronko

von Rolf Magnus (Gast)


Lesenswert?

Wenn ich dein Makefile bei mir ausprobiere, geht es, wenn man mal davon 
absieht, daß du deine CFLAGS ein -c enthalten (gehört da eigentlich 
nicht hin) und du diese beim Linken benutzt (gehört da eigentlich auch 
nicht hin) und der Linker daher kein Ergebnis erzeugt.

von Bronko P. (bronko99)


Lesenswert?

Das kann ich nicht glauben.
Hast du auch Unterverzeichnisse? Hier zum Verständnis meine 
Ordnerstruktur:

Projekt
 |__makefile
 |__main.c
 |__main.h
 |__src1
 |   |__file1.c
 |   |__file1.h
 |   |__file...
 |
 |__src2
 |   |__file1.S
 |   |__file1.h
 |   |__file...
 |
 |__OUTPUT
 |   |__hexfiles, map, ...
 |
 |__TEMP
     |__Objekte, .d files, ...

von Rolf Magnus (Gast)


Lesenswert?

Bronko Pavel schrieb:
> Hast du auch Unterverzeichnisse?

Nein. Die hatte ich weggelassen. Mit Verzeichnissen geht es auch hier 
nicht. Allerdings ist das auch nicht verwunderlich.
Zuerst gehst du alle Verzeichnisse durch und suchst nach den .c-Files. 
dann machst du daraus eine Liste von .o-Files, die alle im 
TEMP-Verzeichnis liegen, und dann kommt diese Regel hier:

$(TEMPDIR)/%.o: %.c

Auf dem Weg dorthin sind dir aber die Verzeichnisse verlorengegangen, 
denn diese Regel sucht für jedes der .o-Files ein .c-File, aber im 
aktuellen Verzeichnis, und nicht dort, wo es tatsächlich liegt.

von Bronko P. (bronko99)


Lesenswert?

Ja das ist richtig. Sobald ich den Verzeichnisnamen in die Rule "hart" 
eingetragen habe hat er dann zumindest die files dort compiliert.

Hast du ne Idee wie ich dem entgegenkommen kann? In der Variable CFILES 
sind die Pfade drinnen, kann man damit etwas machen?

von Frickler (Gast)


Lesenswert?

Rolf Magnus schrieb:
> diese Regel sucht für jedes der .o-Files ein .c-File, aber im
> aktuellen Verzeichnis, und nicht dort, wo es tatsächlich liegt.

D.h., man muss make sagen, wo es die C-Files (und S-Files) tatsächlich 
suchen soll:
1
...
2
OBJECTS_NO_PATH := $(notdir $(OBJECTS))
3
4
vpath %.c src1
5
vpath %.S src2
6
7
###########################################################################
8
9
$(TARGET): $(OBJECTS)
10
...

von Bronko P. (bronko99)


Lesenswert?

Danke, ja das geht. Werde mal damit rumspielen...

von Bronko P. (bronko99)


Lesenswert?

Jetzt fehlt nur noch die Dependency Geschichte:
1
$(CC) -MM $(INCLUDES) $(CFLAGS) $< > $(TEMPDIR)/$(addsuffix .d, $(notdir $(basename $@)))
Hier müsste man mittels sed noch "$(TEMPDIR)/" voranstellen. Leider 
verstehe ich die sed Syntax nicht...

Ist:
main.o: main.h src1.h

Soll:
TEMP/main.o: main.h src1.h


Aus dem Netz habe  ich damit rumgespielt:
1
#set -e $(CC) -MM $(INCLUDES) $(CFLAGS) $< | sed -e "1i $(TEMPDIR)"  > $(TEMPDIR)/$(addsuffix .d, $(notdir $(basename $@))
Leider ohne Erfolg. Kann mir hier jemand helfen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
Loading...