Last active 1753064458

Generic C++ Makefile

Makefile Raw
1##############################
2# Generic C++ Makefile for small to medium projects
3# Your should have a "build", a "test", folder, and your code inside a folder of the same name.
4#
5# Production-ready executables can go in "apps" folder.
6##############################
7
8CXX := -g++
9CXXFLAGS := -pedantic-errors -std=c++20 -Wall -Wextra -Werror
10LDFLAGS := -L/usr/lib -lstdc++ -lm
11BUILD := ./build
12NAME := Foobar # replace
13APP_DIR := $(BUILD)/apps
14TEST_DIR := ./test
15OBJ_DIR := $(BUILD)/objects
16TARGET := program
17INCLUDE := -I.
18SRC := \
19 $(wildcard $(NAME)/*.cc) \
20
21TEST := \
22 $(wildcard test/*.cc) \
23
24OBJECTS := $(SRC:%.cc=$(OBJ_DIR)/%.o)
25DEPENDENCIES \
26 := $(OBJECTS:.o=.d)
27
28TESTS := $(TEST:%.cc=$(OBJ_DIR)/%.o)
29DEPENDENCIES \
30 := $(TESTS:.o=.d)
31
32
33all: build $(APP_DIR)/$(TARGET)
34
35test: build $(TEST_DIR)/$(TARGET)
36 ./test/test_runner
37 @rm -f ./test/test_runner
38
39$(OBJ_DIR)/%.o: %.cc
40 @mkdir -p $(@D)
41 $(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -MMD -o $@
42
43$(APP_DIR)/$(TARGET): $(OBJECTS)
44 @mkdir -p $(@D)
45 $(CXX) $(CXXFLAGS) -o $(APP_DIR)/$(TARGET) $^ $(LDFLAGS)
46
47$(TEST_DIR)/$(TARGET): $(OBJECTS) $(TESTS)
48 @mkdir -p $(@D)
49 $(CXX) $(CXXFLAGS) -o $(TEST_DIR)/test_runner $^ $(LDFLAGS)
50
51
52-include $(DEPENDENCIES)
53
54.PHONY: all build clean debug release info test
55
56build:
57 @mkdir -p $(APP_DIR)
58 @mkdir -p $(OBJ_DIR)
59
60debug: CXXFLAGS += -DDEBUG -g
61debug: all
62
63release: CXXFLAGS += -O2
64release: all
65
66clean:
67 -@rm -rvf $(OBJ_DIR)/*
68 -@rm -rvf $(APP_DIR)/*
69
70info:
71 @echo "[*] Application dir: ${APP_DIR} "
72 @echo "[*] Object dir: ${OBJ_DIR} "
73 @echo "[*] Sources: ${SRC} "
74 @echo "[*] Objects: ${OBJECTS} "
75 @echo "[*] Dependencies: ${DEPENDENCIES}"