-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
222 lines (191 loc) · 8.37 KB
/
Makefile
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
# **************************************************************************** #
# #
# ::: :::::::: #
# Makefile :+: :+: :+: #
# +:+ +:+ +:+ #
# By: ozamora- <ozamora-@student.42madrid.com +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2024/11/25 20:01:56 by ozamora- #+# #+# #
# Updated: 2025/02/07 21:59:45 by ozamora- ### ########.fr #
# #
# **************************************************************************** #
# **************************************************************************** #
# DIRECTORIES
SRC_DIR := src/
INC_DIR := inc/
OBJ_DIR := obj/
LIB_DIR := lib/
LIBFT_DIR := $(LIB_DIR)libft/
LIBFT_INC_DIR := $(LIBFT_DIR)inc/
# **************************************************************************** #
# FILES
#SRC_FILES := $(wildcard $(SRC_DIR)*.c)
SRC_COMMON_FILES := parser check stack utils exit \
op_push op_rev_rotate op_rotate op_swap op_utils \
sort_q
SRC_FILES := push_swap sort sort_k $(SRC_COMMON_FILES)
SRC_BONUS_FILES := checker_bonus $(SRC_COMMON_FILES)
# INCLUDE FILES
INC_FILES := push_swap
# GENERAL FILES
SRCS := $(addprefix $(SRC_DIR), $(addsuffix .c, $(SRC_FILES)))
OBJS := $(SRCS:$(SRC_DIR)%.c=$(OBJ_DIR)%.o)
DEPS := $(SRCS:$(SRC_DIR)%.c=$(OBJ_DIR)%.d)
INCS := $(addprefix $(INC_DIR), $(addsuffix .h, $(INC_FILES)))
INCS += $(LIBFT_INC_DIR)libft.h
SRCS_BONUS := $(addprefix $(SRC_DIR), $(addsuffix .c, $(SRC_BONUS_FILES)))
OBJS_BONUS := $(SRCS_BONUS:$(SRC_DIR)%.c=$(OBJ_DIR)%.o)
DEPS_BONUS := $(SRCS_BONUS:$(SRC_DIR)%.c=$(OBJ_DIR)%.d)
# **************************************************************************** #
# PROJECT
NAME := push_swap
LIBFT := $(LIBFT_DIR)libft.a
BONUS_NAME := checker
# **************************************************************************** #
# COMPILER
CC := cc
CFLAGS := -Wall -Wextra -Werror
CFLAGS += -MMD -MP
IFLAGS := -I$(INC_DIR) -I$(LIBFT_INC_DIR)
LDFLAGS := -L$(LIBFT_DIR) -lft
# DEBUG MODE
BUILD_MODE_FILE := .build_mode
ifeq ($(DEBUG),1)
CFLAGS += -g3 -fsanitize=address
LDFLAGS += -fsanitize=address
endif
# VALGRIND MODE
ifeq ($(VALGRIND),1)
CFLAGS += -g3
endif
# **************************************************************************** #
# COLOURS: BOLD RGBYW
BR = \033[1;31m
BG = \033[1;32m
BB = \033[1;34m
BY = \033[1;33m
BW = \033[1;37m
# NO COLOR and CLEAR LINE
NC = \033[0;39m
CL = \033[2K
# **************************************************************************** #
# ESSENTIAL RULES
# Default rule to create the program
all: libft $(NAME)
# Rule to create the program
$(NAME): $(OBJS) $(LIBFT)
@$(CC) $(CFLAGS) $(IFLAGS) $(OBJS) $(LDFLAGS) -o $(NAME)
@printf "%b" "$(CL) -> $(BW)[push_swap]:\t$(BG)Compilation success\t✅$(NC)\n"
@echo "─────────────────────────────────────────────────────$(BY)"
@echo "▗▄▄▖ ▗▖ ▗▖ ▗▄▄▖▗▖ ▗▖ ▗▄▄▖▗▖ ▗▖ ▗▄▖ ▗▄▄▖ ";
@echo "▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌ ▐▌ ▐▌ ▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌";
@echo "▐▛▀▘ ▐▌ ▐▌ ▝▀▚▖▐▛▀▜▌ ▝▀▚▖▐▌ ▐▌▐▛▀▜▌▐▛▀▘ ";
@echo "▐▌ ▝▚▄▞▘▗▄▄▞▘▐▌ ▐▌ ▗▄▄▞▘▐▙█▟▌▐▌ ▐▌▐▌ by ozamora-$(NC)";
@echo "\n─────────────────────────────────────────────────────"
# Rule to compile object files from source files
$(OBJ_DIR):
@mkdir -p $(OBJ_DIR)
$(OBJ_DIR)%.o: $(SRC_DIR)%.c | $(OBJ_DIR)
@mkdir -p $(dir $@)
@printf "%b" "$(CL) -> $(BW)[push_swap]:\t$(NC)$<\r"
@$(CC) $(CFLAGS) $(IFLAGS) -c $< -o $@
# Rule to make the library Libft
libft: $(LIBFT)
$(LIBFT):
@$(MAKE) -sC $(LIBFT_DIR)
# Rule to clean generated files
clean:
@rm -rf $(OBJ_DIR)/*.o $(OBJ_DIR)/*.d $(OBJ_DIR)
@rm -f $(BUILD_MODE_FILE)
@$(MAKE) clean -sC $(LIBFT_DIR)
@printf "%b" "$(CL) -> $(BW)[push_swap]:\t$(BG)Object files cleaned\t❎$(NC)\n"
# Rule to clean generated files and the executablle
fclean:
@$(MAKE) clean > /dev/null
@$(MAKE) fclean -sC $(LIBFT_DIR)
@rm -rf $(NAME) $(BONUS_NAME)
@printf "%b" "$(CL) -> $(BW)[push_swap]:\t$(BG)Exe and objects cleaned\t❎$(NC)\n"
# Rule to recompile from zero.
re: fclean all
# **************************************************************************** #
# CHECKER / BONUS RULES
bonus: libft $(BONUS_NAME)
$(BONUS_NAME): $(OBJS_BONUS)
@$(CC) $(CFLAGS) $(IFLAGS) $(OBJS_BONUS) $(LDFLAGS) -o $(BONUS_NAME)
@printf "%b" "$(CL) -> $(BW)[checker]:\t\t$(BG)Compilation success\t✅$(NC)\n"
# **************************************************************************** #
# NORM AND DEBUG RULES
# Rule to check if the files pass norminette
norm:
@norminette $(SRCS) $(INCS)
# Rule to compile object files from source files with debug flags
debug:
@if [ ! -f $(BUILD_MODE_FILE) ] || ! grep -q "DEBUG=1" $(BUILD_MODE_FILE); then \
$(MAKE) clean -s; \
fi
@echo "DEBUG=1" > $(BUILD_MODE_FILE)
@$(MAKE) bonus -s DEBUG=1
@$(MAKE) -s DEBUG=1
@echo " -> $(BW)[Debug]:\t\t$(BB)Debug mode enabled\t🟦$(NC)"
-@if [ ! -z "$(ARGS)" ]; then ./$(NAME) $(ARGS); fi
@echo " -> $(BW)[Debug]:\t\t$(BB)Debug w/ my Checker\t🟦$(NC)"
-@if [ ! -z "$(ARGS)" ]; then ./$(NAME) $(ARGS) | ./$(BONUS_NAME) $(ARGS); fi
@echo " -> $(BW)[Debug]:\t\t$(BB)Debug w/ og Checker\t🟦$(NC)"
-@if [ ! -z "$(ARGS)" ]; then ./$(NAME) $(ARGS) | ./checker_linux $(ARGS); fi
# Rule to compile with valgrind debug flags
valgrind:
@if [ ! -f $(BUILD_MODE_FILE) ] || ! grep -q "VALGRIND=1" $(BUILD_MODE_FILE); then \
$(MAKE) clean -s; \
fi
@echo "VALGRIND=1" > $(BUILD_MODE_FILE)
@$(MAKE) bonus -s VALGRIND=1
@$(MAKE) -s VALGRIND=1
@echo " -> $(BW)[Valgrind]:\t\t$(BB)Valgrind mode enabled\t🟦$(NC)"
-@valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./$(NAME) $(ARGS)
@echo " -> $(BW)[Valgrind]:\t\t$(BB)Valgrind with my Checker\t🟦$(NC)"
-@valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./$(NAME) $(ARGS) | ./$(BONUS_NAME) $(ARGS)
@echo " -> $(BW)[Valgrind]:\t\t$(BB)Valgrind with og Checker\t🟦$(NC)"
-@valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./$(NAME) $(ARGS) | ./checker_linux $(ARGS)
# **************************************************************************** #
# ADDITIONAL RULES
# Rule to show compilation and linking commands
show:
@echo "$(BY)Compilation command:$(NC)\t"\
"$(CC) $(CFLAGS) $(IFLAGS) -c $(SRC_DIR)push_swap.c -o $(OBJ_DIR)push_swap.o"
@echo "$(BY)Linking command:$(NC)\t"\
"$(CC) $(CFLAGS) $(IFLAGS) $(OBJS) -o $(NAME) $(LDFLAGS)"
@echo "$(BY)Cleaning command:$(NC)\t rm -rf $(OBJ_DIR)" $(NAME)
# Rule to show all variables being used
info:
@echo "$(BY)\nozamora's push_swap:$(NC)"
@echo "$(BB)NAME: $(NC)$(NAME)"
@echo "$(BB)LIBFT: $(NC)$(LIBFT)"
@echo "$(BY)\nCompiler:$(NC)"
@echo "$(BB)CC: $(NC)$(CC)"
@echo "$(BB)CFLAGS: $(NC)$(CFLAGS)"
@echo "$(BB)IFLAGS: $(NC)$(IFLAGS)"
@echo "$(BB)LDFLAGS: $(NC)$(LDFLAGS)"
@echo "$(BY)\nDirectories:$(NC)"
@echo "$(BB)SRC_DIR: $(NC)$(SRC_DIR)"
@echo "$(BB)INC_DIR: $(NC)$(INC_DIR)"
@echo "$(BB)OBJ_DIR: $(NC)$(OBJ_DIR)"
@echo "$(BB)LIB_DIR: $(NC)$(LIB_DIR)"
@echo "$(BB)LIBFT_DIR: $(NC)$(LIBFT_DIR)"
@echo "$(BB)LIBFT_INC_DIR: $(NC)$(LIBFT_INC_DIR)"
@echo "$(BY)\nFiles:$(NC)"
@echo "$(BB)SRC_FILES: $(NC)$(SRC_FILES)"
@echo "$(BB)INC_FILES: $(NC)$(INC_FILES)"
@echo "$(BB)SRCS: $(NC)$(SRCS)"
@echo "$(BB)OBJS: $(NC)$(OBJS)"
@echo "$(BB)DEPS: $(NC)$(DEPS)"
@echo "$(BB)INCS: $(NC)$(INCS)"
@echo "$(BY)\nBonus:$(NC)"
@echo "$(BB)BONUS_NAME: $(NC)$(BONUS_NAME)"
@echo "$(BB)SRC_BONUS_FILES: $(NC)$(SRC_BONUS_FILES)"
@echo "$(BB)SRCS_BONUS: $(NC)$(SRCS_BONUS)"
@echo "$(BB)OBJS_BONUS: $(NC)$(OBJS_BONUS)"
@echo "$(BB)DEPS_BONUS: $(NC)$(DEPS_BONUS)"
-include $(DEPS) $(DEPS_BONUS)
.PHONY: all clean fclean re bonus norm debug valgrind show info
.DEFAULT_GOAL := all
# **************************************************************************** #