Makefile Ordner erstellen und dateien verschieben

Gast #6981563
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?
Gast #6981667
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)
Gast #6981681
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.