Зачем же себе усложнять жизнь ненужными кастомизациями?
В том Makefile который я привёл в той статье обрати внимание на строки
SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:%.cpp=%.o)
Первая складывает в переменную SOURCES список всех файлов удовлетворяющих маске.
Вторая делает строковую замену .cpp на .o у всех элементов в переменной SOURCES и складывает значения в переменную OBJECTS
Немного проявив изобретательность можно поменять эти строки на
SOURCES=$(wildcard src/*.cpp)
OBJECTS=$(SOURCES:src%.cpp=obj%.o)
Но тут вылезет маленькая проблема. Строка в Makefile из моей статьи
$(OBJECTS): $(SOURCES)
использует предопределённое неявное правило (
см. здесь)
%.o: %.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
которое предпологает, что объектные файлы нужно создавать там же где лежат исходники.
Чтобы та волшебная строчка заработала нужно написать неявное правило, которое будет генерировать цели для создания объектных файлов в каталоге obj из исходников в каталоге src (как сделать
см. здесь). Оно будет следующим:
obj/%.o: src/%.cpp
$(CXX) -c $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
Теперь собираем всю информацию воедино и делаем украшательства:
BINDIR=bin
OBJDIR=obj
SRCDIR=src
TARGET=$(BINDIR)/$(shell basename `pwd`)
SOURCES=$(wildcard $(SRCDIR)/*.cpp)
OBJECTS=$(SOURCES:$(SRCDIR)%.cpp=$(OBJDIR)%.o)
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
$(CXX) -c $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
all: $(TARGET)
$(OBJECTS): $(SOURCES)
$(TARGET): $(OBJECTS)
$(CXX) -o $(TARGET) $(LDFLAGS) $(OBJECTS) $(LOADLIBES) $(LDLIBS)
clean:
$(RM) $(TARGET) $(OBJECTS)
.PHONY: all clean