首页 > 解决方案 > 如何让 CMake 的 ExternalProject_Add 在 Visual Studio 中工作(git-submodule 问题)?

问题描述

我正在尝试在 Visual Studio 2017 中构建Pangolin以直接在 Windows 10 上构建。Pangolin 的 CMake 涉及以下命令:

ExternalProject_Add( __glew
  PREFIX "${CMAKE_CURRENT_BINARY_DIR}/glew"
  GIT_REPOSITORY https://github.com/Perlmint/glew-cmake.git
  GIT_TAG 7574ab4d00b683e56adbfdec7da636529dfe65d8
  INSTALL_DIR ${CMAKE_INSTALL_PREFIX}
  CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
             -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
             -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}
             -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}
             -DCMAKE_C_FLAGS_MINSIZEREL=${CMAKE_C_FLAGS_MINSIZEREL}
             -DCMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO}
)

运行此代码时,我收到以下错误:

fatal: 'submodule' appears to be a git command, but we were not
able to execute it. Maybe git-submodule is broken?

我的分析表明,这发生在执行以下生成的 CMake 代码(来自build-dir/external/glew/tmp/__glew-gitclone.cmake)期间:

execute_process(
  COMMAND "C:/Program Files/Git/mingw64/bin/git.exe"  submodule update --recursive --init 
  WORKING_DIRECTORY "C:/Users/scrambledusername/Garage/Pangolin/build/external/glew/src/__glew"
  RESULT_VARIABLE error_code
  )
if(error_code)
  message(FATAL_ERROR "Failed to update submodules in: 'C:/Users/scrambledusername/Garage/Pangolin/build/external/glew/src/__glew'")
endif()

换句话说,该命令git submodule update --recursive --init会导致错误。但是,通过 Git Bash 手动运行时不会导致错误。

一些研究(也在相关提交中和此处)表明这可能与 git 路径或带有 git-submodule 脚本的路径(对我而言)应该添加到系统路径有关。将这些添加到系统路径(对于系统或用户)不会影响结果(重新启动系统,VS 只是为了确保注册新路径)。我还尽我所能确保脚本文件本身对任何用户都具有运行权限(对此有什么警告吗?)。C:\Program Files\Git\mingw64\libexec\git-core

从 cmd 复制/粘贴:

C:\WINDOWS\system32>echo %PATH%
C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\mingw64\libexec\git-core;C\Program Files\...

有谁知道如何使它工作或有任何建议?

当前解决方法:BUILD_EXTERN_GLEW=OFF在 CMake 中设置并根据其 CMake 手动签出并构建 GLEW Pangolin 需要的版本。

版本:

[编辑(附加信息)]

  1. 从 Git Bash、命令提示符或通过 CMake-gui 运行 cmake 时,我得到了相同的结果。
  2. 我在另一台机器上完美构建了旧版本的 Git 和 CMake。

标签: gitcmakevisual-studio-2017git-submodules

解决方案


我可以通过从普通命令提示符而不是 git bash 运行 cmake 来解决这个问题。似乎 git bash 会产生非 ascii 路径,这会导致一些 git 命令失败。(请参阅https://stackoverflow.com/a/58192041 - 希望在 git 2.24 中得到修复)


推荐阅读