update: Makefile to new version
This commit is contained in:
236
Makefile
236
Makefile
@@ -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
|
||||||
|
|
||||||
# Source files and destination paths
|
|
||||||
OBJS = $(SRC:$(SRC_PATH)/%.c=$(OBJS_PATH)/%.o)
|
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 = 📦
|
||||||
|
|||||||
Reference in New Issue
Block a user