Есть у меня репа в гите, там все мои домашние поделки на C++ в одном каталоге в своих подкаталогах. Раньше в корне валялся CMakeLists.txt, который включал поддиректории, в которых лежали сырцы каких-то либ со своими CMakeLists.txt и cmake-магия всё собирала и линковала.
Чё-то решил разобраться как работают Makefile чтобы познать минимализм и простоту, тем более что linux - это OS будущего и всё будет по его стандартам, поэтому на кросс-платформеность можно уже забивать болт, да и CMake меня всегда бесил сокрытием сущностей, хотелось буквально видеть что происходит.
И короче переписал всё руками на Makefile, познав красоту минимализма.
Вот есть у меня Makefile в каталоге library_src, рожающий либу /tmp/bububu/lib/lib.a если запустить:
make build=/tmp/zuzuzu/
Есть другой проект «program_src» со своим Makefile, собирающий бинарь /tmp/zuzuzu/bin/program, который статичеки хотел бы линковаться с вышеуказанной либой lib.a.
Щас я придумал себе некую переменную «корень сборки» - build и всё собираю так:
cd library_src; make build=/tmp/bububu all — собрал либу
cd program_src; make build=/tmp/bububu all — собрал бинарь; Makefile рассчитывает что он найдёт нужные либы по пути ${build}/lib.
В общем я опираюсь на то, что у меня ${build} имеет некую общепринятую (в моём мире) структуру каталогов (bin/ lib/ dep/) и все мои Makefile про неё знают, надо только запустить их в нужной последовательности с одним и тем же ${build} путём.
А как у нормальных людей такие зависимости рулятся? Говорят в мире C++ с зависимостями всё херово, но вот интересно что обычно делают в этих случаях. В сборках проектов я ваще не шарю, наверняка же уже придумали всё это ещё до CMake.