LINUX.ORG.RU

Системы сборки


2

4

Кто чем пользуется? Пробывал cmake. По ощущениям громозкое говно мамонта. Например, убрать таргет releaseminsize можно только после второго прохода. Плюс надо помнить ключи компилятора, вместо того что бы писать человеческим языком. Нельзя сделать сразу проект под несколько платформ (64 и 32 бита). Хотя может я неасилятор, кто подскажет, скажу спасибо.

Порадовал premake. Вполне устроило, только разработка походу сдохла. Один человек-проект, сил у него не безгранично.

Что есть в мире еще чтоб генерило проект для VS под виндой, Xcode под макосью и gmake под никсом?

Ответ на: комментарий от annulen

Пользователей не так уж мало, просто они в основном сидят тихо и пилят свои корпоративные форки :)

Ну будут и дальше пилить судя по количеству открытых pull-request'ов.

ebantrop
() автор топика
Ответ на: комментарий от annulen

О! Живой контрибьютер premake'а. Скажи мне, почему поддержка Qt в premake добавлялась изменением в коде приложения, а не в скрптоте? Неужели там так грустно с расширяемостью?

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

например, в /src все исходники, в /include все заголовки, хочу бинарники складывать в /bin (возможно отделив debug от release).

Я почти такую схему использую.

как указать тупо чтобы жрал весь каталог рекурсивно, и сам разбирался что с чем линковать - я не понял, как это сделать с cmake. наверное, никак.

Так делать не надо. Случайно положишь какой-нибудь 1.c во вложенную поддиректорию и испортишь сборку, а потом часы потратишь на поиск проблем. Лучше явно указывать файлы.

Хотя способ засасывания всех файлов рекурсивно в cmake есть. А линковки через libastral с нужными библиотеками, естественно, нет.

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

А где, кстати, благородные доны хранят результаты кодогенерации? Не могу что-то придумать идеального способа.

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

А где ещё и в каких случаях? Не в ${CMAKE_CURRENT_SOURCE_DIR} же их хранить, всё его содержимое - в VCS, а сгенерированным файлам там не место.

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

Скажите к какому выводу вы здесь пришли?

Выводов несколько. Во-первых CMake'ом тоже можно пользоваться. Спасибо Reset'у за разъяснения. Да, конечно CMakeLists.txt выглядит жутковато, но есть много проектов на нем и всегда можно непонятное посмотреть.

Во-вторых, у premake и CMake, как мне кажется, более правильный подход по сравнению с qbs, scons и пр. В том смысле что люди не делают замену обычному мейку, а прикручивают к нему простой интерфейс.

Субъективно мне premake нравится больше. Пока посижу на обоих.

ebantrop
() автор топика
Ответ на: комментарий от KblCb

К тому что жизнь — говно. Как обычно.

Жизнь прекрасна и удивительна. Почему же говно обычно?

ebantrop
() автор топика

Самая гибкая система сборки - та, у которой конфиг является программой на каком-либо скриптовом языке, ибо в этом случае можно реализовать сборку с абсолютно любой логикой. Примером реализации такого подхода является SCons (там используется Python) - его я и выбрал для всех своих проектов и пока не пожалел ни разу.

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

Да-да. Щаз. Если конфигурация системы хоть немного отличается от той на которой сидит девелопер, то начинается реальный бред. Именно поэтому вместо того чтобы использовать CMake findXXX ребята из Kitware тупо кладут все third-party исходники в дерево VTK с соответствующими CMakeLists для них.

Не знаю что такое kitware и vtk, но знаю что во-первых, всегда найдется идиот, который будет использовать самую замечательную технологию через жопу, и во-вторых, что есть библиотеки которые просто нельзя использовать как внешние зависимости, обычно потому что их пишут, опять таки, идиоты, кладущие болт на совместимость. Прежде чем гнать на cmake, удостоверьтесь что в ваш - это не один из означенных случаев.

В тоже время мне часто приходится собирать софт с большим списком зависимостей под разные системы, от линуксов и BSD до мобильников, и только, я подчёркиваю - ТОЛЬКО cmake способен без модификаций, костылей и кучи условий под каждую платформу все их найти и собрать приложение из коробки.

Раскажи это программерам с гугла, которые андроид со всеми библиотеками и програмами собирают с помощью make.

У андроида по определению нет внешних библиотек. И, опять таки, то что кто-то где-то что-то собирает не с помощью cmake - ни разу не аргумент против последнего.

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

Самая гибкая система сборки - та, у которой конфиг является программой на каком-либо скриптовом языке, ибо в этом случае можно реализовать сборку с абсолютно любой логикой.

Чистая правда. Можно сразу взять и написать систему сборки с нуля - будет гибко что хоть тресни. SCons, кстати, так и делает - я бы даже системой сборки его не назвал - скорее, фреймворком для написания системы сборки на питоне. В итоге всё приходится писать руками, в этот убогий фреймворк только путается под ногами. Главное, никакой автоматизации и абстракции от платформы он не предоставляет и любой более-менее сложный SConstruct/cript сосотоит из проверок на разные системы чуть более чем полность.

Вот, для примера - полюбуйтесь: https://github.com/yazug/gpsd/blob/master/SConstruct

В общем после SCons CMake был как глоток чистого воздуха - это действительно система сборки, которая всё делает за тебя, как и должна.

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

Самая гибкая система сборки - та, у которой конфиг является программой на каком-либо скриптовом языке

Даром не нужна такая гибкость.

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

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

У андроида по определению нет внешних библиотек. И, опять таки, то что кто-то где-то что-то собирает не с помощью cmake - ни разу не аргумент против последнего.

И наоборот, если что-то собирается с CMake, то это не разу не аргумент, что все там удобно.

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

Не знаю что такое kitware и vtk

Kitware - это контора, которая CMake пилит, в частности, для сборки VTK.

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

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

Я правильно понимаю что в kitware сидят идиоты и пилят VTK и CMake? А еще эти идиоты включили сорсы других идиотов включая TclTk, hdf5, png, tiff и тд до zlib. Вот http://vtk.org/gitweb полюбуйтесь на придурков.

ebantrop
() автор топика
Ответ на: комментарий от illy

Самая гибкая система сборки - та, у которой конфиг является программой на каком-либо скриптовом языке...

Ну кому-то Python нравится, а кто и bash+gmake предпочитает. Вопрос не в том что это можно сделать, а насколько легко.

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

Аналогов cmake для С++ нет, всё остальное - убогое говно.

fix

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

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

Кстати да, «декларативные зависимости» это ж самый смак.

ebantrop
() автор топика

Всем спасибо. Если кому интересно, после двух дней игрищ с параллельными CMake/premake остановился пока на premake. Он легкий, шустрый и правится/расширяется очень просто. Единственное я так и не понял кому слать патчи. Ау, annulen!

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

А искать всякие хитрые библиотеки, разработчики которых не додумались включить rc-файл, premake умеет?

Образец рабочего кода для premake кинуть можешь?

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

А искать всякие хитрые библиотеки, разработчики которых не додумались включить rc-файл, premake умеет?

Я, честно говоря, не знаю что такое rc-файл. А что конкретно ты имеешь ввиду под словом искать? Посмотреть есть ли *.h *.so там или там?

Как я понял искать в смысле CMake он не умеет. По крайней мере 4.х. В пятой вроде как научат. Ну или сделают общую обертку для поисковых скриптов.

Сейчас научить не проблема. Думаю будет полный кошерный супер-пупер кросс-платформенный поиск чего-либо выглядеть примерно одинаково что в CMake что в premake, например:

https://github.com/Itseez/opencv/blob/master/cmake/OpenCVFindIPP.cmake

Образец рабочего кода для premake кинуть можешь?

Завтра с работы скину свой велосипедный поиск IPP, если интересно.

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

Я, честно говоря, не знаю что такое rc-файл

Тьфу, извиняюсь: очепятался. pc-файл, для pkg-config'а.

А что конкретно ты имеешь ввиду под словом искать?

Вернуть нужные CFLAGS и LIBS, например — чтобы скомпилировать получилось.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от AF

мало того что можно, но и вообще есть готовые плагины для вызова сишечного компилятора.

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

да, там можно например тупо cmd-команду забить (есть plugins вроде)... по типу gcc blah.c -o blah, наверное... но тогда обо всех плюсах можно забить.

какбэ команда может быть либо задана через проперти (типа -Dcompiler=gcc), либо через профили, которые в свою очередь могут активироваться, к примеру, типом ОС. т.е. мавен сам выберет, вызывать gcc или cl в зависимости от используемой ОС, но для этого надо все это сначала один раз написать в pom-файл (который потом можно инклюдить в нужные тебе проекты).

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

files { «*.c» }

Мне кажется, что так делать не есть хорошо. Лучше перечислять файлы для избежания ошибок.

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

Мне кажется, что так делать не есть хорошо. Лучше перечислять файлы для избежания ошибок.

Почему? Каких ошибок можно избежать?

ebantrop
() автор топика
Ответ на: комментарий от Zodd

Ну может быть. Хотя это мне кажется довольно надуманной проблемой, поскольку git status все расскажет. Если нет, то git clean спасет точно.

ebantrop
() автор топика
Ответ на: комментарий от KblCb

Скажи мне, почему поддержка Qt в premake добавлялась изменением в коде приложения, а не в скрптоте?

Не все удалось вынести в скриптоту, так как у сборки Qt-приложений очень много особенностей, тем не менее, в код системы сборки не добавлялись никакие Qt-специфичные костыли. В premake 5 изменения не понадобятся.

Кстати, сам premake - то же по сути «скриптота» :)

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

Офигеть, у premake'a нет мультипроцессорной компиляции на релиза в VS.

Емнип, эта возможность есть не у всех версий. В любом случае, можно указывать свои buildoptions.

Куда патч слать?

https://bitbucket.org/premake/premake-dev/pull-requests

На стабильную ветку (4.4):

https://bitbucket.org/premake/premake-stable/pull-requests

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

Я по будням редко читаю ЛОР, так как сильно отвлекает от работы :)

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

Будем ждать premake 5. Очень рассчитываю что получится что-то годное. В принципе меня бы и cmake устроил если бы не ужасный язык, которым он оперирует.

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

Клево. Спасибо.

Емнип, эта возможность есть не у всех версий. В любом случае, можно указывать свои buildoptions.

Если линк не инкрементальный, как по умолчанию в релизе, компиляцию можно смело параллелить.

Еще мне например не нравится то что если в solution указать location, потом include директорию с проектом без location, то пути не будут относительно solution. Я только не знаю это баг или фича?

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

Еще мне например не нравится то что если в solution указать location, потом include директорию с проектом без location, то пути не будут относительно solution.

location отвечает только за каталог, в котором генерятся проект/мейкфайл, а пути задаются относительно premake4.lua

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

Наверно я плохо объяснил. Вот есть ./premake4.lua в нем я объявляю solution и говорю location «build», потом include «src». Есть ./src/premake4.lua, в котором project «foo» и все описание для foo. В результате получится ./build и ./src/build. Так вот последнего мне не надо. Решений тут несколько: либо в ./src/premake4.lua Сказать location "../build", либо руками прибить к абсолютному пути с solution. Я предлагаю запилить в ядро условие если в project нет location, то класть в тот location, что будет у solution.

Вопрос: это баг или фича, и куда сабмиттить в 4.4 или 5?

ebantrop
() автор топика
Ответ на: комментарий от illy

За Сконс надо жесточайше карать.

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

см src/actions/make/make_cpp.lua

в src/host/os_getversion.c просто косметика

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