Могу ли я иметь один make-файл для построения иерархического проекта? - PullRequest
0 голосов
/ 17 марта 2010

У меня есть несколько сотен файлов в неплоской структуре каталогов. Мой Makefile перечисляет каждый исходный файл, который, учитывая размер проекта и тот факт, что в проекте участвуют несколько разработчиков, может вызывать раздражение, когда мы забываем вставить новый или удалить старые. Я хотел бы обобщить мой Makefile, чтобы make мог просто создавать все файлы .cpp и .h без необходимости указывать все имена файлов, учитывая некоторые общие правила для разных типов файлов.

Мой вопрос: учитывая большое количество файлов в каталоге с большим количеством подпапок, как мне сказать make, чтобы собрать их все без необходимости указывать каждую подпапку как часть пути? И как мне сделать так, чтобы я мог сделать это только с одним Makefile в корневом каталоге?

РЕДАКТИРОВАТЬ: это почти отвечает на мой вопрос, но требует, чтобы вы указали все имена файлов: \

Ответы [ 4 ]

1 голос
/ 08 апреля 2010

Один из способов, который не зависит от платформы (я имею в виду независимость от оболочки в Windows или Linux), таков:

DIRS = relative/path1\
       relative/path2

dd = absolute/path/to/subdirectories
all:
@$(foreach dir, $(DIRS), $(MAKE) -C $(dd)$(dir) build -f ../../Makefile ;)
build:
     ... build here

обратите внимание, что здесь важны пробелы, а также точка с запятой, также важно указать абсолютные пути, а также указать в конце путь к соответствующему Makefile (в этом случае я использую только один Makefile в папке grandparent)

Но есть и лучший подход, включающий цели PHONY, он лучше отображает ход выполнения и ошибки и останавливает сборку, если в одной папке возникла проблема, вместо перехода к другим целям:

.PHONY: subdirs $(DIRS)

subdirs: $(DIRS)

$(DIRS):
    $(MAKE) -C $@ build -f ../../Makefile
all : prepare subdirs
...
build :
... build here

Опять же, здесь я использую только один Makefile, который должен быть применим ко всем подпроектам. Для каждого подпроекта в папке grandchild целевая «сборка» создается с использованием одного Makefile в корне.

1 голос
/ 18 марта 2010

Я уверен, что решение чисто gmake возможно, но использование внешней команды для изменения make-файла или генерации внешней (которую вы include в своем make-файле), вероятно, намного проще.

Что-то вроде:

all: myprog

find_sources:
    zsh -c 'for x in **/*.cpp; echo "myprog: ${x/.cpp/.o}" >> deps.mk'

include deps.mk

и запустить

make find_sources && make

примечание: точная строка zsh, вероятно, нуждается в экранировании для работы в файле make, например, $$ вместо $. Его также можно заменить на bash + find.

0 голосов
/ 17 марта 2010

У меня два мнения на этот счет. С одной стороны, если ваша система Make компилирует и связывает все, что находит, вы спешите узнать, не оставил ли кто-нибудь конфликтующий мусор в исходных каталогах. С другой стороны, неконфликтный мусор будет размножаться, и у вас не будет простого способа отличить его от живого кода ...

Я думаю, что это зависит от многих вещей, специфичных для вашего магазина, таких как система управления исходным кодом и от того, планируете ли вы когда-либо иметь другой проект с перекрывающейся базой кода. Тем не менее, если вы действительно хотите скомпилировать каждый исходный файл ниже заданного каталога и затем связать их все, я бы предложил простую рекурсию: для создания объектов, компиляции всех исходных файлов здесь, добавления результирующих объектов с полными путями) к списку в верхнем исходном каталоге, вернитесь во все каталоги здесь. Для ссылки используйте список.

0 голосов
/ 17 марта 2010

Я бы начал с использования комбинации символов подстановки: http://www.gnu.org/software/make/manual/make.html#Wildcard-Function

VPATH / VPATH http://www.gnu.org/software/make/manual/make.html#Selective-Search

и функции файла http://www.gnu.org/software/make/manual/make.html#File-Name-Functions

Для исключения (например, для резервных копий, как упоминал Джонатан Леффлер), используйте отдельную папку, которая не находится в vpath для резервных копий, и используйте хорошие неявные правила.

Вам все равно нужно будет определить, какие папки делать, но не каждый файл в них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...