CMake与'configure --prefix=DIR && make all install '的等效项是什么?

cld4siwp  于 2022-11-24  发布在  其他
关注(0)|答案(9)|浏览(364)

我做cmake . && make all install。这是可行的,但安装到/usr/local
我需要安装到不同的前缀(例如,安装到/usr)。
要安装到/usr而不是/usr/localcmakemake命令行是什么?

c0vxltue

c0vxltue1#

您可以在命令行中传入任何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)使用,其他生成器会忽略它。

bkkx9g8r

bkkx9g8r2#

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

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

...如答案here中所用。

mefy6pfw

mefy6pfw3#

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

make DESTDIR=<installhere> install

另请参见this question,它解释了DESTDIRPREFIX之间的细微差别。
这适用于分阶段安装,并允许将程序存储在与运行位置不同的位置,例如通过符号链接存储在/etc/alternatives
然而,如果你的包是可重定位的,并且不需要任何通过configure阶段设置的硬编码(前缀)路径,你 * 可能 * 可以跳过它。

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

您可以运行:

cmake . && make DESTDIR=/usr all install

请注意,正如user7498341所指出的,这并不适用于真正应该使用PREFIX的情况。

ttvkxqim

ttvkxqim4#

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

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

ldioqlga

ldioqlga5#

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

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

正式文件

qij5mzcb

qij5mzcb6#

从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
pgx2nnw8

pgx2nnw87#

关于布鲁斯·亚当斯的回答:
您的回答会造成危险的混淆。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=/something中的程序的可能性仅意味着程序不会访问基于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

如果您尝试从$PREFIX/bin/prog以外的其他位置运行prog,则永远不会找到prog.db,因为它不在预期的位置。
最后,/etc/alternatives实际上并不是这样工作的。根目录树中有一些指向安装程序的符号链接(例如vi -〉/usr/bin/nvi,vi -〉/usr/bin/vim,等等)。

nr9pn0ug

nr9pn0ug8#

如果使用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

1.构建安装阶段:

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

当遵循这种方法时,发生器可以很容易地切换(例如Ninja的-G Ninja),而不必记住任何发生器特定的命令。
请注意,CMAKE_BUILD_TYPE变量仅由单配置生成器使用,而build命令的--config参数仅由多配置生成器使用。

kx7yvsdv

kx7yvsdv9#

答案很多,但我想我会做一个总结,以适当地分组,并解释他们的差异。
首先,您可以通过以下两种方式之一定义前缀:在配置期间或安装时,这实际上取决于您的需求。

配置期间

两个选项:

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

相关问题