【问题标题】:How to install only one executable with make install?如何使用 make install 只安装一个可执行文件?
【发布时间】:2019-07-09 07:53:10
【问题描述】:

我有一个包含 CMakeLists.txt 和 7 个可执行文件的项目:

/Project
  /build
  /Subprogram1
  /Subprogram2
  ...
  /Subprogram7
  CMakeLists.txt

我的 CMakeLists.txt :

project(Project)
cmake_minimum_required(VERSION 2.8)

set( CMAKE_CXX_FLAGS "-O0 -Wall -pedantic -std=c++11" )

include_directories( "${PROJECT_SOURCE_DIR}/headers" )
include_directories( "${PROJECT_SOURCE_DIR}/Subprogram1/headers" )
include_directories( "${PROJECT_SOURCE_DIR}/Subprogram2/headers" )
include_directories( "${PROJECT_SOURCE_DIR}/Subprogram3/headers" )
....
include_directories( "${PROJECT_SOURCE_DIR}/Subprogram7/headers" )



set( INSTALL_PATH /usr/local/bin/ )
set( INSTALL_MANPAGES_PATH /usr/local/man/man1 )



add_executable(Subprogram1
         "${PROJECT_SOURCE_DIR}/headers/headers.h"
         "${PROJECT_SOURCE_DIR}/Subprogram1/headers/headers1.cpp"
         "${PROJECT_SOURCE_DIR}/Subprogram1/src/main.cpp")

....

add_executable(Subprogram7
         "${PROJECT_SOURCE_DIR}/headers/headers.h"
         "${PROJECT_SOURCE_DIR}/Subprogram7/headers/headers7.cpp"
         "${PROJECT_SOURCE_DIR}/Subprogram7/src/main.cpp")




install( TARGETS Subprogram1 DESTINATION ${INSTALL_PATH} )
...
install( TARGETS Subprogram7 DESTINATION ${INSTALL_PATH} )

install( FILES "${PROJECT_SOURCE_DIR}/manpages/Subprogram1.1" DESTINATION ${INSTALL_MANPAGES_PATH})
...
install( FILES "${PROJECT_SOURCE_DIR}/manpages/Subprogram7.1" DESTINATION ${INSTALL_MANPAGES_PATH})

我只想构建和安装一个 Subprogram3。在文件夹 /build 我输入:

cmake ../
make Subprogram3
make install

但是 Cmake 和 Make util 制作了所有程序并安装了它们。我只想要一个 Subprogram3。怎么做?而且我想将我的 CMakeLists.txt 保存为不可变的,并且只找到 cmake 或 make utils 所需的命令行参数。怎么做?

【问题讨论】:

  • “我想将我的 CMakeLists.txt 保存为不可变的,并且只找到 cmake 或 make utils 所需的命令行参数。” - 你不能。在 CMake 中,make install 始终安装在脚本中发出 install 命令的所有内容。因此,您需要将您的项目调整为 可配置。例如。通过添加一个选项,该选项(如果设置)仅启用特定的install() 调用。
  • 注意,如果你打算打包你的项目,那么 CMake 提供了cpack 工具。使用此工具,您可以根据 install 调用的 COMPONENT 选项将包拆分为多个部分。所以可能有一部分包只包含一个特定的文件。
  • @Tsyvarev 谢谢!如果简短,答案是否定的。因为我现在还没有计划打包我的项目。请写下你的答案,如果每个人都不会得到另一个解决方案,我会检查它。

标签: c++ makefile cmake


【解决方案1】:

CMake 项目的安装总是处理 allinstall()CMakeLists.txt 中的调用。不能要求 CMake 只安装一个特定的文件。

此外,安装阶段取决于ALL 目标作为整体。 CMake 不会在已安装文件(或目标)和创建这些文件(或目标)的命令之间创建依赖关系。

因此,如果您计划仅构建和安装选定的文件/目标,您的脚本应发出仅创建此文件/目标的命令,并仅针对给定文件/目标发出 install。这可以通过例如您传递给cmakeoption 来实现。


如果项目没有安装而是打包(使用cpack),情况就完全不同了。

安装阶段仍然完全执行,它仍然依赖于ALL

但是可以将项目中的install-ed 文件分发到几个包中。因此,其中一个包将仅包含一个特定文件。这是通过为install 命令分配不同的COMPONENT 选项来实现的。

【讨论】:

  • 我希望你能澄清这个答案中似乎有两个相互矛盾的陈述:“一个人不能要求 CMake 只安装一个特定的文件。”和“你的脚本应该发出只创建这个文件/目标的命令,并且只为给定的文件/目标发出安装。这可以通过例如你传递给 cmake 的选项来实现”。您指的是 cmake 命令行选项还是 CMakeLists.txt 文件中可用的 option() 关键字?
  • @RichvonLehe:我指的是option 命令。但除其他外,此命令用于处理用户指定的命令行选项。至于可能的矛盾,如果脚本CMakeLists.txt 只发出一个install() 调用,那么在make install 上只会处理该调用。也就是说,CMake 确实会处理 所有 安装调用,但也确实只会安装单个文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 1970-01-01
  • 2019-08-18
  • 2011-03-30
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多