Description
This is a very simple C++ Makefile example and associated template, that can be used to get
small to medium sized C++ projects up and running quickly and easily. The Makefile assumes
source code for the project is broken up into two groups, headers (*.hpp) and
implementation files (*.cpp) .
The source code and directory layout for the project is comprised of three main directories
(include, src and build) , under which other directories containing code would reside.
The layout used in the example is as follows:
─┬[ Project ]
│
├──● Makefile
│
├──┬[ build ]
│ │
│ ├───[ objects ]
│ └───[ apps ]
│
├──┬[ include ]
│ │
│ ├──● program.hpp
│ │
│ ├──┬[ module1 ]
│ │ │
│ │ ├──● mod1c1.hpp
│ │ └──● mod1c2.hpp
│ │
│ └──┬[ module2 ]
│ │
│ ├──● mod2c1.hpp
│ └──● mod2c2.hpp
│
└──┬[ src ]
│
├──● program.cpp
│
├──┬[ module1 ]
│ │
│ ├──● mod1c1.cpp
│ └──● mod1c2.cpp
│
└──┬[ module2 ]
│
├──● mod2c1.cpp
└──● mod2c2.cpp
Directory Purpose
Project / include Header files (*.hpp, *.h, *.hxx, *.h++)
Project / src Implementation files (*.cpp)
Project / build / objects Object files (*.o)
Project / build / apps Executables
The Makefile
The Makefile supports building of a single target application called
program which once built will be placed in the build/apps
directory. All associated objects will be placed in the build/objects
directory. The following is a listing of the Makefile in its entirety:
CXX := -c++
CXXFLAGS := -pedantic-errors -Wall -Wextra -Werror
LDFLAGS := -L/usr/lib -lstdc++ -lm
BUILD := ./build
OBJ_DIR := $(BUILD)/objects
APP_DIR := $(BUILD)/apps
TARGET := program
INCLUDE := -Iinclude/
SRC := \
$(wildcard src/module1/*.cpp) \
$(wildcard src/module2/*.cpp) \
$(wildcard src/*.cpp) \
OBJECTS := $(SRC:%.cpp=$(OBJ_DIR)/%.o)
DEPENDENCIES \
:= $(OBJECTS:.o=.d)
all: build $(APP_DIR)/$(TARGET)
$(OBJ_DIR)/%.o: %.cpp
@mkdir -p $(@D)
$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -MMD -o $@
$(APP_DIR)/$(TARGET): $(OBJECTS)
@mkdir -p $(@D)
$(CXX) $(CXXFLAGS) -o $(APP_DIR)/$(TARGET) $^ $(LDFLAGS)
-include $(DEPENDENCIES)
.PHONY: all build clean debug release info
build:
@mkdir -p $(APP_DIR)
@mkdir -p $(OBJ_DIR)
debug: CXXFLAGS += -DDEBUG -g
debug: all
release: CXXFLAGS += -O2
release: all
clean:
-@rm -rvf $(OBJ_DIR)/*
-@rm -rvf $(APP_DIR)/*
info:
@echo "[*] Application dir: ${APP_DIR} "
@echo "[*] Object dir: ${OBJ_DIR} "
@echo "[*] Sources: ${SRC} "
@echo "[*] Objects: ${OBJECTS} "
@echo "[*] Dependencies: ${DEPENDENCIES}"
The Makefile and a complete example including
source code and directory layout can be downloaded from:
HERE
Makefile Commands
The following commands can be used with this Makefile:
make all
make clean
make program
make build
make release
make debug
make info
Example Run
The following is the expected output when the command "make clean all"
is executed:
make clean all
rm -rf build/*
c++ -pedantic-errors -Wall -Wextra -Werror -Iinclude/ -o build/objects/src/program.o
-c src/program.cpp
c++ -pedantic-errors -Wall -Wextra -Werror -Iinclude/ -o build/objects/src/module1/mod1c1.o
-c src/module1/mod1c1.cpp
c++ -pedantic-errors -Wall -Wextra -Werror -Iinclude/ -o build/objects/src/module1/mod1c2.o
-c src/module1/mod1c2.cpp
c++ -pedantic-errors -Wall -Wextra -Werror -Iinclude/ -o build/objects/src/module2/mod2c1.o
-c src/module2/mod2c1.cpp
c++ -pedantic-errors -Wall -Wextra -Werror -Iinclude/ -o build/objects/src/module2/mod2c2.o
-c src/module2/mod2c2.cpp
c++ -pedantic-errors -Wall -Wextra -Werror -Iinclude/ -L/usr/lib -lstdc++ -lm
-o build/apps/program
build/objects/src/program.o
build/objects/src/module1/mod1c1.o
build/objects/src/module1/mod1c2.o
build/objects/src/module2/mod2c1.o
build/objects/src/module2/mod2c2.o
CMake Version
A CMake based build configuration of the above mentioned project structure can be found
HERE