LINUX.ORG.RU

[cmake] Как правильно задать целевую (PREFIX) директорию?

 


0

1

Не могу толком разобраться, как задавать PRIFIX директорию в cmake.

В cmake существует переменная CMAKE_INSTALL_PREFIX. По-умолчанию она содержит путь /usr/local. А программу по-умолчанию нужно ставить в другую папку, например в /opt/program. Но при этом нужно дать возможность майнтейнеру указывать установочную папку через опцию:

cmake -DCMAKE_INSTALL_PREFIX=/usr/bin

И тут возникает такая логическая коллизия.

1. -DCMAKE_INSTALL_PREFIX не задан. ТОгда переменная CMAKE_INSTALL_PREFIX по-умолчанию содержит /usr/local. Мы проверяем, что CMAKE_INSTALL_PREFIX==/usr/local, делаем вывод что опция -DCMAKE_INSTALL_PREFIX не задана, и задаём директорию инсталляции /opt/program (ведь она у нас по-умолчанию такая должна быть).

2. -DCMAKE_INSTALL_PREFIX задан. При проверке мы видим, что CMAKE_INSTALL_PREFIX!=/usr/local. Мы делаем вывод, что опция -DCMAKE_INSTALL_PREFIX задана, и ставим программу в указанную в этой опции директорию.

3. -DCMAKE_INSTALL_PREFIX задан, и равен /usr/local. Ну вот так написал пользователь-параноик, на всякий случай. Что происходит дальше? Срабатывает логика как в пункте 1, и директория инсталляции устанавливается на /opt/program. Но ведь /usr/local был однозначно задан пользователем!


Вот и возникает у меня вопрос. Как же правильно задать опцию PREFIX-каталога, чтобы при всех вариантах срабатывало правильно?

Ой-ой! Если собрался этот код выкладывать куда-то, большое спасибо тебе скажут пользователи, которые, надеясь на установку в /usr/local (поскольку туда все нормальные программы ставятся по умолчанию), не зададут префикс и получат установку в /opt.

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

> И при чём тут лиункс, если у тебя везде «папки»?

У меня «директории», «папки» и «каталоги». Я использую синонимы, чтобы разнообразить свою речь.

По теме топика тебе есть что сказать?

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

> Ой-ой! Если собрался этот код выкладывать куда-то, большое спасибо тебе скажут пользователи, которые, надеясь на установку в /usr/local (поскольку туда все нормальные программы ставятся по умолчанию), не зададут префикс и получат установку в /opt.

Линукса разные бывают. Почитай, к примеру, спецификацию на MeeGo и удивись.

По теме, как решить эту коллизию в CMake ты ничего не хочешь сообщить?

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

Не нужно её решать, потому в *nix принято, что если prefix не задан, то программа ставится в /usr/local

http://appdeveloper.intel.com/en-us/article/meego-packaging-and-compliance-guidelines

Compliance Spec 3.1.4 Layout in Filesystem

An application shall be installed to /opt/packagename/ and, if necessary to the /etc/opt/packagename/ and /var/opt/packagename/ directories.

Выходит, всетаки надо решать?

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

> Не нужно её решать, потому в *nix принято, что если prefix не задан, то программа ставится в /usr/local

Вопрос же не стоит «нужно или не нужно решать». Вопрос стоит «как решить».

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

Прочел по доку диагонали. Понял, что пакеты в meego ставятся rpm'ками, соответственно и проблему надо решать средствами rpm.

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

> Прочел по доку диагонали. Понял, что пакеты в meego ставятся rpm'ками, соответственно и проблему надо решать средствами rpm.

То есть, в cmake надо задать одно, а в rpm исправлять на другое?

И checkinstall -R уже не сделаешь, и нужно как-то извращаться?

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

Всмысле извращаться? Написать .spec это единственное правильное решение.

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

>Для этого используется DESTDIR.
Иээээ...
По-моему, он используется не для этого.

proud_anon ★★★★★
()

> (ведь она у нас по-умолчанию такая должна быть)

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

PS. Интересно из какого места вы придумали себе этот /opt. Я бы за такую самодеятельность руки оторвал.

slovazap ★★★★★
()

Ничего не понял.

Что за извращения? Какие тут могут быть колизии? Указывай в своем CmakeLists префикс сразу. Те кто поленился указать префикс получат его в твоем префиксе например /opt/lolo

Если пользователь указал префикс, а по спецификации cmake одинаковая опция используется та что указана последней (в даном случае та что указано пользователем) имеет приоритет над той что идет перед ней.

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

Вот именно, вот менно, обычно мейнтейнеры проверяют префик. И лучше написайт специальную инфу для мейнтейнеров в файле PACKAGING (например) где указать что lolo на meego используйте /opt.

ТС знаменитый извращенец.

bhfq ★★★★★
()

Второй пункт пообще не имеет смысла.
Все опции типа -DVAR=VAL обычные присваивания которые в cmake обрабатываются по очереди (что я уже и сказал выше).

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