CMake构建C++项目时使用Ninja执行install操作如何正确配置DESTDIR
CMake+Ninja 环境下跳过DESTDIR前缀安装的解决方案
CMake生成的Ninja构建规则与Makefile处理DESTDIR的逻辑不同:Make会在DESTDIR为空时自动忽略前缀拼接,而Ninja会将DESTDIR的空值直接拼接到原有安装路径前,因此设置DESTDIR= ninja install无法达到清空前缀的效果。你可以通过以下几种方案实现跳过debian/tmp目录限制的需求:
- 直接使用install命令的--prefix参数指定最终安装路径
CMake 3.15及以上版本支持Ninja install携带--prefix参数,优先级高于默认的CMAKE_INSTALL_PREFIX和DESTDIR设置,无需修改原有配置即可直接安装到目标路径:ninja install --prefix /你的/最终/安装路径 - 使用CMake原生安装命令统一控制安装逻辑
不管构建后端是Make还是Ninja,都可以调用CMake原生的--install命令执行安装,逻辑完全统一,会自动忽略DESTDIR的拼接规则:cmake --install . --prefix /你的/最终/安装路径 - 配置阶段直接指定最终安装前缀
如果你不需要保留原有配置的安装路径,可以在执行cmake配置时直接设置CMAKE_INSTALL_PREFIX为目标路径,后续安装完全不会触发DESTDIR的拼接逻辑:cmake .. -DCMAKE_INSTALL_PREFIX=/你的/最终/安装路径 # 后续直接执行安装即可 ninja install - 针对CMake ExternalProject的特殊处理
如果是给ExternalProject_Add配置安装规则,可以直接修改INSTALL_COMMAND参数,指定用cmake --install的方式安装并传入目标前缀,完全规避DESTDIR的默认拼接:ExternalProject_Add( 你的外部项目名 # 其他配置项省略 INSTALL_COMMAND cmake --install . --prefix /你要的/外部项目安装路径 )
注意事项:不要尝试通过设置空DESTDIR的方式适配Ninja构建,该逻辑只在Make构建下生效,Ninja不会处理空DESTDIR的特殊场景。
内容的提问来源于stack exchange,提问作者Deepika Upadhyay
相关产品推荐
相关产品推荐

