【问题标题】:How to use another block as a build step?如何使用另一个块作为构建步骤?
【发布时间】:2015-01-18 12:30:02
【问题描述】:

当我执行“bii cpp:build”时,我希望bii首先构建块B,然后它必须使用一些参数调用块B生成的二进制文件,当二进制文件完成时,bii应该继续构建块A. 我不希望块 A #include 块 B 中的任何内容。本质上我想在块 A 的构建过程中在 cmake add_custom_command 中使用块 B 的输出。如何实现?

【问题讨论】:

  • 第一个问题:二进制B源代码的输出是biicode应该在块A中处理的吗?或者您会使用自定义命令管理自己吗?您还应该考虑到,如果 B 在“deps”中,它通常只检索依赖的东西(#includes)。可能最好的方法是将二进制创建和执行包装在 B 处的 .cmake 文件中,然后在您的 A 块 CMakeLists.txt 中包含()这样的 .cmake。您能否详细说明此类二进制文件的用例,以及您如何假装“重用”它?
  • 我喜欢你的建议@drodri,我会试一试。块 B 生成的二进制文件将是我打算用来为连续构建准备环境路径变量的工具。该工具将读取配置文件中的一些用户定义的设置,或者它会根据环境确定设置。例如,如果 ~/.emscripten 文件存在,那么它将读取它并根据其中的设置准备环境。我怀疑我应该寻找一种纯粹的 CMake 方法。块 B 二进制文件的其他用途,可能是从 markdown 和类似任务生成 html。
  • @drodri,二进制B的输出目前不是源代码,但它可能会生成代码块A在未来某个时候使用。

标签: c++ cmake biicode


【解决方案1】:

目前,“bii”只允许在同一编译时间构建项目中的所有块,但您可以使用一种技巧,手动执行修改后的根 CMakeLists.txt。

我假设您的项目布局如下所示:

your_project
|- bii
|- blocks
|- build
|- cmake
|    |- CMakeLists.txt  # root CMakeLists.txt
|- deps

那你应该修改那个 CMakeLists.txt:

原始代码

PROJECT( my_project )
cmake_minimum_required(VERSION 3.0)

# inclusion of general biicode macros, biicode.cmake 
set(CMAKE_MODULE_PATH "${CMAKE_HOME_DIRECTORY}/cmake"
                      "${CMAKE_HOME_DIRECTORY}/../blocks"
                      "${CMAKE_HOME_DIRECTORY}/../deps")
INCLUDE(biicode.cmake) 

ADD_DEFINITIONS(-DBIICODE)
SET(BIICODE_ENV_DIR C:/Users/Usuario/.biicode)

#artifact to allow upstream configurations
BII_PREBUILD_STEP(blocks/fenix/blockA)
BII_PREBUILD_STEP(blocks/fenix/blockB)

enable_testing()
# Inclusion of the blocks affected by the build
BII_INCLUDE_BLOCK(blocks/fenix/blockA)
BII_INCLUDE_BLOCK(blocks/fenix/blockB)

用这个替换它:

新代码

PROJECT( my_project )
cmake_minimum_required(VERSION 3.0)

# inclusion of general biicode macros, biicode.cmake 
set(CMAKE_MODULE_PATH "${CMAKE_HOME_DIRECTORY}/cmake"
                      "${CMAKE_HOME_DIRECTORY}/../blocks"
                      "${CMAKE_HOME_DIRECTORY}/../deps")
INCLUDE(biicode.cmake) 

ADD_DEFINITIONS(-DBIICODE)
SET(BIICODE_ENV_DIR C:/Users/Usuario/.biicode)

enable_testing()

IF(BUILD_BLOCK_A)
    BII_PREBUILD_STEP(blocks/fenix/blockA)
    BII_INCLUDE_BLOCK(blocks/fenix/blockA)
ELSEIF(BUILD_BLOCK_B)
    BII_PREBUILD_STEP(blocks/fenix/blockB)
    BII_INCLUDE_BLOCK(blocks/fenix/blockB)
ENDIF()

所以,删除 your_project/build 文件夹,创建一个新的空文件夹并执行(我的操作系统是 Windows,我正在使用“MinGW Makefiles”生成器):

your_project$ cd build
your_project/build$ cmake -G "MinGW Makefiles" -DBUILD_BLOCK_B=1 ../cmake
your_project/build$ cmake --build .
your_project/build$ ../bin/your_blockB_executable -your_additional_flags

然后,删除并再次创建它并构建以下块A:

your_project/build$ cmake -G "MinGW Makefiles" -DBUILD_BLOCK_A=1 ../cmake
your_project/build$ cmake --build .
your_project/build$ ../bin/your_blockA_executable

希望对你有帮助! ;)

【讨论】:

  • 小心,每次 bii clean 都会删除你的 cmake 文件夹,里面的所有东西都被认为是临时的
  • 感谢您的回答@fenix688,我会调查的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 2011-07-26
  • 1970-01-01
  • 2017-11-25
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多