Skip to content

Commit f14ea25

Browse files
guitargeekanigamova
authored andcommitted
Don't require gtest on the system
Some older platforms like CentOS 7 don't have `gtest` available in the right version, and it's also more convenient for the users if they are not restricted to environments where gtest is installed.
1 parent 50ac01e commit f14ea25

File tree

4 files changed

+133
-12
lines changed

4 files changed

+133
-12
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ jobs:
5858
shell: bash -l {0}
5959
run: |
6060
# Install dependencies (synchronize with cms-combine-feedstock recipe.yaml)
61-
mamba install -c conda-forge cmake python==${{ matrix.python }} pandas gsl root==${{ matrix.root }} boost-cpp eigen gtest
61+
mamba install -c conda-forge cmake python==${{ matrix.python }} pandas gsl root==${{ matrix.root }} boost-cpp eigen
6262
- name: Build
6363
shell: bash -l {0}
6464
run: |

.github/workflows/cvmfs-ci.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ jobs:
119119
with:
120120
script: |
121121
set -euxo pipefail
122-
sudo dnf install -y gtest-devel
123122
mkdir build_test
124123
cd build_test
125124
cmake ../test
@@ -135,7 +134,7 @@ jobs:
135134
script: |
136135
set -euxo pipefail
137136
sudo yum install -y epel-release
138-
sudo yum install -y cmake3 gtest-devel
137+
sudo yum install -y cmake3
139138
mkdir build_test
140139
cd build_test
141140
cmake3 ../test

CMakeLists.txt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ project(HiggsAnalysisCombinedLimit VERSION 10.2.1)
44

55
option( MODIFY_ROOTMAP "Modify generated Rootmap to take out classes already bundled in StatAnalysis" FALSE )
66
option( USE_VDT "Use VDT (fast and vectorisable mathematical functions)" TRUE )
7-
option( BUILD_TESTS "Build tests" FALSE )
7+
option( BUILD_TESTS "Build unit test executables for additional testing" FALSE )
88

99

1010
# Use the same mechanism as ROOT for the install directories of components (see RootInstallDirs.cmake)
@@ -195,6 +195,4 @@ INSTALL(FILES ${empty_init_py} DESTINATION ${CMAKE_INSTALL_PYTHONDIR}/HiggsAnaly
195195
INSTALL(FILES ${empty_init_py} DESTINATION ${CMAKE_INSTALL_PYTHONDIR}/HiggsAnalysis/CombinedLimit)
196196

197197

198-
if(BUILD_TESTS)
199-
add_subdirectory(test)
200-
endif()
198+
add_subdirectory(test)

test/CMakeLists.txt

Lines changed: 129 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,136 @@ else()
99
set(REPO ${CMAKE_SOURCE_DIR})
1010
endif()
1111

12-
if(NOT DEFINED standalone_tests)
13-
find_package(GTest 1.10 REQUIRED)
14-
endif()
15-
1612
enable_testing()
1713

14+
# Look for gtest. If not found, download it from the web.
15+
# Taken from ROOTs SearchInstalledSoftware.cmake
16+
find_package(GTest 1.10)
17+
if(NOT GTEST_FOUND)
18+
include(ExternalProject)
19+
20+
# Add googletest
21+
# http://stackoverflow.com/questions/9689183/cmake-googletest
22+
23+
set(_gtest_byproduct_binary_dir
24+
${CMAKE_CURRENT_BINARY_DIR}/googletest-prefix/src/googletest-build)
25+
set(_gtest_byproducts
26+
${_gtest_byproduct_binary_dir}/lib/libgtest.a
27+
${_gtest_byproduct_binary_dir}/lib/libgtest_main.a
28+
${_gtest_byproduct_binary_dir}/lib/libgmock.a
29+
${_gtest_byproduct_binary_dir}/lib/libgmock_main.a
30+
)
31+
32+
set(GTEST_CXX_FLAGS "${ROOT_EXTERNAL_CXX_FLAGS}")
33+
if(MSVC)
34+
if(winrtdebug)
35+
set(GTEST_BUILD_TYPE Debug)
36+
else()
37+
set(GTEST_BUILD_TYPE Release)
38+
endif()
39+
set(_gtest_byproducts
40+
${_gtest_byproduct_binary_dir}/lib/gtest.lib
41+
${_gtest_byproduct_binary_dir}/lib/gtest_main.lib
42+
${_gtest_byproduct_binary_dir}/lib/gmock.lib
43+
${_gtest_byproduct_binary_dir}/lib/gmock_main.lib
44+
)
45+
if(CMAKE_GENERATOR MATCHES Ninja)
46+
set(GTEST_BUILD_COMMAND "BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR>")
47+
else()
48+
set(GTEST_BUILD_COMMAND "BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config ${GTEST_BUILD_TYPE}")
49+
endif()
50+
if(asan)
51+
if(NOT winrtdebug)
52+
set(gtestbuild "RelWithDebInfo")
53+
endif()
54+
set(GTEST_CXX_FLAGS "${ROOT_EXTERNAL_CXX_FLAGS} ${ASAN_EXTRA_CXX_FLAGS}")
55+
endif()
56+
set(EXTRA_GTEST_OPTS
57+
-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
58+
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=${_gtest_byproduct_binary_dir}/lib/
59+
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL:PATH=${_gtest_byproduct_binary_dir}/lib/
60+
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=${_gtest_byproduct_binary_dir}/lib/
61+
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO:PATH=${_gtest_byproduct_binary_dir}/lib/
62+
-Dgtest_force_shared_crt=ON
63+
${GTEST_BUILD_COMMAND})
64+
else()
65+
set(GTEST_BUILD_TYPE Release)
66+
endif()
67+
if(APPLE)
68+
set(EXTRA_GTEST_OPTS
69+
-DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT})
70+
endif()
71+
72+
ExternalProject_Add(
73+
googletest
74+
GIT_REPOSITORY https://github.com/google/googletest.git
75+
GIT_SHALLOW 1
76+
GIT_TAG release-1.12.1
77+
UPDATE_COMMAND ""
78+
# # Force separate output paths for debug and release builds to allow easy
79+
# # identification of correct lib in subsequent TARGET_LINK_LIBRARIES commands
80+
# CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs
81+
# -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs
82+
# -Dgtest_force_shared_crt=ON
83+
CMAKE_ARGS -G ${CMAKE_GENERATOR}
84+
-DCMAKE_BUILD_TYPE=${GTEST_BUILD_TYPE}
85+
# Don't inherit from main project, because it doesn't use C (only C++).
86+
#-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
87+
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
88+
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
89+
-DCMAKE_CXX_FLAGS=${GTEST_CXX_FLAGS}
90+
-DCMAKE_AR=${CMAKE_AR}
91+
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
92+
${EXTRA_GTEST_OPTS}
93+
# Disable install step
94+
INSTALL_COMMAND ""
95+
BUILD_BYPRODUCTS ${_gtest_byproducts}
96+
# Wrap download, configure and build steps in a script to log output
97+
LOG_DOWNLOAD ON LOG_CONFIGURE ON LOG_BUILD ON LOG_OUTPUT_ON_FAILURE ON
98+
TIMEOUT 600
99+
)
100+
101+
# Specify include dirs for gtest and gmock
102+
ExternalProject_Get_Property(googletest source_dir)
103+
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include)
104+
set(GMOCK_INCLUDE_DIR ${source_dir}/googlemock/include)
105+
# Create the directories. Prevents bug https://gitlab.kitware.com/cmake/cmake/issues/15052
106+
file(MAKE_DIRECTORY ${GTEST_INCLUDE_DIR} ${GMOCK_INCLUDE_DIR})
107+
108+
# Libraries
109+
ExternalProject_Get_Property(googletest binary_dir)
110+
set(_G_LIBRARY_PATH ${binary_dir}/lib/)
111+
112+
# Use gmock_main instead of gtest_main because it initializes gtest as well.
113+
# Note: The libraries are listed in reverse order of their dependencies.
114+
foreach(lib gtest gtest_main gmock gmock_main)
115+
add_library(${lib} IMPORTED STATIC GLOBAL)
116+
set_target_properties(${lib} PROPERTIES
117+
IMPORTED_LOCATION "${_G_LIBRARY_PATH}${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${CMAKE_STATIC_LIBRARY_SUFFIX}"
118+
)
119+
add_dependencies(${lib} googletest)
120+
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND
121+
${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL 9)
122+
target_compile_options(${lib} INTERFACE -Wno-deprecated-copy)
123+
endif()
124+
endforeach()
125+
target_include_directories(gtest INTERFACE ${GTEST_INCLUDE_DIR})
126+
target_include_directories(gmock INTERFACE ${GMOCK_INCLUDE_DIR})
127+
128+
set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX})
129+
set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest_main${CMAKE_STATIC_LIBRARY_SUFFIX})
130+
set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gmock${CMAKE_STATIC_LIBRARY_SUFFIX})
131+
set_property(TARGET gmock_main PROPERTY IMPORTED_LOCATION ${_G_LIBRARY_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}gmock_main${CMAKE_STATIC_LIBRARY_SUFFIX})
132+
133+
# Starting from cmake 3.23, the GTest targets will have stable names.
134+
# ROOT was updated to use those, but for older CMake versions, we have to declare the aliases:
135+
foreach(LIBNAME gtest_main gmock_main gtest gmock)
136+
if(NOT TARGET GTest::${LIBNAME} AND TARGET ${LIBNAME})
137+
add_library(GTest::${LIBNAME} ALIAS ${LIBNAME})
138+
endif()
139+
endforeach()
140+
endif()
141+
18142
include(CombineTestMacros.cmake)
19143

20144
# Set the location of text2workspace.py, assuming installation to a virtual
@@ -107,7 +231,7 @@ COMBINE_ADD_TEST(template_analysis-text2workspace
107231
)
108232

109233

110-
if(NOT DEFINED standalone_tests)
234+
if(BUILD_TESTS AND NOT DEFINED standalone_tests)
111235
# Build and run the testCreateNLL helper on the generated workspace
112236
COMBINE_ADD_GTEST(template-analysis-testCreateNLL
113237
testCreateNLL.cxx

0 commit comments

Comments
 (0)