我做cmake。&&全部安装。这可以工作,但是会安装到/usr/local。
我需要安装到不同的前缀(例如,到/usr)。
安装到/usr而不是/usr/local的cmake和make命令行是什么?
我做cmake。&&全部安装。这可以工作,但是会安装到/usr/local。
我需要安装到不同的前缀(例如,到/usr)。
安装到/usr而不是/usr/local的cmake和make命令行是什么?
当前回答
如果使用CMake,调用实际的构建系统(例如通过make命令)被认为是坏习惯。强烈建议这样做:
配置+生成阶段: 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 构建和安装阶段: cmake——build _builds/foo/debug——config debug——目标安装
当采用这种方法时,生成器可以轻松切换(例如-G Ninja代表Ninja),而无需记住任何特定于生成器的命令。
请注意,CMAKE_BUILD_TYPE变量仅用于单个配置生成器,而build命令的——config参数仅用于多个配置生成器。
其他回答
关于布鲁斯·亚当斯的回答:
你的回答会造成危险的混乱。DESTDIR用于 从根树中安装。它能让人看到未来的样子 如果没有指定DESTDIR,则安装在根树中。 PREFIX是实际安装所在的基本目录 的基础。
例如,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等)。
从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变量,或者使用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)使用,其他人会忽略它。
有很多答案,但我想我应该做一个总结来正确地分组并解释它们的区别。
首先,您可以通过以下两种方式之一定义前缀:在配置期间,或者在安装时,这实际上取决于您的需要。
在配置期间
两个选择:
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
如果使用CMake,调用实际的构建系统(例如通过make命令)被认为是坏习惯。强烈建议这样做:
配置+生成阶段: 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 构建和安装阶段: cmake——build _builds/foo/debug——config debug——目标安装
当采用这种方法时,生成器可以轻松切换(例如-G Ninja代表Ninja),而无需记住任何特定于生成器的命令。
请注意,CMAKE_BUILD_TYPE变量仅用于单个配置生成器,而build命令的——config参数仅用于多个配置生成器。