This repository was archived by the owner on Aug 30, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
120 lines (94 loc) · 2.65 KB
/
Makefile
File metadata and controls
120 lines (94 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#########################
## PROJECT SETTINGS ##
#########################
# THIS PART HAS TO BE MODIFIED IN ORDER TO FIT YOUR PROJECT. CHECK README FOR MORE INFORMATION.
# Compilation type : EXECUTABLE / STATIC_LIB / SHARED_LIB
TARGET_TYPE =
# Name of the executable/library
TARGET_NAME =
# Source file extension
SRC_EXTENSION =
# Compiler
CXX =
# Compilation flags (-c for .o object generation)
CXXFLAGS = -c
# Module XXX
INCLUDE_DIR_MODULE_XXX =
LIB_DIR_MODULE_XXX =
LIB_MODULE_XXX =
# Module YYY
INCLUDE_DIR_MODULE_YYY =
LIB_DIR_MODULE_YYY =
LIB_MODULE_YYY =
# Include and link/lib flags composed of INCLUDE_DIR (default) and modules defined previously
INCLUDE_FLAGS = -I $(INCLUDE_DIR) # -I $(INCLUDE_DIR_MODULE_XXX)
LDFLAGS = # -L $(LIB_DIR_MODULE_XXX) $(LIB_MODULE_XXX)
# Logfile containing compilation log
LOGFILE = build.log
#########################
## GENERAL SETTINGS ##
#########################
# Color code
BOLD_B = \033[1m
BOLD_E = \033[0m
RED = \033[0;31m
GREEN = \033[0;32m
NC = \033[0m
# Macro for better display
PRINT_NAME = @printf "%50s\t" $<
PRINT_STATUS = @if [ $$? -eq 0 ]; then echo -e '$(GREEN)$(BOLD_B)[SUCCESS]$(BOLD_E)$(NC)'; else echo -e '$(RED)$(BOLD_B)[FAIL]$(BOLD_E)$(NC)'; fi
PRINT_TARGET_NAME = @printf "\n%50s\t" $@
# Name of source, include and object folder (relative to Makefile path)
SOURCE_DIR = src
INCLUDE_DIR = include
OBJECT_DIR = bin
# Reference to source and object files.
SOURCES = $(wildcard $(SOURCE_DIR)/*.$(SRC_EXTENSION))
OBJECTS = $(patsubst $(SOURCE_DIR)/%.$(SRC_EXTENSION),$(OBJECT_DIR)/%.o,$(SOURCES))
##################
## BUILD STEP ##
##################
# Add mandatory compilation option for shared library
ifeq ($(TARGET_TYPE), SHARED_LIB)
LDFLAGS += -shared
CXXFLAGS += -fPIC
endif
# Compute final name based on the type of the target
ifeq ($(TARGET_TYPE), EXECUTABLE)
FULL_NAME = $(TARGET_NAME)
else
ifeq ($(TARGET_TYPE), STATIC_LIB)
FULL_NAME = lib$(TARGET_NAME).a
else
FULL_NAME = lib$(TARGET_NAME).so
endif
endif
.PHONY: all
.ONESHELL:
all: compil
.PHONY: debug
.ONESHELL:
debug: CXXFLAGS += -g
debug: compil
compil: CLEAN_BEFORE_BUILD $(FULL_NAME)
.PHONY: clean
clean: CLEAN_BEFORE_BUILD
@rm -f $(OBJECTS)
$(FULL_NAME): $(OBJECTS)
@$(PRINT_TARGET_NAME)
@if [ $(TARGET_TYPE) = STATIC_LIB ]; then
@ar -rcs $@ $(LDFLAGS) $^ >> $(LOGFILE) 2>&1
@else
@$(CXX) -o $@ $^ $(LDFLAGS) >> $(LOGFILE) 2>&1
@fi
@$(PRINT_STATUS)
$(OBJECT_DIR)/%.o: $(SOURCE_DIR)/%.$(SRC_EXTENSION)
@$(PRINT_NAME)
@$(CXX) $(CXXFLAGS) $(INCLUDE_FLAGS) $< -o $@ >> $(LOGFILE) 2>&1
@$(PRINT_STATUS)
CLEAN_BEFORE_BUILD:
@rm -f $(LOGFILE)
@rm -f $(FULL_NAME)
@if [ ! -d "$(OBJECT_DIR)" ]; then
@ mkdir $(OBJECT_DIR)
@fi