Хорошо, вот что я делаю:
Я использую один Makefile в корневом каталоге и шаблоны подстановочных знаков для сбора всех файлов в каталоге. Обратите внимание, что я предполагаю, что foo / *. C будет составлять, например, foo.so. Это делает обслуживание Makefile минимальным, поскольку простое добавление файла в каталог автоматически добавляет его в сборку.
Поскольку это make, который вы используете, я предполагаю (я делаю это для моих проектов), что используется компилятор, использующий синтаксис командной строки, совместимый с gcc (cc). Так что MSC вышел из строя; но не расстраивайтесь, я делаю большую часть своей разработки (к сожалению) для Windows и использую MinGW с MSys; работает как шарм. Создает собственные двоичные файлы, но был собран с помощью среды сборки, совместимой с Posix.
Проверка зависимостей выполняется с помощью стандартного переключателя -MD
. Затем я включаю все файлы * .d в Makefile. Я строю шаблоны из автоматически собранных исходных файлов.
Наконец, модульные тесты реализованы с «стандартной» целью check
. Цель проверки похожа на цель цели, за исключением того, что она зависит от модульного теста и выполняется после того, как все построено. Я делаю это так, чтобы вы могли раздельно построить проект или построить модульные тесты (и остальную часть проекта). Когда я не занимаюсь разработкой проекта, я хочу просто создать его и покончить с ним.
Вот пример того, как я это делаю: https://github.com/rioki/c9y/blob/master/Makefile
У него также есть цели install
, uninstall
и dist
.
Как вы можете видеть, все делается просто, никаких рекурсивных вызовов и все относительно просто. Я использовал automake и autoconf, и я никогда не буду делать это снова; о других инструментах сборки не может быть и речи, если мне нужно установить foojam или barmake для сборки чего-либо, я обычно немедленно отказываюсь от этого проекта.