Что такое 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), не забудьте запомнить какие-либо команды, специфичные для генератора.