C ++ Single Makefile Несколько бинарных файлов - PullRequest
0 голосов
/ 30 января 2020

У меня есть проект со следующей структурой

Top Level Project Dir
        ->Other Source Code Folders
        ->Experiment Binaries
                  ->Experiment 1
                          -srcs.cpp
                          -main.cpp
                          -Makefile
                  ->Experiment 2
                          -srcs.cpp
                          -main.cpp
                          -Makefile

Этот проект состоит из нескольких экспериментов, которые компилируются в свои собственные двоичные файлы. Эти эксперименты состоят из источников из каталога верхнего уровня, а также из нескольких указанных c источников, расположенных в папке экспериментов. Название эксперимента уникально и соответствует имени папки. В настоящее время для того, чтобы сделать экспериментальный двоичный файл c, я перехожу в каталог expeirment и запускаю «Make». Эта структура, которую я использую, становится неуправляемой, так как я все больше и больше экспериментирую, поскольку все Make-файлы в основном одинаковы, и если я в конечном итоге изменяю некоторые зависимости в общем общем коде, тогда мне нужно обновить все Make-файлы. Я хочу объединить make-файлы в один, расположенный на уровне папки ExperimentBinaries. запуск "Make" сделает все эксперименты помещением объектов в соответствующую папку. и выполнение «Make Experiment1» сделало бы этот конкретный c эксперимент. Я не уверен, как сделать так, чтобы Makefile мог использовать несколько двоичных файлов.

Ответы [ 2 ]

1 голос
/ 30 января 2020

Вы можете сохранить свои Makefile-файлы Experiment и создать его в root Experiment Binaries, который будет вызывать все вспомогательные Make-файлы, используя флаг C.

make -C Experiment1
make -C Experiment2

Это будет запускать команду make с заданный путь.

Или, если вы хотите избавиться от своих вспомогательных Make-файлов, вы можете создать их на root с несколькими правилами. Каждое правило будет компилировать все файлы в данной папке эксперимента (вы можете использовать wildcard), а затем создавать все двоичные файлы.

0 голосов
/ 30 января 2020

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

# Get list of identically structured subdirectories
SUBDIRS:=$(ls)

# Directories have timestamps that subvert the behavior of make.
# So define a new "PHONY" name using a -make suffix.
MAKE_TARGETS=$(addsuffix -make,$(SUBDIRS))

# Top level default target.
all: $(MAKE_TARGETS)

# Each subdirectory target, assume an output "foo/a.out" for timestamp.
$(MAKE_TARGETS):  %-make:   %/a.out;
.PHONY: $(MAKE_TARGETS)

# Your actual rules, could also use wildcards.
$(addsuffix /a.out,$(SUBDIRS)): %/a.out
    #rule for building a.out from cpp files in $* subdirectory

# Other target suffixes can also be defined, like a "clean" target.
CLEAN_TARGETS=$(addsuffix -clean,$(SUBDIRS))
clean: $(CLEAN_TARGETS);
$(CLEAN_TARGETS): %-clean
    rm -rf $*/a.out $*/*.o       # customize, as needed
.PHONY: $(CLEAN_TARGETS)

help:
    echo "The following subdirectories build experiments: $(SUBDIR)"
    echo ""
    echo "The default target invokes corresponding make targets in each dir"
    echo "   'make'           #will build the targets in each subdir"
    echo "Or for a given folder, use the -make suffix for each folder. For example:"
    echo "   'make foo-make'  #will build the target for the 'foo' subdirectory"
    echo "Likewise: there is a clean target and clean suffix for each subdirectory"
    echo "   'make clean'     #for all subdirectories"
    echo "   'make foo-clean' #for just the 'foo' subdirectory"
...