Forum: PC-Programmierung Makefile Ordner erstellen und dateien verschieben


von Johannes (Gast)


Lesenswert?

Hallo,

ich bin neu in makefiles. Habe es aber soweit hinbekommen, dass mein 
Code gebaut wird und eine executeable erstellt wird.

Mometan liegt aber alles noch in meinem source folder
Meine Projektstruktur ist:
1
Projects\Calculator
2
    -build (dieser ordner soll von make erstellt werden)
3
    -project (hier soll hinterher meine Makefile liegen)
4
    -work
5
        -src (hier liegen die source files und die makefile)

make:
1
###########################################################################
2
# Executables
3
###########################################################################
4
RM = del
5
6
###########################################################################
7
# Configuration
8
###########################################################################
9
10
# path to the project (can be relative or absolute)
11
PROJECT_DIR     = H:/Projects/C/calculator
12
WORK_DIR        = $(PROJECT_DIR)/work
13
14
# project name
15
PROJECT_NAME          = CALCULATOR
16
17
# output path for compiler and linker (e.g. objects)
18
BUILD_DIR       = $(PROJECT_DIR)/build
19
OBJ_DIR         = $(BUILD_DIR)/obj
20
OUT_DIR         = $(BUILD_DIR)/out
21
22
# create folders
23
$(BUILD_DIR): ; @mkdir -p $@
24
$(OBJ_DIR): ; @mkdir -p $@
25
$(OUT_DIR): ; @mkdir -p $@
26
27
###########################################################################
28
# compiler basic settings
29
###########################################################################
30
include compiler_settings.mak
31
32
###########################################################################
33
# Include paths to header files
34
###########################################################################
35
36
# c compiler include directories
37
CC_INCLUDES      = -I$(WORK_DIR)/src
38
39
SRC_DIR   = $(WORK_DIR)/src
40
SRCFILES := $(wildcard *.c)
41
42
###########################################################################
43
# List of object files to create
44
###########################################################################
45
46
OBJFILES := $(patsubst %.c,%.o,$(SRCFILES))
47
DEPFILES := $(patsubst %.c,%.d,$(SRCFILES))
48
49
###########################################################################
50
# Path to libraries which should be included
51
###########################################################################
52
53
###########################################################################
54
# Compiler, assembler and linker options
55
###########################################################################
56
57
# additional compiler flags (see compiler_settings.mak)
58
CC_FLAGS        += -std=c99
59
# additional assembler flags (see compiler_settings.mak)
60
AS_FLAGS        +=
61
# additional linker flags (see compiler_settings.mak)
62
LINKER_FLAGS    +=
63
64
###########################################################################
65
# remove/clean all build products   
66
###########################################################################
67
68
.PHONY: all install clean info check
69
70
all1: $(PROJECT_NAME).exe end
71
all2: clean end
72
73
clean:
74
  @$(RM) *.o
75
  @$(RM) $(PROJECT_NAME).exe
76
  
77
$(PROJECT_NAME).exe: $(OBJFILES)
78
  $(LD) $^ -o $@
79
80
%.o: %.c
81
  $(CC) $(CC_FLAGS) $(CC_INCLUDES) -c $< -o $@
82
83
end:
84
  @echo .
85
  @echo # finish $(shell time /t)

Wie bekomme ich es jetzt aber hin die Ordner
BUILD_DIR, OBJ_DIR und OUT_DIR zu erstellen und die einzlnen Dateien da 
drinn zu generieren?

von udok (Gast)


Lesenswert?

Hier ein Beispiel für eine Regel, die Header Files ins INCDIR kopiert.
"|" bedeutet, dass install_headers vom Target INCDIR abhängt.
Nur wenn INCDIR nicht existiert, wird es erzeugt, wenn nur das Datum
geändert wird, passiert nichts.
1
$(INCDIR):
2
  $(MKDIR) $(INCDIR)
3
4
install_headers: | $(INCDIR)
5
  $(CP) *.h *.rc *.txt $(INCDIR)

von udok (Gast)


Lesenswert?

"|" ist eine Gnu Make Erweiterung.

Klassisch machte man das mit einem ".timestamp" File, das im zu 
erzeugenden Verzeichnis liegt.
Nur wenn das ".timestamp" File nicht da ist, wird das Verzeichnis 
erzeugt.
Sonst hast du ja das Problem, dass wenn ein File im Verzeichnis
erzeugt wird, sich das Datum vom Verzeichnis ändert.

Wenn du die Object Files in einem anderen Verzeichnis als die Sourcen
hast, dann funktionieren die automatischen Regeln nicht mehr.
Du musst dann alles selbst schreiben, oder VPATH verwenden.

Das wird sehr schnell viel Aufwand für sehr wenig Nutzen.
Einfacher ist es, die Object Files im Source Verzeichnis
zu erzeugen.  Dann ist das Makefile ein 3 Zeiler, und das ganze Projekt
ist auch leichter zu überschauen.

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.