简体   繁体   English

使用cmake构建外部项目时如何不进行安装步骤

[英]How to not make install step when building external project with cmake

I'm building dependency project with cmake ExternalProject_Add command:我正在使用 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)

but i get error:但我得到错误:

[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.

I don't need to make install step, so my question is: how to disable it?我不需要进行安装步骤,所以我的问题是:如何禁用它?

You can generate a target for the build step with STEP_TARGETS build and add dependency on this particular target. 您可以使用STEP_TARGETS build生成构建步骤的目标,并添加对此特定目标的依赖性。 The step targets are named <external-project-name>-<step-name> so in this case the target representing the build step will be named CommonBaseProject-build . 步骤目标名为<external-project-name>-<step-name>因此在这种情况下,表示构建步骤的目标将命名为CommonBaseProject-build

You probably also want to exclude the CommonBaseProject from the "all" target with EXCLUDE_FROM_ALL TRUE . 您可能还希望使用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)

你几乎拥有它:而不是INSTALL_COMMAND ""东西

    INSTALL_COMMAND cmake -E echo "Skipping install step."

Not relevant to your question, which it was already answered, but in my case I had the following ExternalProject_Add directive: 与您的问题无关,已经回答了问题,但在我的情况下,我有以下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}
)

In this case cmake quits with very similar error ( *** No rule to make target 'INSTALL' ), but in this case it's the external project that is looking for incorrect uppercase INSTALL target: correct case is install instead. 在这种情况下,cmake以非常相似的错误退出( *** No rule to make target 'INSTALL' ),但在这种情况下,它是寻找不正确的大写INSTALL目标的外部项目:正确的情况是install Apparently, that worked in Windows with MSVC but fails in unix operating systems. 显然,这在Windows中使用MSVC但在unix操作系统中失败。

Since at least CMake 3.10 the empty string is sufficient to suppress the install step:由于至少 CMake 3.10 空字符串足以抑制安装步骤:

Passing an empty string as the <cmd> makes the install step do nothing.将空字符串作为<cmd>传递使安装步骤不执行任何操作。

The same goes for the other stages;其他阶段也是如此; see the docs for more.请参阅 文档了解更多信息。

If you're still building with CMake <3.10 then you need to update CMake ;)如果您仍在使用 CMake <3.10 进行构建,那么您需要更新 CMake ;)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM