LINUX.ORG.RU
ФорумTalks

За что так не любят cmake?

 


0

3

Почему-то всякое упоминание cmake притягивает толпу разъярённых людей. Чем он так плох? Чем его предлагаете заменить?

Я сложных проектов не писал, но чужие собирать и патчить доводилось. Самый низкий порог вхождения оказался у cmake и GNU make, прочие инструменты не осилил.

★★★★★

Вероятно, люди, столкнувшиеся впервые с ним в 2010-2012 году, не поняли юмора. И до сих пор, под грузом разочарования не ознакомились с best practices. CMake с тех пор достаточно изменился, приобрел достаточно продуманную концепцию, как надо делать на нем. К сожалению (или наоборот), оставив груз обратной совместимости.

Ну, он, конечно далеко не идеален, сильно заточен под запуск на host; кросс-компиляция под другую архитектуру там слегка через жопу.

Deleted
()

Сейчас новая мода - meson. Ничего про него не знаю, но скоро узнаю, так как Xorg на него переползает.

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

Норм у него с кроскомпиляцией, но слегка заморочиться с конфигом надо.

Jetty ★★★★★
()

Сталкивался с ним неск лет назад. Сплошной геморрой. Обычные мейкфайлы проще писать и отлаживать. Хотя для приложений, когда надо и под винду и под линух и под макось м быть и сойдёт.

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

На удивление точная аналогия

считай, что это системдэ в мире систем сборки

Ты так говоришь, как будто что-то плохое.

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

считай, что это системдэ в мире систем сборки

Systemd поглощает другие проекты и заставляет ставить весь комбайн. За это он не нравится мне. Что поглотил cmake?

Если использовать systemd в сочетании с непоглощёнными альтернативами, может не заработать ни то, ни другое. Cmake нормально интегрируется с другими инструментами. Есть контрпримеры?

Простой универсальный ответ на все вопросы нравится энтерпрайзу. Это главная причина ненависти? Чувство противоречия?

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

Обычные мейкфайлы проще писать и отлаживать.

это когда у тебя полтора файла в проекте. А если больше, все зависимости в виде сотен заголовочных файлов ручками будешь в свой мейкфайл писать?

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

Сталкивался с ним неск лет назад. Сплошной геморрой. Обычные мейкфайлы проще писать и отлаживать. Хотя для приложений, когда надо и под винду и под линух и под макось м быть и сойдёт.

Ну да. На мелкие программы под одну конфигурацию и мейка много. А cmake нужен только кроссплатформенным проектам.

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

А если больше, все зависимости в виде сотен заголовочных файлов ручками будешь в свой мейкфайл писать?

Как бы зависимости в configure.ac пишутся тащемта.

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

Лично мне намного проще и понятнее писать на (легко расширяемых) автотулзах, чем под cmake, который представляет собой кучу ad-hoc костылей, не образующих целостного инструмента.

Я свои pet projects пытался перевести на cmake в качестве эксперимента. Долго не вытерпел, перетащил обратно.

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

o_O Чем им родной imake не угодил?

Вау, с разморозкой! :) Они уже давно с imake перешли на GNU Autotools. Где-то в в версии 7.0.0. Это какой год был? 2005?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)

1)

target_link_libraries(app ${SOME_LIBS_VARIABLE} -lm -lpthreads)

Что будет, если SOME_LIBS_VARIABLE не будет существовать? CMake скажет, что ты обращаешься к несуществующей переменной? Ничего подобного. Молча прожует и ничего не скажет. Это нелогичное говно. По этой же причине я не люблю эти ваши баши и мейки.

2) Кэш.

$ cmake . -DSDL=yes && make
$ cmake . -DHEADLESS=yes && make

SDL включает требование библиотеки SDL2 для графики. HEADLESS переключает сборку либо только консольное без графики, либо что-то иное.

CMake за счёт кэша будет считать, что SDL должен равняться YES и даже во втором вызове. Это нелогичное говно.

3) Синтаксис

Вызов функции здорового человека:

f( x, y, z )

Вызов функции курильщиков из Kitware:

f(x y z)

Проблема-то в чём? Неизвестно как закончить выражение и опять же см. пункт №1. Для этого курильщики из Kitware предлагают в функции парсер аргументов и вызов будет выглядеть так f(ARG1 x ARG2 y ARG3 y).

4) Генераторы

Генерируют не многоразовые Makefile-ы и проектники. Я не могу настроить CI на регенерецаию проекта Visual Studio для инвалидов, которым CMake не нужен. Хотя раньше CMake так умел.

Написать свой генератор == форкнуть CMake. Нафиг не нужно.

5) Кросскомпиляция. Она сделана дерьмово, в лучших традициях Kitware.

6) Чтобы CMakeLists хотя бы немного не состоял из одних костылей под каждую платформу, мне пришлось написать собственную библиотеку. С этого момента я понял, что выбор CMake был ошибочным.

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

Ещё вспомнил. CMake имеет option(). Но получить списка возможных опций сборки невозможно, хотя там и описание даже есть. Хоть бери и делай.

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

2) Кэш.

+

Вызов функции курильщиков из Kitware:

+, бесящее легаси, оставленно для обратной совместимости с того времени, как кitware-овцы только учились писать язык

Генерируют не многоразовые Makefile-ы и проектники.

-, так и должно быть ящитаю. cmake запускается, генерит что нужно, затем запускается msbuild, или чего душе угодно. На винде вообще отлично: за неимением нормального шелла можно на встроенных операциях типа file-download, file-copy, file-install сделать то, что нужно, не привлекая кривой BAT.

5) Кросскомпиляция.

+

6) Чтобы CMakeLists хотя бы немного не состоял из одних костылей под каждую платформу, мне пришлось написать собственную библиотеку

+/-, это нормально, потому что проект нетривиален. Но было бы лучше, если бы было по-другому. Но это скорее уже от С зависит, его не так просто собрать кроссплатформенно.

CMake имеет option(). Но получить списка возможных опций сборки невозможно

+, бесящий косяк

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

нет, они там не пишутся, разве что внешние пакеты

А для заголовков есть -Wp,-MD, нахрена их ручками писать?

Stanson ★★★★★
()

Почему-то всякое упоминание cmake притягивает толпу разъярённых людей.

Неосиляторы, сэр.

Чем он так плох?

Глобально - ничем не плох. Некоторые проблемы у него есть, конечно. Но хороших аналогов практически и нет. Особенно в плане кросс-платформы.

DawnCaster ★★
()
Последнее исправление: DawnCaster (всего исправлений: 1)

А вообще, какую технологию\проект не возьмись обсуждать - всегда набегают толпы хейтеров. Это нормально.

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

это когда у тебя полтора файла в проекте. А если больше, все зависимости в виде сотен заголовочных файлов ручками будешь в свой мейкфайл писать?

Откуда вы лезете?

$(CC) -MD
kirk_johnson ★☆
()

Потому что cmake выглядит слишком сложным для простых проектов, когда Makefile укладывается в

CFLAGS  += -std=c11 -Wall -MD -D_GNU_SOURCE
LDLIBS   = -lev
PREFIX   = /usr/local
BINDIR   = $(PREFIX)/bin
MANDIR   = /usr/share/man
PROGRAM  = foobar

-include *.d

foobar:

install: $(PROGRAM)
        install -m0755 -D -t $(DESTDIR)$(BINDIR) $(PROGRAM)
        install -m0644 -D -t $(DESTDIR)$(MANDIR)/man5 $(PROGRAM).1

clean:
        rm -f *.d *.o $(PROGRAM)

.PHONY: install clean
kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 2)
Ответ на: комментарий от Deleted

Проектники это самая малая проблема. Но даже еслт меня не устраивают генераторы, я не могу их сконфигурировать или написать свои.

a1batross ★★★★★
()
"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
RazrFalcon ★★★★★
()
Ответ на: комментарий от kirk_johnson

Для простых проектов CMake слишком сложный, для сложных проектов CMake слишком тупой.

a1batross ★★★★★
()

Ещё один большой минус CMake — в нем сложно делать не связанные с компиляцией таргеты. ISO образы там собирать, или какие-нибудь usbstick'и. То есть можно, конечно, но это скорее всего выйдет сложнее, чем на Make.

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

Не тому ответил.

Я костылями KDE и вдохновлялся когда выбирал систему сборки. А когда оказалось что комбайн не такой уж и комбайн...

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

Зачем все это, если для каждого myprog.c уже есть 'make myprog'.

Я забыл в зависимости ещё пару файлов добавить :))

А удалять мусор надо 'git clean'

А если ты выложил сорцы тарболом, то что делать?

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

Их видно в cmake gui и адекватных ide.

Раньше, ещё был wizard mode с tui, по опции -i в терминале. Но его убрали, т.к. проще погрепать/открыть в любимом редакторе CMakeCache.txt :)

Но ты прав, отличить опции от других переменных в кэше в терминале видимо никак, разве что по стилю имён:

cmake -LH

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

То есть можно, конечно, но это скорее всего выйдет сложнее, чем на Make.

С CMake возможно отказаться от GNU Make на той-же венде. А не связанные с компиляцией таргеты давно и отлично добавляются через add_custom_target. Причём для разных платформ можно делать разные таргеты использующие разные инструменты, в отличии от того-же Make

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

С CMake возможно отказаться от GNU Make на той-же венде. А не связанные с компиляцией таргеты давно и отлично добавляются через add_custom_target. Причём для разных платформ можно делать разные таргеты использующие разные инструменты, в отличии от того-же Make

Суть в том, что все это имеет смысл, если ты пишешь софт в том числе для не-POSIX совместимых систем. А если не пишешь, то не имеет.

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

А как же то, что кроссплатформенность это хорошо? Или работает только в одну сторону - если разработчик виндовый, ему говорим «атата, кроссплатформенность!», а если под линух: «фуу, ты еще и винду поддерживаешь»

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

Не тому ответил.

Упс. Бывает.

Ну, я с Cmake'ом тоже по полной программе огрёб проблем за последние лет 5, когда начал его использовать. Но в целом, он мне куда больше понравился чем все остальные существующие инструменты - с ними проблем было куда больше. Особенно, в плане кросс-платформы.

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

А как же то, что кроссплатформенность это хорошо? Или работает только в одну сторону - если разработчик виндовый, ему говорим «атата, кроссплатформенность!», а если под линух: «фуу, ты еще и винду поддерживаешь»

Не знаю, чего вы там кому говорите, но вот какой-нибудь терминал, демон BGP или irssi мне на венде особо не нужны. И, поэтому, cmake там тоже особо не нужен.

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

Суть в том, что все это имеет смысл, если ты пишешь софт в том числе для не-POSIX совместимых систем. А если не пишешь, то не имеет.

В целом, так, да. Но сложное прикладное ПО имеет особенность становиться кросс-платформенным со временем.

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

А если ты выложил сорцы тарболом, то что делать?

:) вкладывать в тарбол .gitignore

Мне кстати нравится мейк, если что. Он лаконичен для небольших кейзов, например, для хранилища dotfiles, да и просто это очень крутая вещь-помощник; с эдакой декларативностью, из коробки работающая.

Топик же про то, что не нравится в cmake, а не про makefiles :)

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

вот какой-нибудь терминал, демон BGP или irssi мне на венде особо не нужны. И, поэтому, cmake там тоже особо не нужен.

Так они вроде и не на cmake. Или уже перешли? Я бы хотел послушать причины перехода, если такие были, для этих проектов

Deleted
()

О, тут про опции всплыло. Вот за что не люблю cmake, в нем нет интеграции kconfig-стайл конфигуратора! Вот это печаль :)

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

в маздае автотулзы работают так себе. плюс автотулзы в чистом виде, без всяких там sed'ов и прочих полезных никсовых утилит - это весьма уныло. впрочем, это проблемы маздая, а не автотулзов.

что касается cmake - он какой-то костыльный, некоторые вещи там делаются через анус. меня лично там раздражала привязка к каталогу проекта. типа, снаружи ничего нет, кроме стандартных путей поиска. потом они-таки впилили внешние линки, но через одно место: специальным переключателем «относительные/полные пути», приделанным вообще сбоку.

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

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

так как Xorg на него переползает

плохая идея. впрочем, сейчас много чего дурного тащат в прод.

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

Мне после CMake понравился waf. За то что из него можно сделать что угодно и при этом ему не кроме стандартного Python даже второй версии ничего не нужно. Никаких pip install yourbunnywrote, просто Python.

И ещё, что он не имеет отношения к Make.

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