Что такое cmake-эквивалент 'configure -prefix = DIR && make all install'?
Я делаю cmake . && make all install
.
Это работает, но устанавливается на /usr/local
.
Мне нужно установить другой префикс (например, /usr
).
Что такое cmake
и make
для установки на /usr
вместо /usr/local
?
Ответы
Ответ 1
Вы можете передать любую переменную CMake в командной строке или отредактировать кешированные переменные, используя ccmake/cmake-gui. В командной строке
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr . && make all install
Будет сконфигурировать проект, собрать все цели и установить в префикс /usr. Тип (PATH) не является строго необходимым, но заставит Qcm на основе cmake-gui представить диалог выбора каталога.
Ответ 2
Часть ": PATH" в принятом ответе может быть опущена. Этот синтаксис может быть более запоминающимся:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
... как используется в ответах здесь.
Ответ 3
Обратите внимание, что в обоих системах cmake и autotools вам не всегда нужно устанавливать путь установки во время настройки. Вы можете использовать DESTDIR во время установки (см. Также здесь), а также:
make DESTDIR=<installhere> install
Смотрите также этот question, который объясняет тонкую разницу между DESTDIR и PREFIX.
Это предназначено для поэтапной установки и позволяет хранить программы в другом месте, откуда они запускаются, например. /etc/alternatives через символические ссылки.
Однако, если ваш пакет перемещается и не требует каких-либо жестко закодированных (префиксных) путей, установленных на этапе настройки, вы можете пропустить его.
Поэтому вместо:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
вы запустите:
cmake . && make DESTDIR=/usr all install
Обратите внимание, что, как указывает user7498341, это не подходит для случаев, когда вы действительно должны использовать PREFIX.
Ответ 4
способ построения cmake-проектов кросс-платформенной:
/project-root> mkdir build
/project-root> cd build
/project-root/build> cmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage
/project-root/build> cmake --build . --target=install --config=Release
- первые две строки создают каталог исходной сборки
- третья строка генерирует систему сборки, определяющую, куда поместить результат установки (который я всегда размещаю в
./project-root/build/stage
- путь всегда рассматривается относительно текущего каталога, если он не является абсолютным)
- четвертая строка строит проект, сконфигурированный в
.
, с сборкой, настроенной в строке раньше. он выполнит цель install
, которая также построит все необходимые зависимые объекты, если они должны быть созданы, а затем скопирует файлы в CMAKE_INSTALL_PREFIX
(что в данном случае равно ./project-root/build/stage
). Для создания нескольких конфигураций, подобных Visual Studio, вы также может указать конфигурацию с дополнительным флагом --config <config>
.
- Хорошая часть при использовании команды
cmake --build
заключается в том, что она работает для всех генераторов (т.е. make файлов и визуальной студии) без необходимости использования разных команд.
после этого я использую установленные файлы для создания пакетов или их включения в другие проекты...
Ответ 5
Относительно ответа Брюса Адамса:
Ваш ответ создает опасную путаницу. DESTDIR предназначен для
устанавливается из корневого дерева. Это позволяет увидеть, что будет
установленный в корневом дереве, если не указать DESTDIR.
PREFIX - это базовый каталог, на котором
на основе.
Например, PREFIX =/usr/local указывает, что конечный пункт назначения
пакета /usr/local. Использование DESTDIR = $HOME будет устанавливать файлы
как будто $HOME был корнем (/). Если, скажем, DESTDIR, был /tmp/destdir, один
мог видеть, что повлияет на "make install". В этом духе DESTDIR
никогда не должны влиять на построенные объекты.
Сегмент файла makefile для его объяснения:
install:
cp program $DESTDIR$PREFIX/bin/program
Программы должны предполагать, что PREFIX является базовым каталогом окончательного
(т.е. производство). Возможность символической привязки программы
установленный в DESTDIR =/что-то означает только то, что программа не
доступ к файлам на основе PREFIX, поскольку это просто не сработает. кошка (1)
это программа, которая (в простейшей форме) может работать из любого места.
Вот пример, который не будет:
prog.pseudo.in:
open("@[email protected]/share/prog.db")
...
prog:
sed -e "s/@[email protected]/$PREFIX/" prog.pseudo.in > prog.pseudo
compile prog.pseudo
install:
cp prog $DESTDIR$PREFIX/bin/prog
cp prog.db $DESTDIR$PREFIX/share/prog.db
Если вы попытались запустить prog из другого источника, кроме $PREFIX/bin/prog,
prog.db никогда не будет найден, поскольку он не находится в ожидаемом месте.
Наконец,/etc/alternatives действительно не работает таким образом. Есть
символические ссылки на программы, установленные в корневом дереве (например, vi → /usr/bin/nvi,
vi → /usr/bin/vim и т.д.).
Ответ 6
С использованием CMake считается неправильной практикой вызывать фактический генератор (например, через make
). Настоятельно рекомендуется сделать это следующим образом:
-
Настроить фазу:
cmake -Hfoo -B_builds/foo/debug -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=/usr
-
Построить и Фазы установки
cmake --build _builds/foo/debug --config Debug --target install
При выполнении этого подхода генератор может быть легко переключен (например, -GNinja
для Ninja), не забудьте запомнить какие-либо команды, специфичные для генератора.