用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
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

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()