如何在不再次运行配置脚本/cmake 的情况下修改安装路径

Posted

技术标签:

【中文标题】如何在不再次运行配置脚本/cmake 的情况下修改安装路径【英文标题】:how to modify the install-path without running the configure script/cmake again 【发布时间】:2012-11-08 23:18:42 【问题描述】:

我正在开发一个需要大量时间来构建 (10-15) 分钟的项目。我已经重新编译以验证是否存在编译错误。现在我想更改安装目录,以便我拥有带有新更改的新版本的可执行文件。有没有一种方法可以只修改安装路径,以便“make install”安装到新位置而不是旧位置?

【问题讨论】:

Make install - but not to default directories? 的可能重复项 【参考方案1】:

CMake 生成的 makefile 支持 DESTDIR coding convention 用于 makefile。因此,您可以通过在调用 make 时设置 DESTDIR 变量来覆盖默认安装位置:

$ make install DESTDIR=/opt/local

无需重新运行 CMake。

【讨论】:

我刚遇到这个,我认为这不应该是公认的答案。最好使用cmake . -DCMAKE_INSTALL_PREFIX=<some_install_path> 重新运行cmake,这不会重新编译您的项目。使用DESTDIR 文件仍然只准备了默认前缀(请参阅生成的install_manifest.txt)。如果您想卸载等,这尤其糟糕。 此答案已发布于 21.1.2012,星期一...我在 28.6.2020,星期二尝试了此...我复制了此命令并修改了文件夹名称...并粘贴了它在终端..按回车..然后美妙的是,这在 2020 年仍然有效......谢谢@sakra【参考方案2】:

我不知道这是否普遍正确,但我可以举一个应用程序的例子,the accepted answer by sakra 不能正常工作。如果您在安装 ITK 时通过修改 DESTDIR 来修改安装目录,它只会将 DESTDIR 附加到其已形成的安装路径中:

make install DESTDIR=/opt/local

[...]

-- Installing: <strong>/opt/local/usr/local</strong>/lib/cmake/ITK-4.4/WrapITK/Configuration/Typedefs/itkRenyiEntropy[...]

另一方面,在 this answer 之后 Fraser 将导致正确的安装路径,而无需重新编译:

cmake -DCMAKE_INSTALL_PREFIX=/opt/local /path/to/ITK_source
make install

[...]

-- Installing: <strong>/opt/local</strong>/lib/cmake/ITK-4.4/WrapITK/Configuration/Typedefs/itkRenyiEntropy[...]

【讨论】:

【参考方案3】:

使用-DCMAKE_INSTALL_PREFIX=&lt;somewhere different to last time&gt; 运行 CMake 不会导致您的项目需要重新编译。如果您将其他命令行参数传递给 CMake,例如更改编译器标志,强制重建受影响的目标,但简单地更改安装前缀不会。

【讨论】:

有没有办法在不重新运行 cmake 的情况下更改安装前缀? CPACK 似乎有能力这样做,但我看不到直接使用 make + some variable 的方法。如果我想用我自己的打包程序创建一个包,我想在 /usr 而不是 /usr/local 下获取东西,但我希望它能够工作,而不必要求程序员使用正确的 CMAKE_INSTALL_PREFIX 运行 cmake。 . 好吧,你可以在你的 CMakeLists.txt 中使用set 来硬编码CMAKE_INSTALL_PREFIX 的值,但我认为这相当少见,可能会发现已经习惯 CMake 的人.也许更好的选择是在 CMakeLists.txt 中打印出message,它显示CMAKE_INSTALL_PREFIX 的当前值,并提供有关如何更改值的说明。类似message("The install path is currently $CMAKE_INSTALL_PREFIX")message("To change this run: cmake . -DCMAKE_INSTALL_PREFIX=\"&lt;new install path&gt;\"")【参考方案4】:

DESTDIR 和前缀的规范定义是:文件安装到 $DESTDIR$prefix,但准备好好像它们的最终安装位置只是 $prefix。

所以 DESTDIR 仅适用于构建二进制包或 tarball 的人; CMAKE_INSTALL_PREFIX 适用于任何想要指定构建的二进制文件最终应该放在哪里的人。

【讨论】:

【参考方案5】:

以防万一有人不使用 CMake,那么在 Makefile 中有一种方法可以做到这一点。如果您在构建目录中生成了 Makefile.config 文件,请找到 prefix。这个prefix 是安装path,将安装二进制文件/头文件等。更改此设置会将二进制文件/头文件安装到修改后的path

【讨论】:

以上是关于如何在不再次运行配置脚本/cmake 的情况下修改安装路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在不丢失 docker 数据的情况下更新 prometheus 配置文件

运行 Pig 脚本时出现异常

ccache 在不删除 CMake 文件的情况下不会命中缓存

Angular 路由器:(类似 TAB 的)导航 - 如何在不再次运行 ngOnInit 的情况下更改 URL

在不使用 CTest 的情况下使用 CMake 构建测试

如何在不显示窗口的情况下运行 PowerShell 脚本?