Я видел следующую технику, используемую для автоматической компиляции всех файлов C (или C ++, или, я полагаю, любого расширения) в определенном каталоге.
SOURCE_DIRS = .
SOURCES := $(subst ./,,$(wildcard $(SOURCE_DIRS:=/*.cpp)))
HEADERS := $(subst ./,,$(wildcard $(SOURCE_DIRS:=/*.h)))
OBJECTS := $(addprefix build/,$(SOURCES:.cpp=.o))
CXX = g++
CXXFLAGS = -Wall -pedantic -g
#LDFLAGS =
all: build/exe_name
build/exe_name: $(OBJECTS)
$(CXX) -o $@ $(OBJECTS) $(LDFLAGS)
build/%.o: %.cpp $(HEADERS) Makefile
mkdir -p $(dir $@)
$(CXX) -o $@ $(CXXFLAGS) -c $<
Единственная проблема заключается в том, чтоон строит все файлы в той же структуре, что и в исходном каталоге.Так что, если у вас есть подпапка с кодом в ней, то сборка будет иметь соответствующую подпапку.
Итак, как я могу изменить это (или что еще можно сделать), чтобы получить весь выводцели, которые нужно поместить непосредственно в каталог build /, а не в иерархию, которая соответствует исходному каталогу?
Я думал о попытке удалить любые каталоги, которые могут быть представлены в «%», когда он используетсяв цель, но я не могу найти хорошие команды для этого.Кроме того, кажется немного проблематичным попытаться изменить путь OBJECTS при его создании, поскольку я понятия не имею, как переменная '%' читает его, за исключением того, что он волшебным образом компилирует все в списке OBJECTS.
Спасибо за любую помощь, которую вы можете оказать.