diff --git a/src/GMock/GMockConfig.cmake b/src/GMock/GMockConfig.cmake index 2078030..77ba4a3 100644 --- a/src/GMock/GMockConfig.cmake +++ b/src/GMock/GMockConfig.cmake @@ -1,92 +1,77 @@ -# Copyright (C) 2014 Canonical Ltd -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . - -# Build with system gmock and embedded gtest -# -# Usage: -# -# find_package(GMock) -# -# ... -# -# target_link_libraries( -# my-target -# ${GTEST_BOTH_LIBRARIES} -# ) -# -# NOTE: Due to the way this package finder is implemented, do not attempt -# to find the GMock package more than once. - -find_package(Threads) - -if (EXISTS "/usr/src/googletest") - # As of version 1.8.0 - set(GMOCK_SOURCE_DIR "/usr/src/googletest/googlemock" CACHE PATH "gmock source directory") - set(GMOCK_INCLUDE_DIRS "${GMOCK_SOURCE_DIR}/include" CACHE PATH "gmock source include directory") - set(GTEST_INCLUDE_DIRS "/usr/src/googletest/googletest/include" CACHE PATH "gtest source include directory") +include(FindPackageHandleStandardArgs) + +find_package(GTest) + +pkg_check_modules (GTEST REQUIRED "gtest >= 1.8.0") +pkg_check_modules (GTEST_MAIN REQUIRED "gtest_main >= 1.8.0") +if (GTEST_FOUND AND GTEST_MAIN_FOUND) + set(GTEST_LIBRARY ${GTEST_LIBRARIES}) + set(GTEST_MAIN_LIBRARY ${GTEST_MAIN_LIBRARIES}) + set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARY} ${GTEST_MAIN_LIBRARY}) +endif() + +if (NOT GTEST_FOUND) + include(ExternalProject) + + find_path(GTEST_ROOT + NAMES CMakeLists.txt + PATHS /usr/src/gtest /usr/src/googletest/googletest/ + DOC "Path to GTest CMake project") + + ExternalProject_Add(GTest PREFIX ./gtest + SOURCE_DIR ${GTEST_ROOT} + CMAKE_ARGS + -DCMAKE_CXX_COMPILER_WORKS=1 + -DCMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}' + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + INSTALL_COMMAND true + BUILD_BYPRODUCTS + ${CMAKE_CURRENT_BINARY_DIR}/gtest/src/GTest-build/libgtest.a + ${CMAKE_CURRENT_BINARY_DIR}/gtest/src/GTest-build/libgtest_main.a + ${CMAKE_CURRENT_BINARY_DIR}/gtest/src/GMock-build/libgmock.a) + + ExternalProject_Get_Property(GTest binary_dir) + + add_library(gtest UNKNOWN IMPORTED) + set_target_properties(gtest PROPERTIES IMPORTED_LOCATION ${binary_dir}/libgtest.a) + add_dependencies(gtest GTest) + set(GTEST_LIBRARY "gtest") + + add_library(gtest_main UNKNOWN IMPORTED) + set_target_properties(gtest_main PROPERTIES IMPORTED_LOCATION ${binary_dir}/libgtest_main.a) + add_dependencies(gtest_main GTest) + set(GTEST_MAIN_LIBRARY "gtest_main") + + set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARY} ${GTEST_MAIN_LIBRARY}) + find_path(GTEST_INCLUDE_DIRS NAMES gtest/gtest.h) + find_package_handle_standard_args(GTest GTEST_LIBRARY GTEST_BOTH_LIBRARIES GTEST_INCLUDE_DIRS) +endif() + +find_file(GMOCK_SOURCE + NAMES gmock-all.cc + DOC "GMock source" + PATHS /usr/src/googletest/googlemock/src/ /usr/src/gmock/ /usr/src/gmock/src) + +if (EXISTS ${GMOCK_SOURCE}) + find_path(GMOCK_INCLUDE_DIR gmock/gmock.h PATHS /usr/src/googletest/googlemock/include) + + add_library(GMock STATIC ${GMOCK_SOURCE}) + + if (EXISTS /usr/src/googletest/googlemock/src) + set_source_files_properties(${GMOCK_SOURCE} PROPERTIES COMPILE_FLAGS "-I/usr/src/googletest/googlemock") + endif() + + if (EXISTS /usr/src/gmock/src) + set_source_files_properties(${GMOCK_SOURCE} PROPERTIES COMPILE_FLAGS "-I/usr/src/gmock") + endif() + + find_package_handle_standard_args(GMock DEFAULT_MSG GMOCK_INCLUDE_DIR) + + set(GMOCK_LIBRARY GMock) else() - set(GMOCK_SOURCE_DIR "/usr/src/gmock" CACHE PATH "gmock source directory") - set(GMOCK_INCLUDE_DIRS "/usr/include" CACHE PATH "gmock source include directory") - set(GTEST_INCLUDE_DIRS "/usr/include" CACHE PATH "gtest source include directory") + # Assume gmock is no longer source, we'll find out soon enough if that's wrong + add_custom_target(GMock) + string(REPLACE gtest gmock GMOCK_LIBRARY ${GTEST_LIBRARY}) endif() -# We add -g so we get debug info for the gtest stack frames with gdb. -# The warnings are suppressed so we get a noise-free build for gtest and gmock if the caller -# has these warnings enabled. -set(findgmock_cxx_flags "${CMAKE_CXX_FLAGS} -g -Wno-old-style-cast -Wno-missing-field-initializers -Wno-ctor-dtor-privacy -Wno-switch-default") - -set(findgmock_bin_dir "${CMAKE_CURRENT_BINARY_DIR}/gmock") -set(findgmock_gtest_lib "${findgmock_bin_dir}/gtest/libgtest.a") -set(findgmock_gtest_main_lib "${findgmock_bin_dir}/gtest/libgtest_main.a") -set(findgmock_gmock_lib "${findgmock_bin_dir}/libgmock.a") -set(findgmock_gmock_main_lib "${findgmock_bin_dir}/libgmock_main.a") - -include(ExternalProject) -ExternalProject_Add(GMock SOURCE_DIR "${GMOCK_SOURCE_DIR}" - BINARY_DIR "${findgmock_bin_dir}" - BUILD_BYPRODUCTS "${findgmock_gtest_lib}" - "${findgmock_gtest_main_lib}" - "${findgmock_gmock_lib}" - "${findgmock_gmock_main_lib}" - INSTALL_COMMAND "" - CMAKE_ARGS "-DCMAKE_CXX_FLAGS=${findgmock_cxx_flags}") - -add_library(gtest INTERFACE) -target_include_directories(gtest INTERFACE ${GTEST_INCLUDE_DIRS}) -target_link_libraries(gtest INTERFACE ${findgmock_gtest_lib} ${CMAKE_THREAD_LIBS_INIT}) -add_dependencies(gtest GMock) - -add_library(gtest_main INTERFACE) -target_include_directories(gtest_main INTERFACE ${GTEST_INCLUDE_DIRS}) -target_link_libraries(gtest_main INTERFACE ${findgmock_gtest_main_lib} gtest) - -add_library(gmock INTERFACE) -target_include_directories(gmock INTERFACE ${GMOCK_INCLUDE_DIRS}) -target_link_libraries(gmock INTERFACE ${findgmock_gmock_lib} gtest) - -add_library(gmock_main INTERFACE) -target_include_directories(gmock_main INTERFACE ${GMOCK_INCLUDE_DIRS}) -target_link_libraries(gmock_main INTERFACE ${findgmock_gmock_main_lib} gmock) - -set(GTEST_LIBRARIES gtest) -set(GTEST_MAIN_LIBRARIES gtest_main) -set(GMOCK_LIBRARIES gmock gmock_main) -set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) - -unset(findgmock_cxx_flags) -unset(findgmock_bin_dir) -unset(findgmock_gtest_lib) -unset(findgmock_gtest_main_lib) -unset(findgmock_gmock_lib) -unset(findgmock_gmock_main_lib) +set(GMOCK_LIBRARIES ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY})