Makefile eigener Output/Temp Ordner und Unterordner

#2200214
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
Gast #2200638
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.
#2200732
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, ...
Gast #2200772
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.
Gast #2201229
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
...
#2203372
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren