File: cmake-googletest.patch

package info (click to toggle)
opentelemetry-cpp 1.19.0-3~bpo12%2B1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-backports
  • size: 8,740 kB
  • sloc: cpp: 79,029; sh: 1,640; makefile: 43; python: 31
file content (130 lines) | stat: -rw-r--r-- 5,618 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
Description: Build googletest along with the opentelemetry-cpp code
 Using the precompiled shared libraries is not recommended, as for
 opentelemetry-cpp, some tests end up failing.
Bug: https://github.com/open-telemetry/opentelemetry-cpp/issues/3267
Forwarded: https://github.com/open-telemetry/opentelemetry-cpp/pull/3290/
Author: Santiago Ruano Rincón <santiago@freexian.com>
Last-Update: 2025-03-04

Index: opentelemetry-cpp/CMakeLists.txt
===================================================================
--- opentelemetry-cpp.orig/CMakeLists.txt
+++ opentelemetry-cpp/CMakeLists.txt
@@ -613,19 +613,8 @@ list(APPEND CMAKE_PREFIX_PATH "${CMAKE_B
 
 include(CTest)
 if(BUILD_TESTING)
-  if(EXISTS ${CMAKE_BINARY_DIR}/lib/libgtest.a)
-    # Prefer GTest from build tree. GTest is not always working with
-    # CMAKE_PREFIX_PATH
-    set(GTEST_INCLUDE_DIRS
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include
-        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googlemock/include)
-    if(TARGET gtest)
-      set(GTEST_BOTH_LIBRARIES gtest gtest_main)
-    else()
-      set(GTEST_BOTH_LIBRARIES ${CMAKE_BINARY_DIR}/lib/libgtest.a
-                               ${CMAKE_BINARY_DIR}/lib/libgtest_main.a)
-    endif()
-  elseif(WIN32)
+
+  if(WIN32)
     # Make sure we are always bootsrapped with vcpkg on Windows
     find_package(GTest)
     if(NOT (GTEST_FOUND OR GTest_FOUND))
@@ -641,9 +630,81 @@ if(BUILD_TESTING)
       endif()
     endif()
   else()
-    # Prefer GTest installed by OS distro, brew or vcpkg package manager
-    find_package(GTest REQUIRED)
+    # Build googletest from sources. This is the preferred way.
+    set(GTEST_SRC_DIR_DEFAULT ${CMAKE_SOURCE_DIR}/third_party/googletest)
+    set(GTEST_SRC_DIR ${GTEST_SRC_DIR_DEFAULT} CACHE STRING "Location of gtest sources")
+    if(EXISTS ${GTEST_SRC_DIR}/googletest/src/gtest-all.cc)
+
+      include(ExternalProject)
+
+      # Build googletest/googletest from sources available as third party
+      ExternalProject_Add(
+        googletest
+        DOWNLOAD_COMMAND ""
+        SOURCE_DIR ${GTEST_SRC_DIR}/googletest
+        INSTALL_COMMAND ""
+        LOG_CONFIGURE ON
+        LOG_BUILD ON
+        CMAKE_ARGS  -DBUILD_SHARED_LIBS=ON
+                    -DCMAKE_POSITION_INDEPENDENT_CODE=ON
+                    #BUILD_BYPRODUCTS
+                    #${CMAKE_BINARY_DIR}/googletest-prefix/src/googletest-build/lib/libgtest.so
+                    #${CMAKE_BINARY_DIR}/googletest-prefix/src/googletest-build/lib/libgtest_main.so
+      )
+      message(STATUS "Building googletest from sources in ${GTEST_SRC_DIR}")
+
+      set(GTEST_LIBRARY_PATH ${CMAKE_BINARY_DIR}/googletest-prefix/src/googletest-build/lib/libgtest.so)
+      add_library(GTest::gtest SHARED IMPORTED)
+      set_target_properties(GTest::gtest PROPERTIES IMPORTED_LOCATION
+        ${GTEST_LIBRARY_PATH})
+      add_dependencies(GTest::gtest googletest)
+
+      set(GTEST_MAIN_LIBRARY_PATH  ${CMAKE_BINARY_DIR}/googletest-prefix/src/googletest-build/lib/libgtest_main.so)
+      add_library(GTest::gtest_main SHARED IMPORTED)
+      set_target_properties(GTest::gtest_main PROPERTIES IMPORTED_LOCATION
+        ${GTEST_MAIN_LIBRARY_PATH})
+      add_dependencies(GTest::gtest_main googletest)
+
+      ExternalProject_Get_Property(googletest source_dir)
+      set(GTEST_INCLUDE_DIR ${source_dir}/include)
+
+      # Build googletest/googlemock from sources available as third party
+      ExternalProject_Add(
+          googlemock
+          DOWNLOAD_COMMAND ""
+          SOURCE_DIR ${GTEST_SRC_DIR}/googlemock
+          INSTALL_COMMAND ""
+          LOG_CONFIGURE ON
+          LOG_BUILD ON
+          CMAKE_ARGS -DBUILD_SHARED_LIBS=ON
+                     -DCMAKE_POSITION_INDEPENDENT_CODE=ON
+      )
+      message(STATUS "Building googlemock from sources in ${GTEST_SRC_DIR}")
+
+      set(GMOCK_LIBRARY_PATH ${CMAKE_BINARY_DIR}/googlemock-prefix/src/googlemock-build/lib/libgmock.so)
+      add_library(GTest::gmock SHARED IMPORTED)
+      set_target_properties(GTest::gmock PROPERTIES IMPORTED_LOCATION
+        ${GMOCK_LIBRARY_PATH})
+      add_dependencies(GTest::gmock googlemock)
+
+      set(GMOCK_MAIN_LIBRARY_PATH  ${CMAKE_BINARY_DIR}/googlemock-prefix/src/googlemock-build/lib/libgmock_main.so)
+      add_library(GTest::gmock_main SHARED IMPORTED)
+      set_target_properties(GTest::gmock_main PROPERTIES IMPORTED_LOCATION
+        ${GMOCK_MAIN_LIBRARY_PATH})
+      add_dependencies(GTest::gtest_main googlemock)
+
+      set(GTEST_INCLUDE_DIRS
+          ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include
+          ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googlemock/include)
+
+      set(GTEST_BOTH_LIBRARIES GTest::gtest_main GTest::gtest)
+      set(GMOCK_LIB GTest::gmock)
+
+    else()
+      message(FATAL_ERROR "UNIT_TEST is set but unable to find gtest library source code")
+    endif()
   endif()
+
   if(NOT GTEST_BOTH_LIBRARIES)
     # New GTest package names
     if(TARGET GTest::gtest)
@@ -657,6 +718,11 @@ if(BUILD_TESTING)
   endif()
   message(STATUS "GTEST_INCLUDE_DIRS   = ${GTEST_INCLUDE_DIRS}")
   message(STATUS "GTEST_BOTH_LIBRARIES = ${GTEST_BOTH_LIBRARIES}")
+  message(STATUS "gtest library path ${GTEST_LIBRARY_PATH}")
+  message(STATUS "gtest main library path ${GTEST_MAIN_LIBRARY_PATH}")
+  message(STATUS "GMOCK_LIB = ${GMOCK_LIB}")
+  message(STATUS "gmock library path ${GMOCK_LIBRARY_PATH}")
+  message(STATUS "gmock main library path ${GMOCK_MAIN_LIBRARY_PATH}")
 
   # Try to find gmock
   if(NOT GMOCK_LIB AND TARGET GTest::gmock)