update: Makefile to new version

This commit is contained in:
2025-10-20 11:58:40 +02:00
parent e208cc0317
commit 1ff8a89576

256
Makefile
View File

@@ -6,221 +6,147 @@
# By: sede-san <sede-san@student.42madrid.com +#+ +:+ +#+ # # By: sede-san <sede-san@student.42madrid.com +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ # # +#+#+#+#+#+ +#+ #
# Created: 2025/07/30 20:22:21 by sede-san #+# #+# # # Created: 2025/07/30 20:22:21 by sede-san #+# #+# #
# Updated: 2025/10/17 20:11:31 by sede-san ### ########.fr # # Updated: 2025/10/20 12:14:43 by sede-san ### ########.fr #
# # # #
# **************************************************************************** # # **************************************************************************** #
# ******************************* Output files ******************************* # # ******************************* Output files ******************************* #
# Executable file name NAME = minishell
NAME = minishell
# ************************** Compilation variables *************************** # # ************************** Compilation variables *************************** #
# Compiler CC = cc
CC = cc CFLAGS = -Wall -Wextra -Werror
HEADERS = -I $(INCLUDE_PATH) $(LIBS_INCLUDE)
# Compilation flags ifeq ($(DEBUG), lldb) # debug with LLDB
CFLAGS = -Wall -Wextra -Werror -Wunreachable-code # -Ofast CFLAGS += -g3
else ifeq ($(DEBUG), address) # use AdressSanitize
# Additional headers CFLAGS += -fsanitize=address -g3
HEADERS = -I $(INCLUDE_PATH) -I $(GNL_INCLUDE_PATH) -I $(PRINTF_INCLUDE_PATH) -I $(LIBFT_INCLUDE_PATH) else # apply optimization flags if no debugging is being done
CFLAGS += -O3
# Debug flags, execute with DEBUG=1 -> make DEBUG=1
DFLAGS = -g3
ifeq ($(DEBUG), 1)
CFLAGS += $(DFLAGS)
endif endif
# Make command with no-print-directory flag MAKE += --no-print-directory
MAKE += --no-print-directory
# ***************************** Style variables ****************************** #
# Define color codes
RED = \033[0;31m
GREEN = \033[0;32m
YELLOW = \033[0;33m
BLUE = \033[0;34m
RESET = \033[0m # No Color
# Emojis
EMOJI_BROOM = 🧹
EMOJI_CHECK =
EMOJI_CROSS =
EMOJI_WRENCH = 🔧
EMOJI_BOX = 📦
# ****************************** Source files ******************************** # # ****************************** Source files ******************************** #
# Source files path SRC_PATH = src
SRC_PATH = src # SRC =
SRC = $(shell find $(SRC_PATH) -type f -name "*.c")
# Source files INCLUDE_PATH = include
SRC = \
$(SRC_PATH)/minishell.c \
$(SRC_PATH)/commands/command_utils.c \
$(SRC_PATH)/commands/exec.c \
$(SRC_PATH)/commands/parse.c \
$(SRC_PATH)/features/builtins/builtin_utils.c \
$(SRC_PATH)/features/builtins/cd.c \
$(SRC_PATH)/features/builtins/echo.c \
$(SRC_PATH)/features/builtins/exit.c \
$(SRC_PATH)/features/builtins/export.c \
$(SRC_PATH)/features/builtins/printenv.c \
$(SRC_PATH)/features/builtins/pwd.c \
$(SRC_PATH)/features/builtins/unset.c \
$(SRC_PATH)/utils/signals.c
# Include path
INCLUDE_PATH = ./include
# ****************************** Object files ******************************** # # ****************************** Object files ******************************** #
# Object files path OBJS_PATH = build
OBJS_PATH = build OBJS = $(SRC:$(SRC_PATH)/%.c=$(OBJS_PATH)/%.o)
# Source files and destination paths
OBJS = $(SRC:$(SRC_PATH)/%.c=$(OBJS_PATH)/%.o)
# Compile as object files
$(OBJS_PATH)/%.o: $(SRC_PATH)/%.c $(OBJS_PATH)/%.o: $(SRC_PATH)/%.c
@mkdir -p $(@D) @mkdir -p $(@D)
@$(CC) $(CFLAGS) -c $< -o $@ $(HEADERS) @$(CC) $(CFLAGS) $(HEADERS) -c $< -o $@
@echo "$< compiled" @$(PRINT) "$< compiled"
# ********************************* Rules ************************************ # # ********************************* Rules ************************************ #
# Compile all all: mandatory
all: lib $(NAME)
.PHONY: all .PHONY: all
# Compile project mandatory: libft get_next_line $(NAME)
$(NAME): $(OBJS) .PHONY: mandatory
@echo "$(YELLOW)$(EMOJI_BOX) Linking...$(RESET)"
@$(CC) $(CFLAGS) $(OBJS) $(LIBS) -o $(NAME) $(NAME): $(OBJS)
@echo "$(GREEN)$(EMOJI_CHECK) Linked.$(RESET)" @$(CC) $(CFLAGS) $(OBJS) $(LIBS) -o $(NAME)
@$(PRINT) "$(GREEN)$(EMOJI_CHECK) $(NAME) ready. $(RESET)"
# Clean object files
clean: clean:
@echo "$(RED)$(EMOJI_BROOM) Cleaning object files...$(RESET)"
@rm -rf $(OBJS_PATH) @rm -rf $(OBJS_PATH)
@echo "$(GREEN)$(EMOJI_CHECK) Object files cleaned.$(RESET)" @$(PRINT) "$(RED)$(EMOJI_BROOM) Object files removed.$(RESET)"
.PHONY: clean .PHONY: clean
# Clean object files and binaries
fclean: clean fclean: clean
@echo "$(RED)$(EMOJI_BROOM) Cleaning binaries...$(RESET)"
@rm -f $(NAME) @rm -f $(NAME)
@if [ -d $(LIBFT_PATH) ]; then \ @if [ -d $(LIBFT_PATH) ]; then \
$(MAKE) -C $(LIBFT_PATH) fclean; \ $(MAKE) --silent -C $(LIBFT_PATH) fclean > /dev/null; \
fi fi
@if [ -d $(GNL_PATH) ]; then \ @if [ -d $(GET_NEXT_LINE_PATH) ]; then \
$(MAKE) -C $(GNL_PATH) fclean; \ $(MAKE) --silent -C $(GET_NEXT_LINE_PATH) fclean > /dev/null; \
fi fi
@echo "$(GREEN)$(EMOJI_CHECK) Binaries cleaned.$(RESET)" @$(PRINT) "$(RED)$(EMOJI_BROOM) Binaries removed.$(RESET)"
.PHONY: fclean .PHONY: fclean
# Delete libraries, object files and binaries
update: fclean
@echo "$(RED)$(EMOJI_BROOM) Removing libraries...$(RESET)"
@rm -rf $(LIB_PATH)
@echo "$(GREEN)$(EMOJI_CHECK) Libraries removed.$(RESET)"
@echo "$(YELLOW)$(EMOJI_WRENCH) Fetching updates...$(RESET)"
@git pull
@echo "$(GREEN)$(EMOJI_CHECK) Updated.$(RESET)"
@echo "$(YELLOW)$(EMOJI_WRENCH) Recompiling...$(RESET)"
@$(MAKE)
.PHONY: update
# Recompile
re: fclean all re: fclean all
.PHONY: re .PHONY: re
# ********************************* Libraries ******************************** # # ****************************** Libraries ********************************** #
# Compile libraries LIBS = -lreadline $(LIBFT_NAME) $(GET_NEXT_LINE_NAME)
lib: LIBS_INCLUDE = -I $(LIBFT_INCLUDE_PATH) -I $(GET_NEXT_LINE_INCLUDE_PATH)
@$(MAKE) libft LIBS_PATH = lib
# @$(MAKE) ft_printf
@$(MAKE) get_next_line
.PHONY: lib
# Compile file with libraries
LIBS = -lreadline $(GNL_BIN) $(LIBFT_BIN) # $(PRINTF_BIN)
# Libraries path
LIB_PATH = lib
# ** Libft ** # # ** Libft ** #
LIBFT = Libft LIBFT = Libft
LIBFT_REPO = https://github.com/sdevsantiago/Libft.git LIBFT_REPO = https://github.com/sdevsantiago/Libft.git
LIBFT_PATH = $(LIB_PATH)/$(LIBFT) LIBFT_PATH = $(LIBS_PATH)/$(LIBFT)
LIBFT_INCLUDE_PATH = $(LIBFT_PATH) LIBFT_INCLUDE_PATH = $(LIBFT_PATH)
LIBFT_BIN = $(LIBFT_PATH)/libft.a LIBFT_NAME = $(LIBFT_PATH)/libft.a
libft: libft: $(LIBFT_NAME)
@if [ ! -d $(LIBFT_PATH) ]; then \
echo "$(YELLOW)$(EMOJI_WRENCH) Cloning $(LIBFT)...$(RESET)"; \
git clone $(LIBFT_REPO) $(LIBFT_PATH); \
rm -rf $(LIBFT_PATH)/.git; \
echo "$(GREEN)$(EMOJI_CHECK) $(LIBFT) cloned...$(RESET)"; \
fi
@if [ ! -f $(LIBFT_BIN) ]; then \
echo "$(YELLOW)$(EMOJI_WRENCH) Compiling $(LIBFT)...$(RESET)"; \
$(MAKE) -C $(LIBFT_PATH) all bonus clean; \
echo "$(GREEN)$(EMOJI_CHECK) $(LIBFT) compiled.$(RESET)"; \
else \
echo "$(GREEN)$(EMOJI_CHECK) $(LIBFT) already compiled.$(RESET)"; \
fi
.PHONY: libft .PHONY: libft
# ** ft_printf ** # $(LIBFT_NAME):
@if [ ! -d $(LIBFT_PATH) ]; then \
PRINTF = ft_printf $(PRINT) "$(YELLOW)$(EMOJI_WRENCH) Cloning $(LIBFT)...$(RESET)"; \
PRINTF_REPO = https://github.com/sdevsantiago/ft_printf.git git clone --quiet $(LIBFT_REPO) $(LIBFT_PATH); \
PRINTF_PATH = $(LIB_PATH)/$(PRINTF) rm -rf $(LIBFT_PATH)/.git; \
PRINTF_INCLUDE_PATH = $(PRINTF_PATH) $(PRINT) "$(GREEN)$(EMOJI_CHECK) $(LIBFT) cloned...$(RESET)"; \
PRINTF_BIN = $(PRINTF_PATH)/libftprintf.a
ft_printf:
@if [ ! -d $(PRINTF_PATH) ]; then \
echo "$(YELLOW)$(EMOJI_WRENCH) Cloning $(PRINTF)...$(RESET)"; \
git clone $(PRINTF_REPO) $(PRINTF_PATH); \
rm -rf $(PRINTF_PATH)/.git; \
echo "$(GREEN)$(EMOJI_CHECK) $(PRINTF) cloned...$(RESET)"; \
fi fi
@if [ ! -f $(PRINTF_BIN) ]; then \ @if [ ! -f $(LIBFT_NAME) ]; then \
echo "$(YELLOW)$(EMOJI_WRENCH) Compiling $(PRINTF)...$(RESET)"; \ $(PRINT) "$(YELLOW)$(EMOJI_WRENCH) Compiling $(LIBFT)...$(RESET)"; \
$(MAKE) -C $(PRINTF_PATH) all bonus clean; \ $(MAKE) --silent -C $(LIBFT_PATH) all clean; \
echo "$(GREEN)$(EMOJI_CHECK) $(PRINTF) compiled.$(RESET)"; \ $(PRINT) "$(GREEN)$(EMOJI_CHECK) $(LIBFT) compiled.$(RESET)"; \
else \
echo "$(GREEN)$(EMOJI_CHECK) $(PRINTF) already compiled.$(RESET)"; \
fi fi
.PHONY: ft_printf
# ** get_next_line ** # # ** get_next_line **
GNL = get_next_line GET_NEXT_LINE = get_next_line
GNL_REPO = https://github.com/sdevsantiago/get_next_line.git GET_NEXT_LINE_REPO = https://github.com/sdevsantiago/get_next_line.git
GNL_PATH = $(LIB_PATH)/$(GNL) GET_NEXT_LINE_PATH = $(LIBS_PATH)/$(GET_NEXT_LINE)
GNL_INCLUDE_PATH = $(GNL_PATH)/include GET_NEXT_LINE_INCLUDE_PATH = $(GET_NEXT_LINE_PATH)/include
GNL_BIN = $(GNL_PATH)/get_next_line.a GET_NEXT_LINE_NAME = $(GET_NEXT_LINE_PATH)/get_next_line.a
get_next_line: get_next_line: $(GET_NEXT_LINE_NAME)
@if [ ! -d $(GNL_PATH) ]; then \
echo "$(YELLOW)$(EMOJI_WRENCH) Cloning $(GNL)...$(RESET)"; \
git clone $(GNL_REPO) $(GNL_PATH); \
rm -rf $(GNL_PATH)/.git; \
rm -rf $(GNL_PATH)/tests; \
echo "$(GREEN)$(EMOJI_CHECK) $(GNL) cloned...$(RESET)"; \
fi
@if [ ! -f $(GNL_BIN) ]; then \
echo "$(YELLOW)$(EMOJI_WRENCH) Compiling $(GNL)...$(RESET)"; \
$(MAKE) -C $(GNL_PATH) all clean; \
echo "$(GREEN)$(EMOJI_CHECK) $(GNL) compiled.$(RESET)"; \
else \
echo "$(GREEN)$(EMOJI_CHECK) $(GNL) already compiled.$(RESET)"; \
fi
.PHONY: get_next_line .PHONY: get_next_line
$(GET_NEXT_LINE_NAME):
@if [ ! -d $(GET_NEXT_LINE_PATH) ]; then \
$(PRINT) "$(YELLOW)$(EMOJI_WRENCH) Cloning $(GET_NEXT_LINE)...$(RESET)"; \
git clone --quiet $(GET_NEXT_LINE_REPO) $(GET_NEXT_LINE_PATH); \
rm -rf $(GET_NEXT_LINE_PATH)/.git; \
rm -rf $(GET_NEXT_LINE_PATH)/tests; \
rm -rf $(GET_NEXT_LINE_PATH)/files; \
$(PRINT) "$(GREEN)$(EMOJI_CHECK) $(GET_NEXT_LINE) cloned...$(RESET)"; \
fi
@if [ ! -f $(GET_NEXT_LINE_NAME) ]; then \
$(PRINT) "$(YELLOW)$(EMOJI_WRENCH) Compiling $(GET_NEXT_LINE)...$(RESET)"; \
$(MAKE) --silent -C $(GET_NEXT_LINE_PATH) all clean > /dev/null; \
$(PRINT) "$(GREEN)$(EMOJI_CHECK) $(GET_NEXT_LINE) compiled.$(RESET)"; \
fi
# ***************************** Style variables ****************************** #
PRINT = printf "%b\n"
RED = \033[0;31m
GREEN = \033[0;32m
YELLOW = \033[0;33m
BLUE = \033[0;34m
RESET = \033[0m
EMOJI_BROOM = 🧹
EMOJI_CHECK =
EMOJI_CROSS =
EMOJI_WRENCH = 🔧
EMOJI_BOX = 📦