LINUX.ORG.RU

Makefile и сборка зависимых библиотек.

 


0

1

Есть у меня репа в гите, там все мои домашние поделки на 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.

Можно продолжать так и делать. Из альтернатив либо явно зависимости указывать, либо генерировать что-то для включения библиотек в другие проекты (через тот же include в Makefile, но его местоположение опять надо как-то задать).

xaizek ★★★★★ ()

Нормальные люди переходят с make на cmake, а не наоборот, и стремятся к кросс-платформенности, а не отказываются он неё. Ставлю на то что ты своими костылями даже между разными линуксами потерял переносимость.

А так-то у нормальных людей build не указывается руками, а находится там где запустили make. Наоборот, через -C указывается где находится то что ему собирать. Или не указывается, тогда сборка идёт прямо в дереве исходников. А модули ищутся там где они лежат, т.е. исходники и инклуды в mymodule/*.[ch] компилятся в mymodule/libmymodule.so, а их потребителям передаётся -Imymodule/-Lmymodule. А именно зависимости берутся из системы, а не добавляются в проект.

slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от slovazap

Нормальные люди переходят с make на cmake, а не наоборот

Нормальные люди придерживаются той системы сборки, которая им понятна! А cmake - это текущие «понты», на ровне с rust.

zvezdochiot

anonymous ()

Молодец, теперь переписывай обратно на CMake или Meson. Первый хоть и та ещё дичь, но неписанный стандарт.

А как у нормальных людей такие зависимости рулятся?

С помощью CMake или Meson.

P.S. И в качестве генератора у CMake лучше использовать Ninja, а не Makefiles. Первый хотя бы собирает быстрее.

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

теперь переписывай обратно

Ну ты же сам понимаешь, что тебя ТС не то что слушать, даже читать не станет. :)

zvezdochiot

anonymous ()
Ответ на: комментарий от anonymous

Нормальные люди придерживаются той системы сборки, которая им понятна!

Вообще-то, суть разработки - писать вещи понятные людям. Не машине и тем более не только себе.

А cmake - это текущие «понты», на ровне с rust.

Вообще-то, cmake уже давно стандарт де-факто. Rust - просто набирающий обороты язык.

Кидаться тут такими словами как «понты» и отстаивать с восклицательными знаками своё право писать говно на говне может только незрелый ребёнок с реальной разработкой не сталкивавшийся.

slovazap ★★★★★ ()
Ответ на: комментарий от slovazap

Кидаться тут такими словами как «понты» и отстаивать с восклицательными знаками своё право писать говно на говне может только незрелый ребёнок с реальной разработкой не сталкивавшийся.

4.2+5.2 (www.linux.org.ru/help/rules.md)

суть разработки - писать вещи понятные людям.

Правда? Никогда бы не подумал. :)

cmake уже давно стандарт де-факто

Помолимся, братья. :)

Лол.

zvezdochiot

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.