CPP07 1.0
読み取り中…
検索中…
一致する文字列を見つけられません
Makefile
[詳解]
1# **************************************************************************** #
2# #
3# ::: :::::::: #
4# Makefile :+: :+: :+: #
5# +:+ +:+ +:+ #
6# By: kamitsui <kamitsui@student.42tokyo.jp> +#+ +:+ +#+ #
7# +#+#+#+#+#+ +#+ #
8# Created: 2025/05/29 22:58:19 by kamitsui #+# #+# #
9# Updated: 2025/07/28 16:26:19 by kamitsui ### ########.fr #
10# #
11# **************************************************************************** #
12
13# Directories
14OBJ_DIR = objs
15DEP_DIR = .deps
16
17# Source files
18SRCS = main.cpp
19
20#vpath %.cpp ./
21
22# Object files and dependency files
23OBJS = $(addprefix $(OBJ_DIR)/, $(SRCS:.cpp=.o))
24DEPS = $(addprefix $(DEP_DIR)/, $(SRCS:.cpp=.d))
25
26# Build target
27NAME = a.out
28
29vpath %.cpp ./
30
31# Compiler
32CXX = c++
33CXXFLAGS = -Wall -Wextra -Werror -std=c++98
34CF_DEP = -MMD -MP -MF $(@:$(OBJ_DIR)/%.o=$(DEP_DIR)/%.d)
35
36# Rules for building object files
37$(OBJ_DIR)/%.o: %.cpp
38 $(CXX) $(CXXFLAGS) $(CF_DEP) -c $< -o $@
39
40# Default target
41all: directories $(NAME)
42 $(call ASCII_ART,$(NAME))
43.PHONY: all
44
45# Make Directories
46directories:
47 @mkdir -p $(OBJ_DIR)
48 @mkdir -p $(DEP_DIR)
49.PHONY: directories
50
51# Build Target
52$(NAME): $(OBJS)
53 $(CXX) $(CXXFLAGS) $(OBJS) -o $(NAME)
54
55# REPOSITORY for Test
56TEST_ROOT = ../../cpp_module_tester
57TEST_DIR = $(TEST_ROOT)/cpp07
58URL_TEST_CPP = "https://github.com/kamitsui/cpp_module_tester.git"
59TEST_TARGET = $(TEST_DIR)/ex01_app
60EX_NUM = ex01
61
62# Test
63test:
64ifeq ($(shell test -d $(TEST_DIR) && echo exist),)
65 @echo "Please clone the test repository"
66 $(call ASK_AND_EXECUTE_ON_YES, git clone $(URL_TEST_CPP) $(TEST_ROOT))
67endif
68 $(call ASK_AND_EXECUTE_ON_YES, make -C $(TEST_DIR) $(EX_NUM))
69# @echo "No support!"
70.PHONY: test
71
72# More Test : Enable Logger
73debug: fclean
74 make WITH_DEBUG=1
75.PHONY: debug
76
77# DEBUG_MODE
78ifdef WITH_DEBUG
79CXXFLAGS += -D DEBUG_MODE
80endif
81
82# Rule for removing object & dependency files
83clean:
84 rm -rf $(OBJ_DIR) $(DEP_DIR) $(TEST_DIR)/objs $(TEST_DIR)/.deps
85.PHONY: clean
86
87# Rule for removing Target & others
88fclean: clean
89 rm -f $(NAME) $(TEST_TARGET)
90.PHONY: fclean
91
92# Rule for Clean & Build Target
93re: fclean all
94.PHONY: re
95
96# Enable dependency file
97-include $(DEPS)
98
99# ASCII Art : Display Tips the way to use.
100define ASCII_ART
101 @echo " _______________________________________"
102 @echo "< Usage : >"
103 @echo "< $$ ./a.out >"
104 @echo "< >"
105 @echo "< Test Case : >"
106 @echo "< $$ make test >"
107 @echo "----------------------------------------"
108 @echo " \ ^__^"
109 @echo " \ (oo)\_______"
110 @echo " (__)\ )\\/\\"
111 @echo " ||----w |"
112 @echo " || ||\n"
113endef
114
115# Ask and Exit on No
116define ASK_AND_EXECUTE_ON_YES
117 @echo "Execute? $(1) (y/n)"
118 @read -r answer; \
119 case "$$answer" in \
120 [yY]) \
121 echo $(1); \
122 $(1); \
123 ;; \
124 *) \
125 echo "Skip ..."; \
126 ;; \
127 esac
128endef
129
130# Makefile Option : Disable '--print-directory'
131MAKEFLAGS += --no-print-directory