Что CMake эквивалентно «configure --prefix = DIR && make all install»? - PullRequest
349 голосов
/ 14 мая 2011

Я делаю cmake . && make all install. Это работает, но устанавливается на /usr/local.

Мне нужно установить другой префикс (например, /usr).

Что такое командная строка cmake и make для установки на /usr вместо /usr/local?

Ответы [ 6 ]

400 голосов
/ 14 мая 2011

Вы можете передать любую переменную CMake в командной строке или редактировать кэшированные переменные, используя ccmake / cmake-gui.В командной строке

cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr . && make all install

настроит проект, создаст все цели и установит префикс / usr.Тип (PATH) не является строго необходимым, но может привести к тому, что cmake-gui на основе Qt представит диалоговое окно выбора каталога.

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

mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr .. && cmake --build . --target install --config Release

Вы можете видеть, что он становится немного длиннее и больше не эквивалентен напрямую, но ближе к лучшим практикам в довольнократкая форма ... --config используется только несколькими генераторами конфигурации (т. е. MSVC), игнорируется другими.

36 голосов
/ 16 декабря 2015

Часть ": PATH" в принятом ответе может быть опущена. Этот синтаксис может быть более запоминающимся:

cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install

... как используется в ответах здесь .

23 голосов
/ 02 марта 2016

Обратите внимание, что и в CMake, и в Autotools вам не всегда нужно указывать путь установки во время настройки. Вы можете использовать DESTDIR во время установки (см. Также здесь ) вместо:

make DESTDIR=<installhere> install

См. Также этот вопрос , который объясняет тонкую разницу между DESTDIR и PREFIX.

Это предназначено для поэтапной установки и позволяет хранить программы в другом месте, отличном от места их запуска, например. /etc/alternatives по символическим ссылкам.

Однако, если ваш пакет перемещаемый и ему не нужны какие-либо жестко заданные (префиксные) пути, заданные на этапе конфигурирования, вы можете пропустить его. Так что вместо:

cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install

вы бы запустили:

cmake . && make DESTDIR=/usr all install

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

15 голосов
/ 16 января 2017

То, как я создаю кроссплатформенные проекты 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-файлов и Visual Studio) без необходимости использования других команд.

После этого я использую установленные файлы для создания пакетов или включения их в другие проекты ...

4 голосов
/ 01 февраля 2017

Относительно ответа Брюса Адамса:

Ваш ответ создает опасную путаницу.DESTDIR предназначен для установки вне корневого дерева.Это позволяет увидеть, что будет установлено в корневом дереве, если не указать DESTDIR.PREFIX - это базовый каталог, на котором основана реальная установка.

Например, PREFIX = / usr / local указывает, что final пункт назначения пакета - / usr / local.Использование DESTDIR = $ HOME установит файлы так, как если бы $ HOME был корневым каталогом (/).Если, скажем, DESTDIR, был / tmp / destdir, можно было бы увидеть, как повлияет «make install».В этом духе DESTDIR не должен никогда влиять на построенные объекты.

Сегмент make-файла, чтобы объяснить это:

install:
    cp program $DESTDIR$PREFIX/bin/program

Программы должны предполагать, что PREFIX является базовым каталогомокончательный (т.е. производственный) каталог.Возможность символической ссылки на программу, установленную в DESTDIR = / что-то, только означает, что программа не имеет доступа к файлам, основанным на PREFIX, поскольку она просто не будет работать.cat (1) - это программа, которая (в простейшем виде) может запускаться откуда угодно.Вот пример, который не будет:

prog.pseudo.in:
    open("@prefix@/share/prog.db")
    ...

prog:
    sed -e "s/@prefix@/$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 и т. Д.).

2 голосов
/ 14 февраля 2017

Считается плохой практикой вызывать фактический генератор (например, через make), если используется CMake .Настоятельно рекомендуется сделать это следующим образом:

  1. Настройка фазы:

    cmake -Hfoo -B_builds/foo/debug -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=/usr
    
  2. Сборка и Установка фаз

    cmake --build _builds/foo/debug --config Debug --target install
    

При использовании этого подхода генератор может быть легко переключен (например, -GNinja для Ninja ) без необходимости запоминания каких-либо специфических для генератора команд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...