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

我做cmake . && make all install cmake . && make all install
这工作,但安装到/usr/local

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

什么是cmakemake命令行安装到/usr而不是/usr/local

您可以在命令行中传入任何CMakevariables,或使用ccmake / cmake-gui编辑cachingvariables。 在命令行上,

  cmake -DCMAKE_INSTALL_PREFIX:PATH = / usr。  &&使所有安装 

将configuration项目,build立所有目标并安装到/ usr前缀。 types(PATH)并不是绝对必要的,但会导致基于Qt的cmake-gui显示目录select器对话框。

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

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

…在这里的答案中使用。

请注意,在cmake和autotools中,您都不必在configuration时设置安装path。 你可以在安装时使用DESTDIR (参见这里 )

 make DESTDIR=<installhere> install 

另请参阅解释DESTDIR和PREFIX之间细微差异的这个问题 。

这是为了分阶段安装,并允许将程序存储在与运行位置不同的位置,例如通过符号链接/ etc / alternatives。 但是,如果您的软件包是可重定位的,并且不需要通过configuration阶段设置的任何硬编码(前缀)path, 可以跳过它。 所以,而不是:

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

你会运行:

 cmake . && make DESTDIR=/usr all install 

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

我build立跨平台的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 
  • 前两行创build了源代码构build目录
  • 第三行生成构build系统,指定安装结果的放置位置(我总是将其放置在./project-root/build/stage – 如果path不是绝对path,则始终将path视为相对于当前目录)
  • 第四行build立configuration的项目. 与生产线configuration在行之前。 它将执行install目标,如果需要构build所有必要的依赖目标,然后将其复制到CMAKE_INSTALL_PREFIX (在这种情况下是./project-root/build/stage 。对于多configuration构build,如Visual Studio还可以使用可选的--config <config>标志来指定configuration。
  • 使用cmake --build命令的好处在于,它可以在不需要不同命令的情况下适用于所有生成器(即makefile和visual studio)。

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

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

你的答案造成了危险的困惑。 DESTDIR旨在安装在根树之外。 如果没有指定DESTDIR,它允许查看根树中将安装的内容。 PREFIX是真实安装所基于的基础目录。

例如,PREFIX = / usr / local表示软件包的最终目的地是/ usr / local。 使用DESTDIR = $ HOME将安装文件,就好像$ HOME是根(/)。 如果说DESTDIR是/ tmp / destdir,那么可以看到'make install'会影响什么。 本着这样的精神,DESTDIR不应该影响到构build的对象。

一个makefile段来解释它:

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

程序必须假设PREFIX是最终(即生产)目录的基础目录。 在DESTDIR = /东西中安装的程序符号链接的可能性仅仅意味着程序不能访问基于PREFIX的文件,因为它根本不起作用。 猫(1)是一个程序,(最简单的forms)可以从任何地方运行。 这里是一个例子,不会:

 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等)。

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

  1. configuration阶段:

     cmake -Hfoo -B_builds/foo/debug -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=/usr 
  2. 构build安装阶段

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

当采用这种方法时,发生器可以很容易地切换(例如, 忍者忍者 ),而不必记住任何发生器特定的命令。