Re: [OE-core][dunfell 16/18] cmake: FindGTest: Add target for gmock library

Jasper Orschulko
2021-12-10T18:49:16Z

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Hello everyone,

after some digging we identified the issue to be on our part.
We have been using "GTEST_LIBRARY" and "GTEST_MAIN_LIBRARY" in our
CMake scripts instead of "GTEST_LIBRARIES" and "GTEST_MAIN_LIBRARIES",
as described in the cmake docs:
https://cmake.org/cmake/help/v3.16/module/FindGTest.html#result-variables

So all good here! :)

- --
With best regards

Jasper Orschulko
DevOps Engineer

Tel. +49 30 58 58 14 265
Fax +49 30 58 58 14 999
Jasper.Orschulko@iris-sensing.com

• • • • • • • • • • • • • • • • • • • • • • • • • •

iris-GmbH
infrared & intelligent sensors
Schnellerstraße 1-5 | 12439 Berlin

https://iris-sensing.com/

On Thu, 2021-12-09 at 09:32 -1000, Steve Sakoman wrote:
> On Thu, Dec 9, 2021 at 7:38 AM Jasper Orschulko
> <Jasper.Orschulko@iris-sensing.com> wrote:
> >
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA256
> >
> > Hi,
> >
> > I can't provide any details yet, but I can say with certainty that
> > this
> > patch breaks our build (using the parent commit
> >         746b301d37f9b7333f3d93e6fb7ea2808665df41 as refspec during
> > the build worksasexpected):
> >
> > [...] undefined reference to `testing::*
> >
> > Can someone confirm this issue? Feel free to reach out for further
> > details.
>
> I've not seen any issues in either local or autobuilder testing, so I
> think we need more details!
>
> Steve
>
> > On Fri, 2021-12-03 at 08:19 -1000, Steve Sakoman wrote:
> > > From: Eero Aaltonen <eero.aaltonen@vaisala.com>
> > >
> > > `googlemock` has been absorbed into the
> > > [googletest](https://github.com/google/googletest) project and is
> > > built
> > > and installed from the same source tree.
> > >
> > > `googletest` has provided a CMake Config-file Package starting
> > > with
> > > GTest 1.8.1. `find_package(GTest ...)` by default dispatches
> > > first to
> > > CMake Find Module. Starting with CMake commit
> > > 2327b4330cce157d616ff8b611b3e77568d00351 in CMake v3.20.0 the
> > > module
> > > dispatches onward to the Config-file Package so that the same
> > > targets
> > > are available. In pre v3.20.0 versions of CMake however the Find
> > > Module
> > > masks the targets provided by the upstream `GTest` package.
> > >
> > > Update `Modules/FindGTest.cmake` to provide the same targets as
> > > the
> > > CMake Config-file Package and backwards compatible targets and
> > > result
> > > variables.
> > >
> > > Signed-off-by: Eero Aaltonen <eero.aaltonen@vaisala.com>
> > > Signed-off-by: Steve Sakoman <steve@sakoman.com>
> > > ---
> > >  .../cmake/cmake-native_3.16.5.bb              |   1 +
> > >  ...ndGTest-Add-target-for-gmock-library.patch | 255
> > > ++++++++++++++++++
> > >  2 files changed, 256 insertions(+)
> > >  create mode 100644 meta/recipes-devtools/cmake/cmake/0006-cmake-
> > > FindGTest-Add-target-for-gmock-library.patch
> > >
> > > diff --git a/meta/recipes-devtools/cmake/cmake-native_3.16.5.bb
> > > b/meta/recipes-devtools/cmake/cmake-native_3.16.5.bb
> > > index b2952ee5f5..96a7be6770 100644
> > > --- a/meta/recipes-devtools/cmake/cmake-native_3.16.5.bb
> > > +++ b/meta/recipes-devtools/cmake/cmake-native_3.16.5.bb
> > > @@ -7,6 +7,7 @@ SRC_URI += "file://OEToolchainConfig.cmake \
> > >              file://environment.d-cmake.sh \
> > >
> > > file://0001-CMakeDetermineSystem-use-oe-environment-vars-to-load.patch
> > >  \
> > >
> > > file://0005-Disable-use-of-ext2fs-ext2_fs.h-by-cmake-s-internal-.patch
> > >  \
> > > +
> > > file://0006-cmake-FindGTest-Add-target-for-gmock-library.patch \
> > >              "
> > >
> > >
> > > diff --git a/meta/recipes-devtools/cmake/cmake/0006-cmake-
> > > FindGTest-
> > > Add-target-for-gmock-library.patch b/meta/recipes-
> > > devtools/cmake/cmake/0006-cmake-FindGTest-Add-target-for-gmock-
> > > library.patch
> > > new file mode 100644
> > > index 0000000000..267f586a71
> > > --- /dev/null
> > > +++ b/meta/recipes-devtools/cmake/cmake/0006-cmake-FindGTest-Add-
> > > target-for-gmock-library.patch
> > > @@ -0,0 +1,255 @@
> > > +From 39eae0d6c1b398f18761abac7f55944f0290f8a1 Mon Sep 17
> > > 00:00:00
> > > 2001
> > > +From: Eero Aaltonen <eero.aaltonen@iki.fi>
> > > +Date: Sun, 17 Oct 2021 17:13:07 +0300
> > > +Subject: [PATCH] FindGTest: Add target for gmock library
> > > +
> > > +`googlemock` has been absorbed into the
> > > +[googletest](https://github.com/google/googletest) project and
> > > is
> > > built
> > > +and installed from the same source tree.
> > > +
> > > +As GTest may be built with or without GMock, skip GMock if it is
> > > not
> > > +present.
> > > +
> > > +Do not provide result variables for GMock.  They are not
> > > provided by
> > > +upstream GTest's CMake Package Configuration File.
> > > +
> > > +Also update the test case to cover linking to `GTest::gmock`.
> > > +
> > > +The patch was imported from the Kitware git server
> > > +(git@gitlab.kitware.com:cmake/cmake.git) as of commit id
> > > +50bf457a0dd857cf976b22c5be7d333493233d1e
> > > +
> > > +Patch was modified to support upper case variable `GTEST_FOUND`.
> > > +
> > > +Upstream-Status: Accepted
> > > [https://gitlab.kitware.com/cmake/cmake/-/merge_requests/6632]
> > > +Milestone: 3.23.0
> > > +
> > > +Signed-off-by: Eero Aaltonen <eero.aaltonen@vaisala.com>
> > > +---
> > > + .../dev/FindGTest-target-for-gmock.rst        |   4 +
> > > + Modules/FindGTest.cmake                       | 133
> > > +++++++++++++++---
> > > + Tests/FindGTest/Test/CMakeLists.txt           |   4 +
> > > + 3 files changed, 121 insertions(+), 20 deletions(-)
> > > + create mode 100644 Help/release/dev/FindGTest-target-for-
> > > gmock.rst
> > > +
> > > +diff --git a/Help/release/dev/FindGTest-target-for-gmock.rst
> > > b/Help/release/dev/FindGTest-target-for-gmock.rst
> > > +new file mode 100644
> > > +index 0000000000..f78242c80e
> > > +--- /dev/null
> > > ++++ b/Help/release/dev/FindGTest-target-for-gmock.rst
> > > +@@ -0,0 +1,4 @@
> > > ++FindGTest-target-for-gmock
> > > ++--------------------------
> > > ++
> > > ++* The :module:`FindGTest` module now provides a target for
> > > GMock,
> > > if found.
> > > +diff --git a/Modules/FindGTest.cmake b/Modules/FindGTest.cmake
> > > +index e015a9840f..0331049594 100644
> > > +--- a/Modules/FindGTest.cmake
> > > ++++ b/Modules/FindGTest.cmake
> > > +@@ -7,10 +7,23 @@ FindGTest
> > > +
> > > + Locate the Google C++ Testing Framework.
> > > +
> > > ++.. versionadded:: 3.20
> > > ++  Upstream ``GTestConfig.cmake`` is used if possible.
> > > ++
> > > + Imported targets
> > > + ^^^^^^^^^^^^^^^^
> > > +
> > > +-This module defines the following :prop_tgt:`IMPORTED` targets:
> > > ++  This module defines the following :prop_tgt:`IMPORTED`
> > > targets:
> > > ++
> > > ++``GTest::gtest``
> > > ++  The Google Test ``gtest`` library, if found; adds
> > > Thread::Thread
> > > ++  automatically
> > > ++``GTest::gtest_main``
> > > ++  The Google Test ``gtest_main`` library, if found
> > > ++
> > > ++.. deprecated:: 3.20
> > > ++  For backwards compatibility, this module defines additionally
> > > the
> > > ++  following deprecated :prop_tgt:`IMPORTED` targets (available
> > > since 3.5):
> > > +
> > > + ``GTest::GTest``
> > > +   The Google Test ``gtest`` library, if found; adds
> > > Thread::Thread
> > > +@@ -18,7 +31,6 @@ This module defines the following
> > > :prop_tgt:`IMPORTED` targets:
> > > + ``GTest::Main``
> > > +   The Google Test ``gtest_main`` library, if found
> > > +
> > > +-
> > > + Result variables
> > > + ^^^^^^^^^^^^^^^^
> > > +
> > > +@@ -146,8 +158,42 @@ function(__gtest_import_library _target
> > > _var
> > > _config)
> > > +     endif()
> > > + endfunction()
> > > +
> > > ++function(__gtest_define_backwards_compatible_library_targets)
> > > ++    set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES}
> > > ${GTEST_MAIN_LIBRARIES} PARENT_SCOPE)
> > > ++
> > > ++    # Add targets mapping the same library names as defined in
> > > ++    # older versions of CMake's FindGTest
> > > ++    if(NOT TARGET GTest::GTest)
> > > ++        add_library(GTest::GTest INTERFACE IMPORTED)
> > > ++        target_link_libraries(GTest::GTest INTERFACE
> > > GTest::gtest)
> > > ++    endif()
> > > ++    if(NOT TARGET GTest::Main)
> > > ++        add_library(GTest::Main INTERFACE IMPORTED)
> > > ++        target_link_libraries(GTest::Main INTERFACE
> > > GTest::gtest_main)
> > > ++    endif()
> > > ++endfunction()
> > > ++
> > > + #
> > > +
> > > ++include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs
> > > .cma
> > > ke)
> > > ++
> > > ++# first specifically look for the CMake version of GTest
> > > ++find_package(GTest QUIET NO_MODULE)
> > > ++
> > > ++# if we found the GTest cmake package then we are done, and
> > > ++# can print what we found and return.
> > > ++if(GTest_FOUND)
> > > ++    set(GTEST_FOUND ${GTest_FOUND})
> > > ++    FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTest HANDLE_COMPONENTS
> > > CONFIG_MODE)
> > > ++
> > > ++    set(GTEST_LIBRARIES      GTest::gtest)
> > > ++    set(GTEST_MAIN_LIBRARIES GTest::gtest_main)
> > > ++
> > > ++    __gtest_define_backwards_compatible_library_targets()
> > > ++
> > > ++    return()
> > > ++endif()
> > > ++
> > > + if(NOT DEFINED GTEST_MSVC_SEARCH)
> > > +     set(GTEST_MSVC_SEARCH MD)
> > > + endif()
> > > +@@ -194,50 +240,97 @@ if(MSVC AND GTEST_MSVC_SEARCH STREQUAL
> > > "MD")
> > > +     __gtest_find_library(GTEST_LIBRARY_DEBUG      gtest-mdd
> > > gtestd)
> > > +     __gtest_find_library(GTEST_MAIN_LIBRARY       gtest_main-md
> > > gtest_main)
> > > +     __gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_main-
> > > mdd
> > > gtest_maind)
> > > ++    __gtest_find_library(GMOCK_LIBRARY            gmock-md
> > > gmock)
> > > ++    __gtest_find_library(GMOCK_LIBRARY_DEBUG      gmock-mdd
> > > gmockd)
> > > ++    __gtest_find_library(GMOCK_MAIN_LIBRARY       gmock_main-md
> > > gmock_main)
> > > ++    __gtest_find_library(GMOCK_MAIN_LIBRARY_DEBUG gmock_main-
> > > mdd
> > > gmock_maind)
> > > + else()
> > > +     __gtest_find_library(GTEST_LIBRARY            gtest)
> > > +     __gtest_find_library(GTEST_LIBRARY_DEBUG      gtestd)
> > > +     __gtest_find_library(GTEST_MAIN_LIBRARY       gtest_main)
> > > +     __gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_maind)
> > > ++    __gtest_find_library(GMOCK_LIBRARY            gmock)
> > > ++    __gtest_find_library(GMOCK_LIBRARY_DEBUG      gmockd)
> > > ++    __gtest_find_library(GMOCK_MAIN_LIBRARY       gmock_main)
> > > ++    __gtest_find_library(GMOCK_MAIN_LIBRARY_DEBUG gmock_maind)
> > > + endif()
> > > +
> > > +-
> > > include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.c
> > > make
> > > )
> > > + FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTest DEFAULT_MSG
> > > GTEST_LIBRARY
> > > GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY)
> > > +
> > > +-if(GTEST_FOUND)
> > > ++if(GMOCK_LIBRARY AND GMOCK_MAIN_LIBRARY)
> > > ++    set(GMock_FOUND True)
> > > ++else()
> > > ++    set(GMock_FOUND False)
> > > ++endif()
> > > ++
> > > ++if(GTest_FOUND)
> > > +     set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIR})
> > > +     __gtest_append_debugs(GTEST_LIBRARIES      GTEST_LIBRARY)
> > > +     __gtest_append_debugs(GTEST_MAIN_LIBRARIES
> > > GTEST_MAIN_LIBRARY)
> > > +-    set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES}
> > > ${GTEST_MAIN_LIBRARIES})
> > > +
> > > +     find_package(Threads QUIET)
> > > +
> > > +-    if(NOT TARGET GTest::GTest)
> > > ++    if(NOT TARGET GTest::gtest)
> > > +         __gtest_determine_library_type(GTEST_LIBRARY)
> > > +-        add_library(GTest::GTest ${GTEST_LIBRARY_TYPE}
> > > IMPORTED)
> > > ++        add_library(GTest::gtest ${GTEST_LIBRARY_TYPE}
> > > IMPORTED)
> > > +         if(TARGET Threads::Threads)
> > > +-            set_target_properties(GTest::GTest PROPERTIES
> > > ++            set_target_properties(GTest::gtest PROPERTIES
> > > +                 INTERFACE_LINK_LIBRARIES Threads::Threads)
> > > +         endif()
> > > +         if(GTEST_LIBRARY_TYPE STREQUAL "SHARED")
> > > +-            set_target_properties(GTest::GTest PROPERTIES
> > > ++            set_target_properties(GTest::gtest PROPERTIES
> > > +                 INTERFACE_COMPILE_DEFINITIONS
> > > "GTEST_LINKED_AS_SHARED_LIBRARY=1")
> > > +         endif()
> > > +         if(GTEST_INCLUDE_DIRS)
> > > +-            set_target_properties(GTest::GTest PROPERTIES
> > > ++            set_target_properties(GTest::gtest PROPERTIES
> > > +                 INTERFACE_INCLUDE_DIRECTORIES
> > > "${GTEST_INCLUDE_DIRS}")
> > > +         endif()
> > > +-        __gtest_import_library(GTest::GTest GTEST_LIBRARY "")
> > > +-        __gtest_import_library(GTest::GTest GTEST_LIBRARY
> > > "RELEASE")
> > > +-        __gtest_import_library(GTest::GTest GTEST_LIBRARY
> > > "DEBUG")
> > > ++        __gtest_import_library(GTest::gtest GTEST_LIBRARY "")
> > > ++        __gtest_import_library(GTest::gtest GTEST_LIBRARY
> > > "RELEASE")
> > > ++        __gtest_import_library(GTest::gtest GTEST_LIBRARY
> > > "DEBUG")
> > > +     endif()
> > > +-    if(NOT TARGET GTest::Main)
> > > ++    if(NOT TARGET GTest::gtest_main)
> > > +         __gtest_determine_library_type(GTEST_MAIN_LIBRARY)
> > > +-        add_library(GTest::Main ${GTEST_MAIN_LIBRARY_TYPE}
> > > IMPORTED)
> > > +-        set_target_properties(GTest::Main PROPERTIES
> > > +-            INTERFACE_LINK_LIBRARIES "GTest::GTest")
> > > +-        __gtest_import_library(GTest::Main GTEST_MAIN_LIBRARY
> > > "")
> > > +-        __gtest_import_library(GTest::Main GTEST_MAIN_LIBRARY
> > > "RELEASE")
> > > +-        __gtest_import_library(GTest::Main GTEST_MAIN_LIBRARY
> > > "DEBUG")
> > > ++        add_library(GTest::gtest_main
> > > ${GTEST_MAIN_LIBRARY_TYPE}
> > > IMPORTED)
> > > ++        set_target_properties(GTest::gtest_main PROPERTIES
> > > ++            INTERFACE_LINK_LIBRARIES "GTest::gtest")
> > > ++        __gtest_import_library(GTest::gtest_main
> > > GTEST_MAIN_LIBRARY
> > > "")
> > > ++        __gtest_import_library(GTest::gtest_main
> > > GTEST_MAIN_LIBRARY
> > > "RELEASE")
> > > ++        __gtest_import_library(GTest::gtest_main
> > > GTEST_MAIN_LIBRARY
> > > "DEBUG")
> > > ++    endif()
> > > ++
> > > ++    __gtest_define_backwards_compatible_library_targets()
> > > ++endif()
> > > ++
> > > ++if(GMock_FOUND)
> > > ++    if(NOT TARGET GTest::gmock)
> > > ++        __gtest_determine_library_type(GMOCK_LIBRARY)
> > > ++        add_library(GTest::gmock ${GMOCK_LIBRARY_TYPE}
> > > IMPORTED)
> > > ++        set(_gmock_link_libraries "GTest::gtest")
> > > ++        if(TARGET Threads::Threads)
> > > ++            list(APPEND _gmock_link_libraries Threads::Threads)
> > > ++        endif()
> > > ++        set_target_properties(GTest::gmock PROPERTIES
> > > ++            INTERFACE_LINK_LIBRARIES
> > > "${_gmock_link_libraries}")
> > > ++        if(GMOCK_LIBRARY_TYPE STREQUAL "SHARED")
> > > ++            set_target_properties(GTest::gmock PROPERTIES
> > > ++                INTERFACE_COMPILE_DEFINITIONS
> > > "GMOCK_LINKED_AS_SHARED_LIBRARY=1")
> > > ++        endif()
> > > ++        if(GTEST_INCLUDE_DIRS)
> > > ++            set_target_properties(GTest::gmock PROPERTIES
> > > ++                INTERFACE_INCLUDE_DIRECTORIES
> > > "${GTEST_INCLUDE_DIRS}")
> > > ++        endif()
> > > ++        __gtest_import_library(GTest::gmock GMOCK_LIBRARY "")
> > > ++        __gtest_import_library(GTest::gmock GMOCK_LIBRARY
> > > "RELEASE")
> > > ++        __gtest_import_library(GTest::gmock GMOCK_LIBRARY
> > > "DEBUG")
> > > ++    endif()
> > > ++    if(NOT TARGET GTest::gmock_main)
> > > ++        __gtest_determine_library_type(GMOCK_MAIN_LIBRARY)
> > > ++        add_library(GTest::gmock_main
> > > ${GMOCK_MAIN_LIBRARY_TYPE}
> > > IMPORTED)
> > > ++        set_target_properties(GTest::gmock_main PROPERTIES
> > > ++            INTERFACE_LINK_LIBRARIES "GTest::gmock")
> > > ++        __gtest_import_library(GTest::gmock_main
> > > GMOCK_MAIN_LIBRARY
> > > "")
> > > ++        __gtest_import_library(GTest::gmock_main
> > > GMOCK_MAIN_LIBRARY
> > > "RELEASE")
> > > ++        __gtest_import_library(GTest::gmock_main
> > > GMOCK_MAIN_LIBRARY
> > > "DEBUG")
> > > +     endif()
> > > + endif()
> > > +diff --git a/Tests/FindGTest/Test/CMakeLists.txt
> > > b/Tests/FindGTest/Test/CMakeLists.txt
> > > +index b65b9d28f6..7d3a378a65 100644
> > > +--- a/Tests/FindGTest/Test/CMakeLists.txt
> > > ++++ b/Tests/FindGTest/Test/CMakeLists.txt
> > > +@@ -12,3 +12,7 @@ add_executable(test_gtest_var main.cxx)
> > > + target_include_directories(test_gtest_var PRIVATE
> > > ${GTEST_INCLUDE_DIRS})
> > > + target_link_libraries(test_gtest_var PRIVATE
> > > ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
> > > + add_test(NAME test_gtest_var COMMAND test_gtest_var)
> > > ++
> > > ++add_executable(test_gmock_tgt main.cxx)
> > > ++target_link_libraries(test_gmock_tgt GTest::gmock_main)
> > > ++add_test(NAME test_gmock_tgt COMMAND test_gmock_tgt)
> > > +--
> > > +2.17.1
> > > +
> > -----BEGIN PGP SIGNATURE-----
> >
> > iQEzBAEBCAAdFiEE4WyPMIC5Ap4+Ooo1Ygqew07VMNUFAmGyPwAACgkQYgqew07V
> > MNU+qwf/a6pDdacJlCGlNha+d2AbkAqiAlC/djP0i5h17mhRhvfZWwvm8DlyXUNL
> > oYjhi7y6PvO2H7TTsACey7bBcGBwyikTrpBrloxaa+KDKkG1OIvpzJBlRNGA/PUT
> > vZMmDtL6S4E3SuxwBT8P/ShH+RSijJDWVq+9UgNz6jyuNIx4lSVU9lVTACNpN4Mj
> > PI5YXl3g6HZA364UnEZ+KFKwoc5Ihm5U71KkKKekNaOVNf4rzkcwy8bQFc0WyH42
> > 4N/sPDByu/8INnabZm04ypqIOAMGOKsLjuZqvy2PeFiBoXCRsxJD9SF6iFFVeuuc
> > /lP9iIFOIHxUFkeopGvLH7ol8YQtow==
> > =72K+
> > -----END PGP SIGNATURE-----
> >
> > -=-=-=-=-=-=-=-=-=-=-=-
> > Links: You receive all messages sent to this group.
> > View/Reply Online (#159473):
> > https://lists.openembedded.org/g/openembedded-core/message/159473
> > Mute This Topic: https://lists.openembedded.org/mt/87483225/3617601
> > Group Owner: openembedded-core+owner@lists.openembedded.org
> > Unsubscribe:
> > https://lists.openembedded.org/g/openembedded-core/unsub [
> > sakoman@gmail.com]
> > -=-=-=-=-=-=-=-=-=-=-=-
> >
-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEE4WyPMIC5Ap4+Ooo1Ygqew07VMNUFAmGzoSAACgkQYgqew07V
MNUawAf/aoqsdt2f0at05sKUMQRvby+wwBdq+0MnSzQvnkalYZmqVWu9EmVobIaL
PgZyzhBFaCMhiKA80sirEqDwippgOyVMtydaXJBNhztCnsyg2pbmouaOZsmjeJ/L
bCbJhK+z3eaXzDivZ37/5oIs97hynTgeanJlpowsuE6FXEX8Q8hU7vPjhVjGTeIE
wKEGDqDJUMwrmaSmDf+pQcikE5TmsOZyGS006c6S6FmpifImzwM8J/sxmOWtTaN1
EmDGj7h7lsG3+v7XkOODTdDn0Teoe61x0uIfPqvK35ig8V6SP/ylwKF81zK248d/
TWMB7wqyaL6+9gkqvreG96h4eFY6JQ==
=+DGS
-----END PGP SIGNATURE-----