什么是CMake相当于'configure --prefix = DIR && make all install'?

天大地大妈咪最大 提交于 2020-02-27 06:49:54

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

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

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


#1楼

可以省略接受的答案中的“:PATH”部分。 这种语法可能更令人难忘:

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

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


#2楼

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

make DESTDIR=<installhere> install

另请参阅此问题该问题解释了DESTDIR和PREFIX之间的细微差别。

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

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

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

你会运行:

cmake . && make DESTDIR=/usr all install

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


#3楼

我跨平台构建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楼

关于布鲁斯亚当斯回答:

你的答案会造成危险的混乱。 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等)。


#5楼

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

按照这种方法,可以轻松切换发生器(例如-GNinja for Ninja ),而不必记住任何特定于发生器的命令。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!