什么是CMake相当于'configure --prefix = DIR&&全部安装'?

时间:2011-05-14 16:59:50

标签: cmake

我做cmake . && make all install。这有效,但会安装到/usr/local

我需要安装到不同的前缀(例如,/usr)。

要安装到cmake而不是make的{​​{1}}和/usr命令行是什么?

7 个答案:

答案 0 :(得分:398)

您可以在命令行上传入任何CMake变量,或使用ccmake / cmake-gui编辑缓存变量。在命令行上,

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

将配置项目,构建所有目标并安装到/ usr前缀。类型(PATH)并不是绝对必要的,但会导致基于Qt的cmake-gui显示目录选择器对话框。

作为评论的一些小的补充说明,提供简单的等价对某些人来说是不够的。最佳做法是使用外部构建目录,即不直接使用源代码。还要使用更通用的CMake语法来抽象生成器。

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

你可以看到它变得相当长,并且不再直接等效,但是以一种相当简洁的形式更接近最佳实践...... - config仅用于多配置生成器(即MSVC) ),被别人忽视。

答案 1 :(得分:36)

":路径"可以省略接受答案中的部分内容。这种语法可能更令人难忘:

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

...用于答案here

答案 2 :(得分:23)

请注意,在CMake和Autotools中,您并不总是必须在配置时设置安装路径。您可以在安装时使用DESTDIR(另请参阅here),如下所示:

make DESTDIR=<installhere> install

另见this question,它解释了DESTDIR和PREFIX之间的细微差别。

这适用于分阶段安装,并允许将程序存储在与其运行位置不同的位置,例如/etc/alternatives通过符号链接。

但是,如果您的包是可重定位的,并且不需要通过配置阶段设置的任何硬编码(前缀)路径,则可能可以跳过它。 所以而不是:

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

你会跑:

cmake . && make DESTDIR=/usr all install

请注意,正如user7498341指出的那样,这不适合您真正应该使用PREFIX的情况。

答案 3 :(得分:13)

我跨平台构建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命令的好处是它适用于所有生成器(即makefile和Visual Studio),而不需要不同的命令。

之后我使用已安装的文件创建包或将它们包含在其他项目中......

答案 4 :(得分:4)

关于布鲁斯亚当斯回答:

你的回答会造成危险的混乱。 DESTDIR适用于 安装在根树之外。它允许人们看到会是什么 如果没有指定DESTDIR,则安装在根树中。 PREFIX是实际安装所在的基本目录 基于

例如,PREFIX = / usr / local表示 final 目的地 一个包是/ usr / local。使用DESTDIR = $ HOME将安装文件 好像$ HOME是根(/)。如果说DESTDIR是/ tmp / destdir,那么 可以看到安装&#39;会影响。本着这种精神,DESTDIR 永远不会影响构建的对象。

用于解释它的makefile段:

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

程序必须假定PREFIX是final的基本目录 (即生产)目录。符号化程序的可能性 安装在DESTDIR = / something只表示程序没有 基于PREFIX访问文件,因为它根本不起作用。猫(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

如果你试图从$ PREFIX / bin / prog之外的地方运行prog, prog.db永远不会被找到,因为它不在预期的位置。

最后,/ etc / alternatives确实不能这样工作。有 符号链接到根树中安装的程序(例如vi - &gt; / usr / bin / nvi, vi - &gt; / usr / bin / vim等。)。

答案 5 :(得分:4)

从CMake 3.15开始,实现此目的的正确方法是:

cmake --install <dir> --prefix "/usr"

Official Documentation

答案 6 :(得分:2)

如果使用 CMake ,则调用实际生成器(例如通过make)被认为是不好的做法。强烈建议这样做:

  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
    
  3. 当采用这种方法时,可以轻松切换生成器(例如-GNinja Ninja ),而不必记住任何特定于发生器的命令。