2

如果已经有一个克隆了 repo 的文件夹,我需要跳过 git 下载,比如ExternalProject_Add如果你CMakeLists.txt提供了一个,但不想写一个 custom 。如果将依赖项手动添加到文件夹项目中,基本上只需要完全离线构建项目。download_stepupdate_stepGIT_TAGDOWNLOAD_COMMAND

例如:

ExternalProject_Add(civ
  SOURCE_DIR            ${PROJECT_SOURCE_DIR}/test
  BUILD_COMMAND         ${MAKE_EXE}
  BINARY_DIR            "./bin"
  INSTALL_COMMAND       ""
  GIT_REPOSITORY        "https://github.com/test/test"
  GIT_TAG               "v1.0"
  LOG_DOWNLOAD          on
  CMAKE_ARGS
    "-DTuberosumTools_DIR=${TUBEROSUMTOOLS_DIR}"
)

test这样,每次第一次构建项目时都会删除文件夹并再次克隆它(如果我手动删除构建文件夹),我可以在此之后完全离线构建,但确实需要始终离线使用它。已经尝试设置缓存变量,例如:

set(FRESH_DOWNLOAD off CACHE BOOL "download a fresh copy of all dependencies")

include(ExternalProject)
ExternalProject_Add(civ
  SOURCE_DIR            ${PROJECT_SOURCE_DIR}/test
  BUILD_COMMAND         ${MAKE_EXE}
  BINARY_DIR            "./bin"
  INSTALL_COMMAND       ""
  GIT_REPOSITORY        "https://github.com/test/test"
  GIT_TAG               "v1.0"
  if(NOT FRESH_DOWNLOAD)
    DOWNLOAD_COMMAND      ""
  endif()
  CMAKE_ARGS
    "-DTuberosumTools_DIR=${TUBEROSUMTOOLS_DIR}"
)

除非另有说明,否则完全禁用下载,但是对 的if内部调用ExternalProject_Add()显然不起作用,并且使用if外部会引入额外的代码,使其更难维护,而且很难看。

任何简单的替代方案都是有效的,在此先感谢。

4

3 回答 3

1

您可以尝试FetchContent然后ExternalProject使用FetchContent. 像这样的东西:

include(FetchContent)
FetchContent_Declare(
    mylib
    GIT_REPOSITORY "git@github.com:username/mylib.git"
    GIT_TAG <some sha>
)
FetchContent_MakeAvailable(mylib)

include(ExternalProject)
ExternalProject_Add(
    mylib
    SOURCE_DIR "_deps/mylib-src/"
    CONFIGURE_COMMAND ""
    INSTALL_COMMAND ""
    BUILD_COMMAND "pwd"
)
于 2021-11-09T13:07:49.430 回答
1

调用函数或宏时,CMake 允许替换一个变量,该变量一次包含多个参数。也就是说,您可以有条件地定义一个负责下载步骤的变量:

set(FRESH_DOWNLOAD off CACHE BOOL "download a fresh copy of all dependencies")

include(ExternalProject)
if (NOT FRESH_DOWNLOAD)
    # Define the variable to disable DOWNLOAD step
    set(civ_DOWNLOAD DOWNLOAD_COMMAND      "")
else()
    # Define an empty variable.
    # This actually can be omitted since absent variable is treated as empty.
    set(civ_DOWNLOAD)
endif()

ExternalProject_Add(civ
  SOURCE_DIR            ${PROJECT_SOURCE_DIR}/test
  BUILD_COMMAND         ${MAKE_EXE}
  BINARY_DIR            "./bin"
  INSTALL_COMMAND       ""
  GIT_REPOSITORY        "https://github.com/test/test"
  GIT_TAG               "v1.0"
  ${civ_DOWNLOAD} # IMPORTANT: Do not use double quotes here.
  CMAKE_ARGS
    "-DTuberosumTools_DIR=${TUBEROSUMTOOLS_DIR}"
)
于 2020-12-06T09:32:37.050 回答
0

更新/补丁步骤选项:GIT_TAG每当重新运行 CMake 时,默认情况下,如果下载方法支持更新,则外部项目的源将被更新(例如,如果 git 存储库未引用特定提交, 则将检查)。

UPDATE_DISCONNECTED <bool> 启用后,此选项会导致跳过更新步骤。但是,它不会阻止下载步骤。更新步骤仍然可以作为步骤目标添加(请参阅 ExternalProject_Add_StepTargets())并手动调用。如果您希望允许开发人员在与网络断开连接时构建项目,这将非常有用(尽管下载步骤可能仍需要网络)。

参考:https ://cmake.org/cmake/help/latest/module/ExternalProject.html

于 2020-12-06T09:29:21.273 回答