From 0c93c7ae03b8515fe99521e6ce35c1528bb799e7 Mon Sep 17 00:00:00 2001
From: Alexey Vishnyakov <vishnya@ispras.ru>
Date: Sun, 6 Dec 2020 05:27:35 +0300
Subject: [PATCH] Fix finding .git directory in CMake when z3 is a submodule of
 some other repository (#4850)

* Fix finding .git directory in CMake when z3 is a submodule of some other repository

* Check that z3 is a submodule
---
 cmake/git_utils.cmake | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/cmake/git_utils.cmake b/cmake/git_utils.cmake
index dbc95d8df..2e2645c37 100644
--- a/cmake/git_utils.cmake
+++ b/cmake/git_utils.cmake
@@ -34,11 +34,20 @@ function(add_git_dir_dependency GIT_DOT_FILE SUCCESS_VAR)
       # Figure out where real git directory lives
       set(GIT_COMMON_DIR_FILE "${GIT_WORKTREE_DIR}/commondir")
       if (NOT EXISTS "${GIT_COMMON_DIR_FILE}")
-        message(FATAL_ERROR "Found git worktree dir but could not find \"${GIT_COMMON_DIR_FILE}\"")
+        get_filename_component(GIT_WORKTREE_PARENT "${GIT_WORKTREE_DIR}" DIRECTORY)
+        get_filename_component(GIT_WORKTREE_PARENT "${GIT_WORKTREE_PARENT}" NAME)
+        if ("${GIT_WORKTREE_PARENT}" STREQUAL "modules")
+          # Z3 is a git submodule
+          set(GIT_HEAD_FILE "${CMAKE_SOURCE_DIR}/${GIT_HEAD_FILE}")
+          set(GIT_DIR "${CMAKE_SOURCE_DIR}/${GIT_WORKTREE_DIR}")
+        else()
+          message(FATAL_ERROR "Found git worktree dir but could not find \"${GIT_COMMON_DIR_FILE}\"")
+        endif()
+      else()
+        file(READ "${GIT_COMMON_DIR_FILE}" GIT_COMMON_DIR_FILE_DATA LIMIT 512)
+        string(STRIP "${GIT_COMMON_DIR_FILE_DATA}" GIT_COMMON_DIR_FILE_DATA_STRIPPED)
+        get_filename_component(GIT_DIR "${GIT_WORKTREE_DIR}/${GIT_COMMON_DIR_FILE_DATA_STRIPPED}" ABSOLUTE)
       endif()
-      file(READ "${GIT_COMMON_DIR_FILE}" GIT_COMMON_DIR_FILE_DATA LIMIT 512)
-      string(STRIP "${GIT_COMMON_DIR_FILE_DATA}" GIT_COMMON_DIR_FILE_DATA_STRIPPED)
-      get_filename_component(GIT_DIR "${GIT_WORKTREE_DIR}/${GIT_COMMON_DIR_FILE_DATA_STRIPPED}" ABSOLUTE)
       if (NOT IS_DIRECTORY "${GIT_DIR}")
         message(FATAL_ERROR "Failed to compute path to git directory from git worktree")
       endif()