This repository has been archived by the owner on Sep 14, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
113 lines (95 loc) · 3.15 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
#
# Makefile for Lexemn
# ___ _______ ___ ___ _______ _____ ______ ________
# |\ \ |\ ___ \ |\ \ / /|\ ___ \ |\ _ \ _ \|\ ___ \
# \ \ \ \ \ __/| \ \ \/ / | \ __/|\ \ \\\__\ \ \ \ \\ \ \
# \ \ \ \ \ \_|/__ \ \ / / \ \ \_|/_\ \ \\|__| \ \ \ \\ \ \
# \ \ \____\ \ \_|\ \ / \/ \ \ \_|\ \ \ \ \ \ \ \ \\ \ \
# \ \_______\ \_______\/ /\ \ \ \_______\ \__\ \ \__\ \__\\ \__\
# \|_______|\|_______/__/ /\ __\ \|_______|\|__| \|__|\|__| \|__|
# |__|/ \|__|
#
# The Lexemn Project
# https://github.com/fontseca/lexemn
#
# Copyright (C) 2022 by Jeremy Fonseca <fonseca.dev@outlook.com>
#
# This file is part of Lexemn.
#
# Lexemn is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# Lexemn is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# Lexemn. If not, see <https://www.gnu.org/licenses/>.
.SUFFIXES:
.SILENT:
SHELL := /bin/bash
OUTDIR := ./bin
INCLUDEDIR := ./include
SRCDIR := ./src
OBJDIR := ./obj
CXX := g++
CXXFLAGS := -g -std=c++23 -Wall -Wextra -Werror -pedantic
LIBS := -lreadline
NAME := $(addprefix $(OUTDIR)/, lexemn)
OBJS := $(patsubst $(addprefix $(SRCDIR)/, %.cc), \
$(addprefix $(OBJDIR)/, %.o), \
$(wildcard $(addprefix $(SRCDIR)/, *.cc)))
ECHO_GDONE := echo -e "\e[1;92m(Done)\e[0m"
ECHO_RDONE := echo -e "\e[1;91m(Done)\e[0m"
.PHONY: all
all: question $(OBJDIR) $(NAME)
$(NAME): $(OBJS) | $(OUTDIR)
echo -n "Linking into '$(NAME)'... "
$(CXX) $(CXXFLAGS) -o $(NAME) $(OBJS) $(LIBS)
$(ECHO_GDONE)
$(OUTDIR):
echo -n "Creating '$(OUTDIR)' directory... "
mkdir $(OUTDIR)
$(ECHO_GDONE)
$(OBJDIR):
echo -n "Creating '$(OBJDIR)' directory... "
mkdir $(OBJDIR)
$(ECHO_GDONE)
$(addprefix $(OBJDIR)/, %.o): $(addprefix $(SRCDIR)/, %.cc)
echo -n "Building '$<'... "
$(CXX) -c -o $@ $(CXXFLAGS) $< -I $(INCLUDEDIR)
$(ECHO_GDONE)
.PHONY: question
question:
make --question $(NAME) && \
echo "Everything up to date." || true
.PHONY: clean
# Clean object and binary files.
clean:
if [ -e $(NAME) ]; then \
echo -n "Removing '$(NAME)' file... "; \
rm $(NAME); \
$(ECHO_RDONE); \
fi; \
for file in $(OBJS); do \
if [ -e $$file ]; then \
echo -n "Removing '$$file' file... "; \
rm $$file; \
$(ECHO_RDONE); \
fi; \
done;
.PHONY: cleandir
# Clean output and object directories.
cleandir:
if [ -e $(OUTDIR) ]; then \
echo -n "Removing '$(OUTDIR)' directory... "; \
rmdir $(OUTDIR); \
$(ECHO_RDONE); \
fi; \
if [ -e $(OBJDIR) ]; then \
echo -n "Removing '$(OBJDIR)' directory... "; \
rmdir $(OBJDIR); \
$(ECHO_RDONE); \
fi;