Автоматически создавать файлы с помощью утилиты Gnu Make с другой структурой сборки, чем у исходного - PullRequest
2 голосов
/ 29 июля 2011

Я видел следующую технику, используемую для автоматической компиляции всех файлов 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.

Спасибо за любую помощь, которую вы можете оказать.

Ответы [ 2 ]

3 голосов
/ 29 июля 2011

По порядку,

  1. Я не понимаю, как это может работать, как есть.Ваш метод подстановочных знаков не будет входить в подпапки исходной папки, а правило% .o не будет работать ни в каком случае, кроме `SOURCE_DIRS = .`.
  2. Ваше правило% .o не совсем корректно.Если вы измените один заголовок, Make перестроит все объектные файлы.
  3. Включение каждого источника, который можно найти в ваш исполняемый файл, вероятно, нецелесообразно.В этой схеме трудно иметь более одного исполняемого файла с общим кодом.
  4. Чтобы преодолеть проблемы 1) и написать make-файл, который я мог протестировать, мне пришлось бы связываться с «find», который я ненавижу, так что следующее не проверено.
  5. Я думаю, что это будет сделано (в GNUMake):
SOURCES := whatever...
vpath %.cpp $(dir $(SOURCES))
SOURCES := $(notdir $(SOURCES))
0 голосов
/ 30 июля 2011

Самым простым (хотя и не строго сделанным) способом было бы использовать automake и не устанавливать опцию subdir-options.

...