You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
273 lines
8.9 KiB
273 lines
8.9 KiB
5 months ago
|
# Copyright (c) 2010, 2019, Oracle and/or its affiliates. All rights reserved.
|
||
|
#
|
||
|
# This program is free software; you can redistribute it and/or modify
|
||
|
# it under the terms of the GNU General Public License, version 2.0,
|
||
|
# as published by the Free Software Foundation.
|
||
|
#
|
||
|
# This program is also distributed with certain software (including
|
||
|
# but not limited to OpenSSL) that is licensed under separate terms,
|
||
|
# as designated in a particular file or component or in included license
|
||
|
# documentation. The authors of MySQL hereby grant you an additional
|
||
|
# permission to link the program and your derivative works with the
|
||
|
# separately licensed software that they have included with MySQL.
|
||
|
#
|
||
|
# 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 General Public License, version 2.0, for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU General Public License
|
||
|
# along with this program; if not, write to the Free Software
|
||
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||
|
|
||
|
# We want release-1.8.1.zip in order to build these unit tests.
|
||
|
# If you have already downloaded it,
|
||
|
# invoke cmake with -DWITH_GMOCK=/path/to/release-1.8.1.zip
|
||
|
# or -DWITH_GMOCK=/path/to
|
||
|
#
|
||
|
# Alternatively, set an environment variable
|
||
|
# export WITH_GMOCK=/path/to/release-1.8.1.zip
|
||
|
#
|
||
|
# You can also do cmake -DENABLE_DOWNLOADS=1
|
||
|
# and we will download it from https://github.com/google/googletest/archive/
|
||
|
#
|
||
|
# Either way: we will unpack the zip, compile gmock-all.cc and gtest-all.cc
|
||
|
# and link them into the executables.
|
||
|
|
||
|
|
||
|
# Default location for where to download and build gmock/gtest.
|
||
|
IF(NOT DOWNLOAD_ROOT)
|
||
|
SET(DOWNLOAD_ROOT ${CMAKE_SOURCE_DIR}/source_downloads)
|
||
|
ENDIF()
|
||
|
|
||
|
# We want googletest version 1.8, which also contains googlemock.
|
||
|
SET(GMOCK_PACKAGE_NAME "release-1.8.1")
|
||
|
|
||
|
IF (DEFINED ENV{WITH_GMOCK} AND NOT DEFINED WITH_GMOCK)
|
||
|
FILE(TO_CMAKE_PATH "$ENV{WITH_GMOCK}" WITH_GMOCK)
|
||
|
ENDIF()
|
||
|
|
||
|
IF(LOCAL_GMOCK_ZIP
|
||
|
AND NOT ${LOCAL_GMOCK_ZIP} MATCHES ".*${GMOCK_PACKAGE_NAME}\\.zip")
|
||
|
SET(LOCAL_GMOCK_ZIP 0)
|
||
|
ENDIF()
|
||
|
|
||
|
IF (WITH_GMOCK)
|
||
|
FILE(TO_CMAKE_PATH "${WITH_GMOCK}" WITH_GMOCK)
|
||
|
## Did we get a full path name, including file name?
|
||
|
IF (${WITH_GMOCK} MATCHES ".*\\.zip")
|
||
|
GET_FILENAME_COMPONENT(GMOCK_DIR ${WITH_GMOCK} PATH)
|
||
|
GET_FILENAME_COMPONENT(GMOCK_ZIP ${WITH_GMOCK} NAME)
|
||
|
FIND_FILE(LOCAL_GMOCK_ZIP
|
||
|
NAMES ${GMOCK_ZIP}
|
||
|
PATHS ${GMOCK_DIR}
|
||
|
NO_DEFAULT_PATH
|
||
|
)
|
||
|
ELSE()
|
||
|
## Did we get a path name to the directory of the .zip file?
|
||
|
## Check for both release-x.y.z.zip and googletest-release-x.y.z.zip
|
||
|
FIND_FILE(LOCAL_GMOCK_ZIP
|
||
|
NAMES "${GMOCK_PACKAGE_NAME}.zip"
|
||
|
"googletest-${GMOCK_PACKAGE_NAME}.zip"
|
||
|
PATHS ${WITH_GMOCK}
|
||
|
NO_DEFAULT_PATH
|
||
|
)
|
||
|
## If WITH_GMOCK is a directory, use it for download.
|
||
|
SET(DOWNLOAD_ROOT ${WITH_GMOCK})
|
||
|
ENDIF()
|
||
|
MESSAGE(STATUS "Local gmock zip ${LOCAL_GMOCK_ZIP}")
|
||
|
ENDIF()
|
||
|
|
||
|
IF(NOT EXISTS DOWNLOAD_ROOT)
|
||
|
MAKE_DIRECTORY(${DOWNLOAD_ROOT})
|
||
|
ENDIF()
|
||
|
|
||
|
SET(GMOCK_SOURCE_DIR
|
||
|
${DOWNLOAD_ROOT}/googletest-${GMOCK_PACKAGE_NAME}/googlemock)
|
||
|
SET(GTEST_SOURCE_DIR
|
||
|
${DOWNLOAD_ROOT}/googletest-${GMOCK_PACKAGE_NAME}/googletest)
|
||
|
|
||
|
# We may have downloaded gmock/gtest already, building in a different directory.
|
||
|
IF(EXISTS ${GMOCK_SOURCE_DIR} OR EXISTS ${LOCAL_GMOCK_ZIP})
|
||
|
MESSAGE(STATUS "GMOCK_SOURCE_DIR:${GMOCK_SOURCE_DIR}")
|
||
|
SET(GMOCK_DOWNLOADED 1 CACHE INTERNAL "")
|
||
|
SET(GMOCK_FOUND 1 CACHE INTERNAL "")
|
||
|
# If source dir does not exist, reset dependent variables
|
||
|
# (might be set from before).
|
||
|
ELSE()
|
||
|
SET(LOCAL_GMOCK_ZIP 0 CACHE INTERNAL "")
|
||
|
SET(GMOCK_DOWNLOADED 0 CACHE INTERNAL "")
|
||
|
SET(GMOCK_FOUND 0 CACHE INTERNAL "")
|
||
|
UNSET(GMOCK_INCLUDE_DIRS)
|
||
|
UNSET(GMOCK_INCLUDE_DIRS CACHE)
|
||
|
ENDIF()
|
||
|
|
||
|
|
||
|
IF(LOCAL_GMOCK_ZIP AND NOT EXISTS ${GMOCK_SOURCE_DIR})
|
||
|
# Unpack tarball
|
||
|
EXECUTE_PROCESS(
|
||
|
COMMAND ${CMAKE_COMMAND} -E tar xfz "${LOCAL_GMOCK_ZIP}"
|
||
|
WORKING_DIRECTORY "${DOWNLOAD_ROOT}"
|
||
|
RESULT_VARIABLE tar_result
|
||
|
)
|
||
|
IF (tar_result MATCHES 0)
|
||
|
SET(GMOCK_FOUND 1 CACHE INTERNAL "")
|
||
|
ENDIF()
|
||
|
ENDIF()
|
||
|
|
||
|
|
||
|
OPTION(ENABLE_DOWNLOADS
|
||
|
"Download and build 3rd party source code components, e.g. googletest"
|
||
|
OFF)
|
||
|
|
||
|
# While experimenting, use local URL rather than google.
|
||
|
SET(GMOCK_TARBALL "googletest-${GMOCK_PACKAGE_NAME}.zip")
|
||
|
SET(GMOCK_DOWNLOAD_URL
|
||
|
"https://github.com/google/googletest/archive/${GMOCK_PACKAGE_NAME}.zip"
|
||
|
)
|
||
|
|
||
|
MACRO(HTTP_PROXY_HINT)
|
||
|
MESSAGE(STATUS
|
||
|
"If you are inside a firewall, you may need to use an https proxy: "
|
||
|
"export https_proxy=http://example.com:80")
|
||
|
ENDMACRO()
|
||
|
|
||
|
|
||
|
IF(NOT GMOCK_FOUND)
|
||
|
IF(NOT ENABLE_DOWNLOADS)
|
||
|
# Give warning
|
||
|
MESSAGE(STATUS
|
||
|
"Googletest was not found. gtest-based unit tests will be disabled. "
|
||
|
"You can run cmake . -DENABLE_DOWNLOADS=1 to automatically download "
|
||
|
"and build required components from source.")
|
||
|
HTTP_PROXY_HINT()
|
||
|
RETURN()
|
||
|
ENDIF()
|
||
|
|
||
|
# Download googletest source
|
||
|
IF(NOT EXISTS ${GMOCK_SOURCE_DIR})
|
||
|
IF(NOT EXISTS ${DOWNLOAD_ROOT}/${GMOCK_TARBALL})
|
||
|
# Download the tarball
|
||
|
# Use CMake builtin download capabilities
|
||
|
FILE(DOWNLOAD ${GMOCK_DOWNLOAD_URL}
|
||
|
${DOWNLOAD_ROOT}/${GMOCK_TARBALL} TIMEOUT 30 STATUS ERR)
|
||
|
IF(ERR EQUAL 0)
|
||
|
SET(DOWNLOAD_SUCCEEDED 1)
|
||
|
ELSE()
|
||
|
MESSAGE(STATUS "Download failed, error: ${ERR}")
|
||
|
# A failed DOWNLOAD leaves an empty file, remove it
|
||
|
FILE(REMOVE ${DOWNLOAD_ROOT}/${GMOCK_TARBALL})
|
||
|
ENDIF()
|
||
|
|
||
|
IF (DOWNLOAD_SUCCEEDED)
|
||
|
MESSAGE(STATUS
|
||
|
"Successfully downloaded ${GMOCK_DOWNLOAD_URL} to ${DOWNLOAD_ROOT}")
|
||
|
ELSE()
|
||
|
MESSAGE(STATUS
|
||
|
"To enable googletest, please download ${GMOCK_DOWNLOAD_URL} "
|
||
|
"to the directory ${DOWNLOAD_ROOT}")
|
||
|
HTTP_PROXY_HINT()
|
||
|
RETURN()
|
||
|
ENDIF()
|
||
|
ENDIF()
|
||
|
|
||
|
# Unpack tarball
|
||
|
EXECUTE_PROCESS(
|
||
|
COMMAND ${CMAKE_COMMAND} -E tar xfz "${DOWNLOAD_ROOT}/${GMOCK_TARBALL}"
|
||
|
WORKING_DIRECTORY "${DOWNLOAD_ROOT}"
|
||
|
)
|
||
|
ENDIF()
|
||
|
IF(EXISTS ${GMOCK_SOURCE_DIR})
|
||
|
SET(GMOCK_DOWNLOADED 1 CACHE INTERNAL "")
|
||
|
SET(GMOCK_FOUND 1 CACHE INTERNAL "")
|
||
|
ENDIF()
|
||
|
ENDIF()
|
||
|
|
||
|
|
||
|
IF(NOT GMOCK_FOUND)
|
||
|
RETURN()
|
||
|
ENDIF()
|
||
|
|
||
|
SET(GMOCK_INCLUDE_DIRS
|
||
|
${GMOCK_SOURCE_DIR}
|
||
|
${GMOCK_SOURCE_DIR}/include
|
||
|
${GTEST_SOURCE_DIR}
|
||
|
${GTEST_SOURCE_DIR}/include
|
||
|
CACHE INTERNAL "")
|
||
|
|
||
|
ADD_LIBRARY(gmock STATIC ${GMOCK_SOURCE_DIR}/src/gmock-all.cc)
|
||
|
ADD_LIBRARY(gtest STATIC ${GTEST_SOURCE_DIR}/src/gtest-all.cc)
|
||
|
SET(GTEST_LIBRARIES gmock gtest)
|
||
|
|
||
|
ADD_LIBRARY(gmock_main STATIC ${GMOCK_SOURCE_DIR}/src/gmock_main.cc)
|
||
|
ADD_LIBRARY(gtest_main STATIC ${GTEST_SOURCE_DIR}/src/gtest_main.cc)
|
||
|
IF(MY_COMPILER_IS_GNU_OR_CLANG)
|
||
|
SET_TARGET_PROPERTIES(gtest_main gmock_main
|
||
|
PROPERTIES
|
||
|
COMPILE_FLAGS "-Wno-undef -Wno-conversion")
|
||
|
ENDIF()
|
||
|
|
||
|
IF(SOLARIS)
|
||
|
## https://community.oracle.com/thread/4106985
|
||
|
## Assertion: (../lnk/symdescr.cc, line 96) while processing ....
|
||
|
IF(NOT EXISTS ${CMAKE_BINARY_DIR}/hack/src/)
|
||
|
EXECUTE_PROCESS(
|
||
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/hack/src
|
||
|
)
|
||
|
ENDIF()
|
||
|
ADD_CUSTOM_COMMAND(
|
||
|
OUTPUT ${CMAKE_BINARY_DIR}/hack/src/gtest.cc
|
||
|
COMMAND sed -e "/using internal::ParseStringFlag/d"
|
||
|
< ${GTEST_SOURCE_DIR}/src/gtest.cc
|
||
|
> ${CMAKE_BINARY_DIR}/hack/src/gtest.cc
|
||
|
DEPENDS ${GTEST_SOURCE_DIR}/src/gtest.cc
|
||
|
COMMENT "Filtering ${GTEST_SOURCE_DIR}/src/gtest.cc"
|
||
|
VERBATIM
|
||
|
)
|
||
|
ADD_CUSTOM_TARGET(generate_gtest_hack
|
||
|
DEPENDS ${CMAKE_BINARY_DIR}/hack/src/gtest.cc)
|
||
|
|
||
|
## gtest-port.h contains checks for __GLIBCXX__ and gcc older than 4.4.2
|
||
|
## We *do* have __GLIBCXX__ defined, but not __GNUC__
|
||
|
## so we need to filter away the undef GTEST_HAS_STD_TUPLE
|
||
|
IF(NOT EXISTS ${CMAKE_BINARY_DIR}/hack/gtest/internal/)
|
||
|
EXECUTE_PROCESS(
|
||
|
COMMAND ${CMAKE_COMMAND} -E
|
||
|
make_directory ${CMAKE_BINARY_DIR}/hack/gtest/internal
|
||
|
)
|
||
|
ENDIF()
|
||
|
ADD_CUSTOM_COMMAND(
|
||
|
OUTPUT ${CMAKE_BINARY_DIR}/hack/gtest/internal/gtest-port.h
|
||
|
COMMAND sed -e "/undef GTEST_HAS_STD_TUPLE_/d"
|
||
|
< ${GTEST_SOURCE_DIR}/include/gtest/internal/gtest-port.h
|
||
|
> ${CMAKE_BINARY_DIR}/hack/gtest/internal/gtest-port.h
|
||
|
DEPENDS ${GTEST_SOURCE_DIR}/include/gtest/internal/gtest-port.h
|
||
|
COMMENT "Filtering gtest-port.h"
|
||
|
VERBATIM
|
||
|
)
|
||
|
ADD_CUSTOM_TARGET(generate_gtest_port_hack
|
||
|
DEPENDS ${CMAKE_BINARY_DIR}/hack/gtest/internal/gtest-port.h)
|
||
|
|
||
|
FOREACH(target gtest gmock gtest_main gmock_main)
|
||
|
ADD_DEPENDENCIES(${target} generate_gtest_hack generate_gtest_port_hack)
|
||
|
TARGET_INCLUDE_DIRECTORIES(${target} SYSTEM PUBLIC ${CMAKE_BINARY_DIR}/hack)
|
||
|
ENDFOREACH()
|
||
|
|
||
|
ENDIF()
|
||
|
|
||
|
FOREACH(googletest_library
|
||
|
gmock
|
||
|
gtest
|
||
|
gmock_main
|
||
|
gtest_main
|
||
|
)
|
||
|
TARGET_INCLUDE_DIRECTORIES(${googletest_library} SYSTEM PUBLIC
|
||
|
${GMOCK_INCLUDE_DIRS}
|
||
|
)
|
||
|
ENDFOREACH()
|
||
|
|
||
|
IF(SOLARIS)
|
||
|
ADD_DEFINITIONS(-DGTEST_LANG_CXX11=1)
|
||
|
LIST(INSERT GMOCK_INCLUDE_DIRS 0 ${CMAKE_BINARY_DIR}/hack)
|
||
|
ENDIF()
|