From 21b6127dbcff3060d25a49b13921df3dc3aeda4a Mon Sep 17 00:00:00 2001
From: Manuel Weberndorfer <manuel.weberndorfer@id.ethz.ch>
Date: Wed, 28 Apr 2021 09:15:38 +0000
Subject: [PATCH] customize finding googletest

- use source at /usr/src/googletest if not found
- automatically builds library in dev environment
---
 cmake/modules/FindAE108_GTest.cmake | 50 +++++++++++++++++++++++++++++
 cmdline/test/CMakeLists.txt         |  2 +-
 cppptest/src/CMakeLists.txt         |  2 +-
 elements/test/CMakeLists.txt        |  2 +-
 4 files changed, 53 insertions(+), 3 deletions(-)
 create mode 100644 cmake/modules/FindAE108_GTest.cmake

diff --git a/cmake/modules/FindAE108_GTest.cmake b/cmake/modules/FindAE108_GTest.cmake
new file mode 100644
index 00000000..4ced8d16
--- /dev/null
+++ b/cmake/modules/FindAE108_GTest.cmake
@@ -0,0 +1,50 @@
+# © 2021 ETH Zurich, Mechanics and Materials Lab
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+find_package(GTest 1.8.1 CONFIG)
+if (NOT GTest_FOUND)
+    set(FETCHCONTENT_SOURCE_DIR_AE108_GOOGLETEST "/usr/src/googletest")
+    if (IS_DIRECTORY "${FETCHCONTENT_SOURCE_DIR_AE108_GOOGLETEST}")
+        message(STATUS
+            "GTest was not found, using source at ${FETCHCONTENT_SOURCE_DIR_AE108_GOOGLETEST} instead."
+        )
+
+        include(FetchContent)
+        FetchContent_Declare("ae108_googletest")
+        FetchContent_GetProperties(
+            ae108_googletest
+            SOURCE_DIR ae108_googletest_SOURCE_DIR
+            BINARY_DIR ae108_googletest_BINARY_DIR
+            POPULATED ae108_googletest_POPULATED
+        )
+        if (NOT ae108_googletest_POPULATED)
+            FetchContent_Populate("ae108_googletest")
+            add_subdirectory(
+                "${ae108_googletest_SOURCE_DIR}"
+                "${ae108_googletest_BINARY_DIR}"
+                EXCLUDE_FROM_ALL
+            )
+        endif()
+
+        foreach(LIBRARY_NAME gtest gmock gtest_main gmock_main)
+            add_library("GTest::${LIBRARY_NAME}" ALIAS "${LIBRARY_NAME}")
+        endforeach()
+
+        set(GTest_FOUND TRUE)
+    endif()
+endif()
+
+find_package_handle_standard_args(AE108_GTest
+    REQUIRED_VARS GTest_FOUND
+)
\ No newline at end of file
diff --git a/cmdline/test/CMakeLists.txt b/cmdline/test/CMakeLists.txt
index 27137239..969628f4 100644
--- a/cmdline/test/CMakeLists.txt
+++ b/cmdline/test/CMakeLists.txt
@@ -19,7 +19,7 @@ add_executable(${PROJECT_NAME}-CmdLineTests
                ./CommandLineOptionParser_Test.cc
 )
 
-find_package(GTest 1.8.1 CONFIG REQUIRED)
+find_package(AE108_GTest MODULE REQUIRED)
 target_link_libraries(${PROJECT_NAME}-CmdLineTests
                       PRIVATE ${PROJECT_NAME}::cmdline
                       PRIVATE GTest::gmock_main
diff --git a/cppptest/src/CMakeLists.txt b/cppptest/src/CMakeLists.txt
index ce8fd36c..b58b60c1 100644
--- a/cppptest/src/CMakeLists.txt
+++ b/cppptest/src/CMakeLists.txt
@@ -25,8 +25,8 @@ add_library(${PROJECT_NAME}::cppptest ALIAS ${PROJECT_NAME}-cppptest)
 
 target_include_directories(${PROJECT_NAME}-cppptest PUBLIC include)
 
+find_package(AE108_GTest MODULE REQUIRED)
 find_package(AE108_PETSc 3.10 MODULE REQUIRED)
-find_package(GTest 1.8.1 CONFIG REQUIRED)
 target_link_libraries(${PROJECT_NAME}-cppptest
                       PRIVATE ${PROJECT_NAME}::external::petsc
                       PUBLIC GTest::gmock
diff --git a/elements/test/CMakeLists.txt b/elements/test/CMakeLists.txt
index 49076723..0e038c9f 100644
--- a/elements/test/CMakeLists.txt
+++ b/elements/test/CMakeLists.txt
@@ -46,7 +46,7 @@ add_executable(${PROJECT_NAME}-ElementsTests
 
 add_test(NAME ${PROJECT_NAME}-ElementsTests COMMAND $<TARGET_FILE:${PROJECT_NAME}-ElementsTests>)
 
-find_package(GTest 1.8.1 CONFIG REQUIRED)
+find_package(AE108_GTest MODULE REQUIRED)
 target_link_libraries(${PROJECT_NAME}-ElementsTests PUBLIC
                       ${PROJECT_NAME}-elements
                       GTest::gmock_main
-- 
GitLab