Ваша схема макета c показывает make-файл для каждого упражнения, а также make-файл верхнего уровня, о котором вы, кажется, действительно спрашиваете. Было бы лучше, если бы make-файл верхнего уровня избегал дублирования поведения make-файлов для каждого упражнения, так как такое дублирование создало бы для вас дополнительную нагрузку на обслуживание. Кроме того, вероятно, что вы в конечном итоге перейдете к упражнениям с несколькими исходными файлами и, возможно, к тем, у которых есть несколько артефактов, которые нужно создать. Это еще одна причина для того, чтобы каждый make-файл для каждого упражнения содержал все необходимое для создания упражнения, с которым он связан (в каталоге + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1001 *
Следуя этой схеме, make-файл верхнего уровня оставит четко определенную роль: выполнять сборки для каждого упражнения (путем рекурсивного запуска make
) и копировать полученные двоичные файлы в bin/
. Это не единственный способ настроить систему взаимодействующих make-файлов, но он довольно прост и позволит вам сосредоточиться на упражнениях, а не на системе сборки.
Итак, давайте предположим, что каждое отдельное упражнение можно создать, перейдя в его каталог и запустив make
, в результате чего будет исполняемый файл в том же каталоге с тем же именем, что и каталог. То есть из каталога верхнего уровня выполнение cd src/prog2; make
приведет к созданию желаемого исполняемого файла как src/prog2/prog2
. В этом случае для make-файла верхнего уровня требуется немного больше, чем имена всех упражнений и пара правил:
EXERCISES = prog1 prog2 prog3
BINARIES = $(EXERCISES:%=bin/%)
all: $(BINARIES)
$(BINARIES):
make -C src/$$(basename $@)
cp src/$$(basename $@)/$$(basename $@) $@
Примечание: в нем используется особенность c для GNU. реализация make
для вычисления имен требуемых двоичных файлов из имен упражнений. Я считаю это приемлемым, поскольку вы отметили [gnu-make], но в любом случае это удобная функция, а не необходимость.