Я делаю cmake . && make all install
.
Это работает, но устанавливается на /usr/local
.
Мне нужно установить другой префикс (например, /usr
).
Что такое cmake
и make
для установки на /usr
вместо /usr/local
?
Я делаю cmake . && make all install
.
Это работает, но устанавливается на /usr/local
.
Мне нужно установить другой префикс (например, /usr
).
Что такое cmake
и make
для установки на /usr
вместо /usr/local
?
Вы можете передать любую переменную CMake в командной строке или отредактировать кешированные переменные, используя ccmake/cmake-gui. В командной строке
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr . && make all install
Будет сконфигурировать проект, собрать все цели и установить в префикс /usr. Тип (PATH) не является строго необходимым, но заставит Qcm на основе cmake-gui представить диалог выбора каталога.
Часть ": PATH" в принятом ответе может быть опущена. Этот синтаксис может быть более запоминающимся:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
... как используется в ответах здесь.
Обратите внимание, что в обоих системах 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.
способ построения 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 файлов и визуальной студии) без необходимости использования разных команд.после этого я использую установленные файлы для создания пакетов или их включения в другие проекты...
Относительно ответа Брюса Адамса:
Ваш ответ создает опасную путаницу. 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 и т.д.).
С использованием 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), не забудьте запомнить какие-либо команды, специфичные для генератора.