【问题标题】:How to not make install step when building external project with cmake使用 cmake 构建外部项目时如何不进行安装步骤
【发布时间】:2016-10-16 18:23:36
【问题描述】:

我正在使用 cmake ExternalProject_Add 命令构建依赖项目:

include(ExternalProject)
...
set(COMMON_BASE_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../CommonBase)

ExternalProject_Add(CommonBaseProject
  SOURCE_DIR ${COMMON_BASE_PROJECT_DIR}
  BINARY_DIR ${COMMON_BASE_PROJECT_DIR}/build
  INSTALL_COMMMAND ""
)   

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${COMMON_BASE_PROJECT_DIR}/include)

add_library(
    ${LIBRARY_NAME}
    SHARED
    ${SRC_FILES}
    ${INCLUDE_FILES}
)

target_link_libraries (Bios ${COMMON_BASE_PROJECT_DIR}/build/libCommonBase.dll)
add_dependencies(Bios CommonBaseProject)

但我得到错误:

[100%] Linking CXX shared library libCommonBase.dll
[100%] Built target CommonBase
[ 50%] Performing install step for 'CommonBaseProject'
make[3]: *** No rule to make target 'install'.  Stop.

我不需要安装步骤,所以我的问题是:如何禁用它?

【问题讨论】:

  • 您的意思是删除“INSTALL_COMMMAND”“”行吗?我试过了,但结果是一样的。

标签: cmake dependencies installation project


【解决方案1】:

您可以使用STEP_TARGETS build 为构建步骤生成一个目标,并添加对该特定目标的依赖。步骤目标命名为<external-project-name>-<step-name>,因此在这种情况下,代表构建步骤的目标将命名为CommonBaseProject-build

您可能还想使用 EXCLUDE_FROM_ALL TRUE 从“全部”目标中排除 CommonBaseProject。

ExternalProject_Add(CommonBaseProject
  SOURCE_DIR ${COMMON_BASE_PROJECT_DIR}
  BINARY_DIR ${COMMON_BASE_PROJECT_DIR}/build
  STEP_TARGETS build
  EXCLUDE_FROM_ALL TRUE
)

add_dependencies(Bios CommonBaseProject-build)

【讨论】:

  • 以后有没有办法为外部项目手动调用安装步骤?例如作为主项目安装步骤的一部分?
  • 您可以add_dependencies(install CommonBaseProject-install) 但这不会全局安装外部项目。如果没有更改,这将安装到本地构建目录。
【解决方案2】:

你几乎拥有它:而不是 INSTALL_COMMAND "" 放入类似的东西

    INSTALL_COMMAND cmake -E echo "Skipping install step."

【讨论】:

  • 您也可以使用true: 命令,它们什么都不做,即INSTALL_COMMAND true。但它仍然会显示Performing install step
  • 这行得通! INSTALL_COMMAND "" 还不够,cmake 仍会运行 install 步骤。
【解决方案3】:

与您已经回答的问题无关,但在我的情况下,我有以下 ExternalProject_Add 指令:

ExternalProject_Add(external_project
    # [...]
    # Override build/install command
    BUILD_COMMAND ""
    INSTALL_COMMAND
        "${CMAKE_COMMAND}"
        --build .
        --target INSTALL    # Wrong casing for "install" target
       --config ${CMAKE_BUILD_TYPE}
)

在这种情况下,cmake 以非常相似的错误 (*** No rule to make target 'INSTALL') 退出,但在这种情况下,外部项目正在寻找不正确的大写 INSTALL 目标:正确的大小写是 install。显然,这在带有 MSVC 的 Windows 中有效,但在 unix 操作系统中失败。

【讨论】:

    【解决方案4】:

    至少从 CMake 3.10 开始,空字符串就足以抑制安装步骤:

    将空字符串作为<cmd> 传递会使安装步骤不执行任何操作。

    其他阶段也是如此;请参阅docs 了解更多信息。

    如果您仍在使用 CMake

    【讨论】:

      猜你喜欢
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 2021-05-09
      • 2016-01-15
      相关资源
      最近更新 更多