LINUX.ORG.RU

Почему в cmake всё так сложно?

 


2

3

внутри обычного Makefile я могу просто написать

cc -std=c99 file.c -o program -lasound
либо
cc -std=c99 file.c -o program `pkg-config --libs alsa`


что нужно сделать в таком случае для cmake?

текущее содержимое CMakeLists.txt
cmake_minimum_required(VERSION 3.2)
project(program C)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")

set(SOURCE_FILES
    file.c)

add_executable(program ${SOURCE_FILES})

Возникает желание выбросить на помойку этот cmake... документация в стиле «хрен поймешь без бутылки», вот так сразу ее не взять чтобы «прочитал -> сразу понял -> используешь». Туториалы не объясняют что к чему.

ЛОР, помоги.


З.Ы. program и file.c - нарочно измененные имена. Добавление -lasound после -std=c99 не приводит к какому-либо результату.

★★★★★

Последнее исправление: reprimand (всего исправлений: 2)
Ответ на: комментарий от intelfx

способность логично обосновать наличие () после endif (нет, ответ «в скобках может писаться выражение в if» не катит). Продемонстрируй интуицию.

Для упрощения синтаксиса

Т.е. совпадение синтаксиса вызова функции и закрывающей скобки условного оператора - это упрощение? Окей, упрощение _чего_?

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

Поковырявшись с cmake и scons с радостью вернулся обратно на autotools, чего всем и желаю.

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

Само по себе уже забавно.

Да нет, кросскомпиляция в лялехе и всё что с этим связано - это очень печально, и автолулзы тут - одна из причин.

Надо же, какая неожиданность - у N900 медленный процессор.

Наоборот. Действительно неожиданно то, что та же самая картина у меня на досктопе с цеонами: configure на мелких пакетах занимает больше времени чем make.

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

кросскомпиляция в лялехе и всё что с этим связано - это очень печально

У меня с ней всё в порядке. Но твоя печаль радует меня.

Действительно неожиданно то, что та же самая картина у меня на досктопе с цеонами: configure на мелких пакетах занимает больше времени чем make.

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

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

и как конкретно ты пытался кросскомпилять генту и в чём конкретно были проблемы?

В гентушных доках кросскомпиляция дистра вполне себе подробно описана

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

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

обожаю вот таких вот личностей как ты

откуда вы такие беретсь? ты меня знаешь? нет? откуда эти «надо полагать»? а если ты диаметрально противоположно не прав?

жаль за 4.2 перестали косить

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

откуда эти «надо полагать»?

Ты же прям в этой теме написал, что % в make ещё не использовал: Почему в cmake всё так сложно? (комментарий)

Без «%» в Makefile очень много лишней писанины, если в проекте два и более исходника. Если ты до этого не добрался, значит не было необходимости.

обожаю вот таких вот личностей как ты

Не забывай, что обсуждают не тебя лично, а код и высказывания. Не переводи всё в склоку.

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

откуда эти «надо полагать»?

Оттуда, что в этом треде ты просишь помощи в исправлении практически детской ошибки: ты перепутал CFLAGS и LDFLAGS. Человек, который пишет сложные мейкфайлы и остаётся доволен языком Make, должен быть достаточно компетентен для того, чтобы не делать таких ошибок в _любой_ системе сборки, даже если он с ней не знаком.

Из этого я делаю вывод, что ты не являешься таким человеком.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от i-rinat

Ты же прям в этой теме написал, что % в make ещё не использовал: Почему в cmake всё так сложно? (комментарий)

что не устанавливает прямой логической связи

Не забывай, что обсуждают не тебя лично, а код и высказывания. Не переводи всё в склоку.

да я и не переводил. Это всё агенты поттеринга любят таким заниматься

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

Человек

Человек, каким бы опытным он не был и что бы он не знал может совершать _любые_ ошибки, хоть детские хоть нет. Когда ты сталкиваешься с чем-то в первый раз ты будешь наступать на грабли - хочешь ты этого или нет.

Играл на гитаре и решил научиться играть на фортепиано. И тут какой-то идиот сбоку видя твои первые шаги гласит:

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

НАРКОМАН ШТОЛЕ?

А теперь очень серезно. Ты утверждаешь, что я не имел дело с большими проектами со сложными мейкфайлами, а теперь коверкаешь свое утверждение. Я не хочу лазить по википедии и выискивать специальный термин из софистики, обозначающий это, но я думаю ты понял о чем я.

Еще раз, чего стоят твои слова если ВДРУГ ты не прав с своим вангованием?

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

Человек, каким бы опытным он не был и что бы он не знал может совершать _любые_ ошибки, хоть детские хоть нет.

Нет. Дальше не читал.

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

Прекращаем хамить.

я мог бы ответить что-то в твоем же стиле:

Дальше не читал.

но суть была бы аналогичная, понимаешь?

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

Нет, не аналогичная. Ты начинаешь свои слова с ложного посыла — какой толк их дальше читать?

P. S.:

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

Да, я это утверждаю. Нет, не коверкаю.

Еще раз, чего стоят твои слова если ВДРУГ ты не прав с своим вангованием?

Очевидно, ничего. Но я прав.

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

Нет, не аналогичная. Ты начинаешь свои слова с ложного посыла — какой толк их дальше читать?

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

В твоем случае я пытаюсь выяснить куда ты утратил свою прошлую адекватность, т.к. ЕМНИП она была.

Нет, не коверкаю.

перечитай ветку сообщений выше. Внимательно.

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

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

Но я прав.

друзьям в падике не забудь рассказать

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

configure на мелких пакетах занимает больше времени чем make.

Но configure генерирует makefile. Ясное дело он медленнее. Где логика?

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

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

fixed.

если ты никогда не использовал % в мейкфайлах, то скорее всего ты не участвовал в проектах, которые используют make много больше хелловорда (вообще, разработчикам проектов использующие make, кроме kernel надо отрывать руки).

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

еще один чудик

но ты смотри, ты прогрессивнее

У прошлых была стадия
«небось» и «надо полагать»
а у тебя
«скорее всего»
что немного лучше

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

вообще можно было бы разбить весь ваш пиздежь в 0 даже игнорируя NDA, да стимула нет возиться с интернет военами

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

Здесь не дом благородных девиц, всё-таки. Да, я перебиваю собеседника, если он несёт чушь, в том числе IRL. И обычно мне не приходится извиняться.

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

Переход на личности (в твоём исполнении) не несёт никакой смысловой нагрузки. Оборот «дальше не читал» (в моём исполнении) говорит о том, что следствия из ложного тезиса можно даже не разбирать.

Разница видна?

И да, ты можешь прерывать разговор сколько хочешь, он вообще не имеет смысла. В самом начале ветки я отметил, что если ты создаёшь треды с подобным содержанием, то твоё выражение «мне по душе обычные мейкфайлы» имеет нулевую обоснованность. И уже в частности — можно с весьма большой степенью достоверности предположить, что в написании сколько-нибудь сложных систем сборки на Make ты не участвовал. P. S.: NDA можешь не размахивать.

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

Переход на личности (в твоём исполнении) не несёт никакой смысловой нагрузки.

дальше не читал

reprimand ★★★★★
() автор топика

внутри обычного Makefile я могу просто написать

И это будет работать только у тебя, не будет поддерживать другие системы и компиляторы, нормально настраиваться, уметь кросс-компиляцию, генерировать проекты для IDE и т.д.

Заметь, это даже в твоём хелловорлде, я не говорю о более сложных проектах.

И не надо врать про одну строчку, даже Makefile твоего хелловорлда будет длиннее приведённого CMakeLists.txt, потому что тебе как минимум нужно определить цели program, all, clean и переменные CC, CFLAGS/LDFLAGS. Инсталляция? make - пара десятков строк, cmake - одна. Тесты? make - пара десятков строк, cmake три. Опции? cmake - одна строка, make - вообще хрен. Debug/release конфигурации? cmake - 0 строк, make - сам считай. Ну ты понял, можно продолжать долго.

Возникает желание выбросить на помойку этот cmake... документация в стиле «хрен поймешь без бутылки», вот так сразу ее не взять чтобы «прочитал -> сразу понял -> используешь». Туториалы не объясняют что к чему.

Ты просто лентяй. Документация к cmake идеальна и вообще понимать там особо нечего.

И правильно так:

project(program) # Насчёт языка сам разберётся
cmake_minimum_required(VERSION 3.2)

# Будет подставлена правильная опция в зависимости от компилятора
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C99_STANDARD_COMPILE_OPTION}")

# Сам разберётся как найти алсу в системе, независимо от pkgconfig и прочих костылей
find_package(ALSA REQUIRED)

# Используем заголовки и библиотеку алсы. Один исходник в отдельную переменную запихивать совершенно не обязательно. Несколько - конечно, имеет смысл
include_directories(SYSTEM ${ALSA_INCLUDE_DIRS})
add_executable(program file.c)
target_link_libraries(program ${ALSA_LIBRARIES})
slovazap ★★★★★
()
Ответ на: комментарий от tailgunner

VERSION 3.2

я сам не люблю это, но приходится

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

Но синтаксис стал сложнее.

Синтаксис CMake действительно больная тема и мало кто от него в восторге. Его разработчики серьёзно относятся к обратной совместимости, для каждого изменения поведения от версии к версии создаются policy, cmake_minimum_required() нужен для той же цели. Очень надеюсь, что в какой-то момент они поломают всю обратную совместимость и возьмут нормальный язык под задачу (тот же Python). Иначе CMake рано ило поздно ждёт забвение из-за молодых конкурентов: QBS, Gradle, etc.

Тем не менее, синтаксис CMake это мелочь, главные его достоинства кроссплатформенность, универсальная семантика создания целей сборки, кеширование параметров сборки и корректное отслеживание зависимостей, скорость работы за счёт разделения сборки на этапы конфигурации и генерации (привет, Ninja), огромное количество готовых модулей, кросскомпиляция.

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

Кто не любит-то? Кто свежий софт на гнилодистрибутивах собирает? Так они и должны страдать.

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

Ну ты понял, можно продолжать долго.

Собрать предкомпилированный заголовок для gcc с теми же фалагами, что и исходники, и заюзать его: три строчки в мейкфайле, страница нетривиального кода на cmake. Можно продолжать дальше, cmake имеет фантастические возможности по созданию проблем, которых в make в принципе не было

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

А как Gradle с проектами C/C++ дружит?

Конечно, гугл в помощь.

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

по созданию проблем, которых в make в принципе не было

Особенно забавный момент с make у меня был, когда мне сказали: «ну, вызывай сначала тут make, потом тут, а потом тут». После второй сессии нужно-всего-то-было-ещё-раз-make-вызвать-в-той-директории я осознал, что лучше я потрачу пару дней на перевод проекта на CMake прямо сейчас, пока не поздно.

Для любой системы сборки нужен человек, с чувством меры и завершённости. Сами по себе они как-то плохо проблемы решают.

i-rinat ★★★★★
()
Ответ на: комментарий от reprimand

QBS он для всего вроде бы, не? Для питонов яв и прочих яваскритов с кутями. Когда qmake мне будет недостаточно, я точно знаю что буду изучать именно QBS а не недоcmake...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

В педивикии написано, что альтернатива cmake — qmake, а про qbs там вообще ни слова. И есть подозрение, что оно медленное, вендузячье, и генерирует кучу говна в процессе работы, в которой разобраться сложнее, чем в cmake.

anonymous
()

cmake — это надстройка над make (на мой взгляд, не очень удачная). Поэтому сравнивать одно с другим ИМХО не совсем корректно.

Sahas ★★★★☆
()

юзай premake5 уже ... или qbs

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

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

Это qbs что-ли? Он вообще ничего не генерирует. Аноны совсем обленились.

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

Там написано:

The build process in Qbs takes place in two stages. First, the build graph is resolved by reading the project's configuration files and computing the set of input and output nodes and the dependencies between them in a directed acyclic graph. Then the executor executes all of the commands necessary to create the output files, in parallel according to the dependency rules.

уж извините, мне ни разу не попадались проекты с использованием qbs, возможно у всяких вендузятников (хотя зачем им, когда студия уже есть и это стандарт? xcode тогда?) он и пользуется некоторой популярностью. Ты бы лучше рассказал, как происходит процесс сборки на практике и сколько это занимает времени, а так же обладает ли оно схожими с cmake способностями по интеграции сторонних систем сборки. Ну и за удобства в сравнении с cmake.

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

В том числе для кроссплатформенной сборки сколько-нибудь сложного проекта.

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

Каюсь - совсем забыл про pch, а вы абсолютно правы. Действительно, нужно ради pch одной строчкой развернуть всё остальное что в cmake делается тривиально и работает везде в несколько страниц нечитаемого и непереносимого make, и ещё налепить ошибок.

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

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

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

все программы, которые я собирал и которые на cmake, создают файлы Makefile, которые потом спокойно считываются make.

https://ru.wikipedia.org/wiki/CMake

CMake не занимается непосредственно сборкой, a лишь генерирует файлы управления сборкой из файлов CMakeLists.txt:

Makefile в системах Unix для сборки с помощью make;

Sahas ★★★★☆
()
Ответ на: комментарий от i-rinat

Особенно забавный момент с make у меня был, когда мне сказали: «ну, вызывай сначала тут make, потом тут, а потом тут».

А что, нельзя было решить проблему дополнительных целью?

лучше я потрачу пару дней на перевод проекта на CMake прямо сейчас, пока не поздно.

Я, наоборот, не полезу в это болото без веских причин.

Для любой системы сборки нужен человек, с чувством меры и завершённости

Можно слово «сборки» убрать и утверждение останется верным

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