#компилятор g++ по умолчанию CXX
#имя исполняемого файла берем от имени директории
FNAME= $(shell basename `pwd`)
#имя отладочного исполняемого файла
FNAME_DBG= $(FNAME)_dbg
#директории проекта
VPATH= src #имена новых директорий с кодом добавляем сюда
#пути включения заголовочных файлов
CPATH= $(addprefix -I, $(VPATH) .)
#подключаемые библиотеки
LIB= -lrt -lz -lm #добавил только для примера
#директория статических библиотек
LPATH= -L./lib
#файлы кода
OBJFILE= $(notdir $(patsubst %.cpp, %.o, $(wildcard $(addsuffix /*cpp, $(VPATH)))))
#директории для объектных файлов
R_DIR= bin/release/
D_DIR= bin/debug/
#файлы для линковки
R_FILE= $(addprefix $(R_DIR), $(OBJFILE))
D_FILE= $(addprefix $(D_DIR), $(OBJFILE))
#имя выходного файла
TARGET=$< -o $@
all: $(FNAME)
all: CFLAGS= -c -MMD -Wall -std=c++11
$(FNAME): $(R_FILE)
$(CXX) -o $@ $(LPATH) $(R_FILE) $(LIB)
$(R_DIR)%.o: %.cpp
$(CXX) $(CFLAGS) $(CPATH) $(TARGET)
# ----------------------------------------------------------------------------------------------------
dbg: $(FNAME_DBG)
dbg: CFLAGS= -c -O0 -g -MD -Weffc++ -std=c++11 -DGLM_FORCE_RADIANS
$(FNAME_DBG): $(D_FILE)
$(CXX) -Wl,--no-as-needed -o $@ $(LPATH) $(D_FILE) $(LIB)
$(D_DIR)%.o: %.cpp
$(CXX) $(CFLAGS) $(CPATH) $(TARGET)
# -----------------------------------------------------------------------------------------------------
#загружаем файлы с зависимостями
include $(wildcard $(R_DIR)*.d)
include $(wildcard $(D_DIR)*.d)
.PHONY: all dbg clean
# -----------------------------------------------------------------------------------------------------
clean:
rm -rf $(R_DIR)*.o $(R_DIR)*.d $(D_DIR)*.o $(D_DIR)*.d $(FNAME) $(FNAME_DBG)
При удалении файлов из проекта нужно пересобрать проект целиком.
Если кому то интересно могу расписать подробней.