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/module3/*.cpp) \ $(wildcard src/*.cpp) \ OBJECTS := $(SRC:%.cpp=$(OBJ_DIR)/%.o) all: build $(APP_DIR)/$(TARGET) $(OBJ_DIR)/%.o: %.cpp @mkdir -p $(@D) $(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o $@ $(LDFLAGS) $(APP_DIR)/$(TARGET): $(OBJECTS) @mkdir -p $(@D) $(CXX) $(CXXFLAGS) -o $(APP_DIR)/$(TARGET) $^ $(LDFLAGS) .PHONY: all build clean debug release 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)/*

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

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