-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathMakefile
executable file
·116 lines (94 loc) · 3.2 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# **************************************************************************** #
# #
# ::: :::::::: #
# Makefile :+: :+: :+: #
# +:+ +:+ +:+ #
# By: world42 <[email protected]> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2013/11/19 13:57:53 by world42 #+# #+# #
#* Updated: 2016/12/16 18:33:02 by ale-batt ### ########.fr *#
# #
# **************************************************************************** #
NNAME = ft
INCLUDE = ./includes
SOURCES = ./sources
OBJECT = ./.objs
TAGS = etags --declarations
CFLAGS = -g -Wall -Werror -Wextra
# -ansi -pedantic
C = \033[1;34m
# make [[OPT]] [[MODE]=1] ...]
# ex: make re V=1
# Verbose mode
V = 0
# debug mode
G = 0
# create emacs TAGS file
T = 0
# N = 0
SILENCE_1 :=
SILENCE_0 :=@
SKIP_1 :=
SKIP_0 := \033[A
STAT_1 := displaystat
STAT_0 :=
NORC_1 := norme
NORC_0 :=
DEBUG_1 := -g
DEBUG_0 :=
TAG_1 := tag
TAG_0 :=
TAG = $(TAG_$(T))
STAT = $(STAT_$(S))
SKIP = $(SKIP_$(V))
DEBUG = $(DEBUG_$(G))
SILENCE = $(SILENCE_$(V))
NAME = lib$(NNAME).a
CLNAME = l$(NNAME)
CC = $(SILENCE)gcc
LIB = $(SILENCE)ar rc
RM = $(SILENCE)rm -rf
FILES = $(shell find $(SOURCES) -type f -follow | sed "s/.\/[^\/]*//")
OF=$(FILES:%.c=%.o)
O_FILES = $(addprefix $(OBJECT), $(OF))
C_FILES = $(addprefix $(SOURCES), $(FILES))
DIRS = $(shell find $(SOURCES) -type d -follow -print | sed "s/.\/[^\/]*//" | cut -d'/' -f2)
O_DIRS= $(addprefix $(OBJECT)/, $(DIRS))
SRCS = $(shell find $(SOURCES) -type f -follow -exec basename {} \;)
H_FILES = $(shell find $(INCLUDE) -type f -follow -print | grep ".*\.h$$")
W := o
BART := $(shell echo '$(O_FILES)'|wc -w|tr -d ' ')
BARC = $(words $W)$(eval W := o $W)
BAR = $(shell printf "%`expr $(BARC) '*' 100 / $(BART)`s" | tr ' ' '=')
U = $(C)[$(NAME)]----->\033[0m
.PHONY: all clean fclean re tag norme
all: $(O_DIRS) $(NORC) $(NAME) $(STAT) $(TAG)
$(O_DIRS):
@mkdir -p $(OBJECT) $(O_DIRS)
$(NAME): $(O_FILES) $(H_FILES)
@echo "$(U)$(C)[COMPILE:\033[1;32m DONE$(C)]"
@echo "$(U)$(C)[BUILD LIB]\033[0;32m"
$(LIB) $(NAME) $(O_FILES)
@ranlib $(NAME)
@echo "$(SKIP)$(U)$(C)[BUILD :\033[1;32m DONE$(C)]\033[0m\033[K"
$(OBJECT)/%.o: $(SOURCES)/%.c
@echo "$(U)$(C)[COMPILE: \033[1;31m$<\033[A\033[0m"
@echo "\033[0;32m"
$(CC) $(DEBUG) $(CFLAGS) -o $@ -c $< -I$(INCLUDE)
@printf "\033[1;31m[%-100s] %s%%\n" $(BAR) `echo $W|wc -w|tr -d ' '`
@echo "$(SKIP)\033[A\033[2K$(SKIP)"
clean:
@echo "$(U)$(C)[CLEAN]\033[0;32m"
$(RM) $(OBJECT)
@echo "$(SKIP)$(U)$(C)[CLEAN:\033[1;32m DONE$(C)]\033[0m"
fclean: clean
@echo "$(U)$(C)[F-CLEAN]\033[0;32m"
$(RM) $(NAME)
@echo "$(SKIP)$(U)$(C)[F-CLEAN:\033[1;32m DONE$(C)]\033[0m"
re: fclean all
tag:
@echo "$(U)$(C)[TAGING]\033[0;32m"
$(SILENCE)$(TAGS) $(C_FILES)
@echo "$(SKIP)$(U)$(C)[TAGING:\033[1;32m DONE$(C)]\033[0m"
norme:
@norminette $(C_FILES) $(H_FILES)