CMake中'configure——prefix=DIR &&使所有安装'?

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

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

要安装到/usr而不是/usr/localcmakemake命令行是什么?

244882 次浏览

你可以在命令行中传入任何CMake变量,或者使用ccmake/ CMake -gui编辑缓存的变量。在命令行中,

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

Would configure the project, build all targets and install to the /usr prefix. The type (PATH) is not strictly necessary, but would cause the Qt based cmake-gui to present the directory chooser dialog.

Some minor additions as comments make it clear that providing a simple equivalence is not enough for some. Best practice would be to use an external build directory, i.e. not the source directly. Also to use more generic CMake syntax abstracting the generator.

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

你可以看到它变得相当长,不再是直接等价的,但更接近于一个相当简洁的形式的最佳实践……——config只被多配置生成器(即MSVC)使用,其他人会忽略它。

可省略已接受答案中的“:PATH”部分。下面的语法可能更容易记住:

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

...在答案中使用在这里

注意,在CMake和Autotools中,你并不总是需要在配置时设置安装路径。你可以在安装时使用DESTDIR(另见在这里),如下所示:

make DESTDIR=<installhere> install

另见这个问题,它解释了DESTDIRPREFIX之间的细微差别。

这用于分期安装,并允许将程序存储在与运行位置不同的位置,例如通过符号链接将程序存储在/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中-如果路径不是绝对路径,则始终认为路径是相对于当前目录的)
  • 第四行使用前一行中配置的buildsystem构建在.中配置的项目。它将执行install目标,该目标也会构建所有必要的依赖目标(如果需要构建的话),然后将文件复制到CMAKE_INSTALL_PREFIX(在本例中是./project-root/build/stage。对于多配置构建,比如在Visual Studio中,你也可以用可选的--config <config>标志指定配置。
  • 使用cmake --build命令的好处是它适用于所有生成器(即makefiles和Visual Studio),而不需要不同的命令。

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

关于布鲁斯·亚当斯的回答:

你的回答会造成危险的混乱。DESTDIR用于 从根树中安装。它能让人看到未来的样子 如果没有指定DESTDIR,则安装在根树中。 PREFIX是实际安装所在的基本目录 基础。< / p >

例如,PREFIX=/usr/local表示最后目标 包的/usr/local。使用DESTDIR=$HOME将安装这些文件 就好像$HOME是根目录(/)。如果DESTDIR为/tmp/ DESTDIR,则为1 可以看看'make install'会产生什么影响。本着这种精神,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, program .db将永远不会被找到,因为它不在它的预期位置

最后,/etc/alternatives真的不能这样工作。有 安装在根树中的程序的符号链接(例如vi -> /usr/bin/nvi, Vi -> /usr/bin/vim, etc).

. vim

如果使用CMake,调用实际的构建系统(例如通过make命令)被认为是坏习惯。强烈建议这样做:

  1. 配置+生成阶段:

     cmake -S foo -B _builds/foo/debug -G "Unix Makefiles" -D CMAKE_BUILD_TYPE:STRING=Debug -D CMAKE_DEBUG_POSTFIX:STRING=d -D CMAKE_INSTALL_PREFIX:PATH=/usr
    
  2. Build 而且

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

当采用这种方法时,生成器可以很容易地切换(例如,Ninja的-G Ninja),而不需要记住任何特定于生成器的命令。

请注意,CMAKE_BUILD_TYPE变量仅用于单个配置生成器,而构建命令的--config参数仅用于多个配置生成器。

从CMake 3.15开始,实现这一点的正确方法是使用:

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

官方文档 .

从CMake 3.21开始,你可以使用--install-prefix选项,而不是手动设置CMAKE_INSTALL_PREFIX

现代版的configure --prefix=DIR && make all install现在是:

cmake -B build --install-prefix=DIR
cmake --build build
cmake --install build

有很多答案,但我想我应该做一个总结来正确地分组并解释它们的区别。

首先,您可以通过以下两种方式之一定义前缀:在配置期间,或者在安装时,这实际上取决于您的需要。

在配置期间

两个选择:

cmake -S $src_dir -B $build_dir -D CMAKE_INSTALL_PREFIX=$install_dir
cmake -S $src_dir -B $build_dir --install-prefix=$install_dir # Since CMake 3.21

在安装期间

优点:如果你想改变它,不需要重新配置。

两个选择:

cmake DESTDIR=$install_dir --build $build_dir --target=install # Makefile only
cmake --install $build_dir --prefix=$install_dir