如何通过make install仅安装一个可执行文件?

时间:2019-07-09 07:53:10

标签: c++ makefile cmake

我有一个带有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})

那么我只想构建和安装一个子程序3。在文件夹/ build中,我输入:

cmake ../
make Subprogram3
make install

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

1 个答案:

答案 0 :(得分:0)

CMake项目的安装始终处理所有 install()中的CMakeLists.txt调用。不能要求CMake仅安装专用文件。

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

因此,如果您打算仅构建和安装选定的文件/目标,则脚本应发出仅创建此文件/目标的命令,并仅针对给定的文件/目标发布install。例如,您可以将option传递给cmake


如果未安装项目但打包(使用cpack),情况就大不相同了。

完整的安装阶段已经完成,仍然取决于ALL的整个情况。

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