【问题标题】:CMake ExternalProject_Add: How to build multiple msbuild targets?CMake ExternalProject_Add:如何构建多个 msbuild 目标?
【发布时间】:2018-02-08 16:09:27
【问题描述】:

我想用 MSBuild 构建一个 CMake ExternalProject。但我也只想构建外部项目解决方案的一个子集。所以基本上是这样的

ExternalProject_Add(MyExternalProject
  PREFIX ${CMAKE_BINARY_DIR}/External/myproject
    GIT_REPOSITORY ...
    CONFIGURE_COMMAND ...
    BUILD_COMMAND msbuild /p:Configuration=Release /target:TargetA;TargetB /m Project.sln
)

不幸的是,CMake 总是将 ; 替换为空格,因此 msbuild 抱怨它已获得多个项目 (*.sln) 文件。

我尝试了所有方法:引用参数,将整个构建命令放入变量中,转义分号......没有任何效果。

最初我也尝试使用 CMake 的 --build-parameter 构建但没有成功。

【问题讨论】:

  • mail-archive.com/cmake@cmake.org/msg16813.html 提示您需要引号和转义符。
  • 我没有找到将多个目标传递给 CMake build --target-parameter 的方法。
  • @IdeaHat,我已经阅读了该消息,但我仍然不确定我还应该逃避什么——;"

标签: c++ msbuild cmake


【解决方案1】:

您可以在BUILD_COMMAND 选项中再添加一条构建指令:

ExternalProject_Add(
    MyExternalProject
    ...
    BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target TargetA
    COMMAND "${CMAKE_COMMAND}" --build . --target TargetB
)

【讨论】:

  • 这行得通。但是在一个 msbuild-call 中指定目标时,我得到了更好的项目构建并行性。
【解决方案2】:

如果你用逗号而不是分号分隔目标,它会起作用:

BUILD_COMMAND msbuild /p:Configuration=Release /target:TargetA,TargetB /m Project.sln

【讨论】:

    【解决方案3】:

    你可以替换';'在字符串中使用不同的列表分隔符,不受 CMake 影响,例如

    ExternalProject_Add(MyExternalProject
      PREFIX ${CMAKE_BINARY_DIR}/External/myproject
        GIT_REPOSITORY ...
        CONFIGURE_COMMAND ...
        LIST_SEPARATOR ^^
        BUILD_COMMAND msbuild /p:Configuration=Release /target:TargetA^^TargetB /m Project.sln
    )
    

    然后将“^^”替换为分号执行。

    我在这里找到了这个答案: https://cmake.org/pipermail/cmake/2012-February/049148.html

    【讨论】:

      猜你喜欢
      • 2015-09-22
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多