CPP01 1.0
読み取り中…
検索中…
一致する文字列を見つけられません
Makefile
[詳解]
1# **************************************************************************** #
2# #
3# ::: :::::::: #
4# Makefile :+: :+: :+: #
5# +:+ +:+ +:+ #
6# By: kamitsui <kamitsui@student.42tokyo.jp> +#+ +:+ +#+ #
7# +#+#+#+#+#+ +#+ #
8# Created: 2025/03/15 19:38:29 by kamitsui #+# #+# #
9# Updated: 2025/04/26 11:51:42 by kamitsui ### ########.fr #
10# #
11# **************************************************************************** #
12
13# @file ex04/Makefile
14# @brief This File is a Makefile for building sedForLosers in ex04 directory.
15
16# Directories
17OBJ_DIR = objs
18DEP_DIR = .deps
19
20# Source files
21SRCS = main.cpp FileReplacer.cpp
22SRCS_TEST = FileReplacer.cpp FileReplacerTest.cpp Test.cpp
23
24# Object files and dependency files
25OBJS = $(addprefix $(OBJ_DIR)/, $(SRCS:.cpp=.o))
26DEPS = $(addprefix $(DEP_DIR)/, $(SRCS:.cpp=.d))
27
28OBJS_TEST = $(addprefix $(OBJ_DIR)/, $(SRCS_TEST:.cpp=.o))
29DEPS_TEST = $(addprefix $(DEP_DIR)/, $(SRCS_TEST:.cpp=.d))
30
31# Build target
32NAME = sedForLosers
33NAME_TEST = testSedForLosers
34
35# Compiler
36CXX = c++
37CXXFLAGS = -Wall -Wextra -Werror -std=c++98
38CF_DEP = -MMD -MP -MF $(@:$(OBJ_DIR)/%.o=$(DEP_DIR)/%.d)
39
40# Rules for building object files
41$(OBJ_DIR)/%.o: %.cpp
42 @mkdir -p $(OBJ_DIR)
43 @mkdir -p $(DEP_DIR)
44 $(CXX) $(CXXFLAGS) $(CF_DEP) -c $< -o $@
45
46# Rules for building dependency files
47$(DEP_DIR)/%.d: %.c
48 @mkdir -p $(DEP_DIR)
49
50# Default target
51all: $(NAME)
52.PHONY: all
53
54# Build Target
55$(NAME): $(OBJS)
56 $(CXX) $(CXXFLAGS) $(OBJS) -o $(NAME)
57 $(call ASCII_ART,${NAME})
58
59# Execute Test Target
60$(NAME_TEST): fclean $(OBJS_TEST)
61 $(CXX) $(CXXFLAGS) $(OBJS_TEST) -o $(NAME_TEST)
62
63# Build
64EXECUTE_TEST_CODE: ${NAME_TEST}
65 $(call ASK_AND_EXECUTE_TEST,$<)
66
67# URL for Test files
68URL_INPUT_TXT = "https://gist.githubusercontent.com/kamitsui/e55e9a111d57ba6902b8219a29f7d9a6/raw/d9fd0ff9b0e37663608f60e12e2ea2d068809a6e/input.txt"
69URL_TEST_SH = "https://gist.githubusercontent.com/kamitsui/e55e9a111d57ba6902b8219a29f7d9a6/raw/02d0a54bf8e754b97df9a8a8cf84edd2ceaf8eaa/test.sh"
70
71# Get test.sh
72test.sh:
73 curl -o $@ ${URL_TEST_SH}
74 chmod +x test.sh
75
76# Get input.txt
77input.txt:
78 curl -o $@ ${URL_INPUT_TXT}
79
80# Run Test Script
81EXECUTE_TEST_SCRIPT: test.sh input.txt
82 $(call ASK_AND_EXECUTE_TEST,$<)
83
84# Test Script : Build -> Get files -> Run
85test: ${NAME_TEST} ${NAME} EXECUTE_TEST_CODE EXECUTE_TEST_SCRIPT
86.PHONY: test
87
88# Rule for removing object & dependency files
89clean:
90 rm -rf $(OBJ_DIR) $(DEP_DIR)
91.PHONY: clean
92
93# Rule for removing Target & others
94fclean: clean
95 rm -f $(NAME) $(NAME_TEST)
96.PHONY: fclean
97
98# Rule for Clean & Build Target
99re: fclean all
100.PHONY: re
101
102# Prompt for Execution
103define ASK_AND_EXECUTE_TEST
104 @echo "Do you want to execute ./$(1)? (y/n)"
105 @read -r answer; \
106 case "$$answer" in \
107 [yY]) \
108 echo "./$(1)"; \
109 ./$(1) \
110 ;; \
111 [nN]) \
112 echo "Skip exection with $(1)." ; \
113 ;; \
114 *) \
115 echo "Invalid input. Skip." ; \
116 ;; \
117 esac
118endef
119
120# ASCII Art : Display Tips the way to use.
121define ASCII_ART
122 @echo " ____________________________________________________________________"
123 @echo "< Usage : >"
124 @echo "< $$ ./sedForLosers <filename> <string_to_find> <string_to_replace> >"
125 @echo "< >"
126 @echo "< Test Case : >"
127 @echo "< $$ make test >"
128 @echo "< >"
129 @echo "---------------------------------------------------------------------"
130 @echo " \ ^__^"
131 @echo " \ (oo)\_______"
132 @echo " (__)\ )\\/\\"
133 @echo " ||----w |"
134 @echo " || ||\n"
135endef