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