configure.cmake (241 lines of code) (raw):
# Copyright (c) 2009, 2024, Oracle and/or its affiliates.
#
# 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 designed to work 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 either included with
# the program or referenced in the documentation.
#
# 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
#
INCLUDE (CheckCSourceCompiles)
INCLUDE (CheckCXXSourceCompiles)
INCLUDE (CheckStructHasMember)
INCLUDE (CheckLibraryExists)
INCLUDE (CheckFunctionExists)
INCLUDE (CheckCCompilerFlag)
INCLUDE (CheckCSourceRuns)
INCLUDE (CheckCXXSourceRuns)
INCLUDE (CheckSymbolExists)
# WITH_PIC options.Not of much use, PIC is taken care of on platforms
# where it makes sense anyway.
IF(UNIX)
IF(APPLE)
# OSX executable are always PIC
SET(WITH_PIC ON)
ELSE()
OPTION(WITH_PIC "Generate PIC objects" OFF)
IF(WITH_PIC)
SET(CMAKE_C_FLAGS
"${CMAKE_C_FLAGS} ${CMAKE_SHARED_LIBRARY_C_FLAGS}")
SET(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}")
ENDIF()
ENDIF()
ENDIF()
IF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
## Add C flags (e.g. -m64) to CMAKE_SHARED_LIBRARY_C_FLAGS
## The client library contains C++ code, so add dependency on libstdc++
## See cmake --help-policy CMP0018
SET(CMAKE_SHARED_LIBRARY_C_FLAGS
"${CMAKE_SHARED_LIBRARY_C_FLAGS} ${CMAKE_C_FLAGS} -lstdc++")
ENDIF()
# System type affects version_compile_os variable
IF(NOT SYSTEM_TYPE)
IF(PLATFORM)
SET(SYSTEM_TYPE ${PLATFORM})
ELSE()
SET(SYSTEM_TYPE ${CMAKE_SYSTEM_NAME})
ENDIF()
ENDIF()
# Check to see if we are using LLVM's libc++ rather than e.g. libstd++
# Can then check HAVE_LLBM_LIBCPP later without including e.g. ciso646.
CHECK_CXX_SOURCE_RUNS("
#include <ciso646>
int main()
{
#ifdef _LIBCPP_VERSION
return 0;
#else
return 1;
#endif
}" HAVE_LLVM_LIBCPP)
MACRO(DIRNAME IN OUT)
GET_FILENAME_COMPONENT(${OUT} ${IN} PATH)
ENDMACRO()
MACRO(EXTEND_CXX_LINK_FLAGS LIBRARY_PATH)
# Using the $ORIGIN token with the -R option to locate the libraries
# on a path relative to the executable:
# We need an extra backslash to pass $ORIGIN to the mysql_config script...
SET(QUOTED_CMAKE_CXX_LINK_FLAGS
"${CMAKE_CXX_LINK_FLAGS} -R'\\$ORIGIN/../lib' -R${LIBRARY_PATH}")
SET(CMAKE_CXX_LINK_FLAGS
"${CMAKE_CXX_LINK_FLAGS} -R'\$ORIGIN/../lib' -R${LIBRARY_PATH}")
MESSAGE(STATUS "CMAKE_CXX_LINK_FLAGS ${CMAKE_CXX_LINK_FLAGS}")
ENDMACRO()
MACRO(EXTEND_C_LINK_FLAGS LIBRARY_PATH)
SET(QUOTED_CMAKE_C_LINK_FLAGS
"${CMAKE_C_LINK_FLAGS} -R'\\$ORIGIN/../lib' -R${LIBRARY_PATH}")
SET(CMAKE_C_LINK_FLAGS
"${CMAKE_C_LINK_FLAGS} -R'\$ORIGIN/../lib' -R${LIBRARY_PATH}")
MESSAGE(STATUS "CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS}")
SET(CMAKE_SHARED_LIBRARY_C_FLAGS
"${CMAKE_SHARED_LIBRARY_C_FLAGS} -R'\$ORIGIN/../lib' -R${LIBRARY_PATH}")
ENDMACRO()
IF(CMAKE_COMPILER_IS_GNUCXX)
IF (CMAKE_EXE_LINKER_FLAGS MATCHES " -static "
OR CMAKE_EXE_LINKER_FLAGS MATCHES " -static$")
SET(HAVE_DLOPEN FALSE CACHE "Disable dlopen due to -static flag" FORCE)
SET(WITHOUT_DYNAMIC_PLUGINS TRUE)
ENDIF()
ENDIF()
IF(WITHOUT_DYNAMIC_PLUGINS)
MESSAGE("Dynamic plugins are disabled.")
ENDIF(WITHOUT_DYNAMIC_PLUGINS)
# Large files, common flag
SET(_LARGEFILE_SOURCE 1)
# Same for structs, setting HAVE_STRUCT_<name> instead
FUNCTION(MY_CHECK_STRUCT_SIZE type defbase)
CHECK_TYPE_SIZE("struct ${type}" SIZEOF_${defbase})
IF(SIZEOF_${defbase})
SET(HAVE_STRUCT_${defbase} 1 PARENT_SCOPE)
ENDIF()
ENDFUNCTION()
# Searches function in libraries
# if function is found, sets output parameter result to the name of the library
# if function is found in libc, result will be empty
FUNCTION(MY_SEARCH_LIBS func libs result)
IF(${${result}})
# Library is already found or was predefined
RETURN()
ENDIF()
CHECK_FUNCTION_EXISTS(${func} HAVE_${func}_IN_LIBC)
IF(HAVE_${func}_IN_LIBC)
SET(${result} "" PARENT_SCOPE)
RETURN()
ENDIF()
FOREACH(lib ${libs})
CHECK_LIBRARY_EXISTS(${lib} ${func} "" HAVE_${func}_IN_${lib})
IF(HAVE_${func}_IN_${lib})
SET(${result} ${lib} PARENT_SCOPE)
SET(HAVE_${result} 1 PARENT_SCOPE)
RETURN()
ENDIF()
ENDFOREACH()
ENDFUNCTION()
# Find out which libraries to use.
# Figure out threading library
# Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT.
FIND_PACKAGE (Threads)
IF(UNIX)
MY_SEARCH_LIBS(floor m LIBM)
IF(NOT LIBM)
MY_SEARCH_LIBS(__infinity m LIBM)
ENDIF()
MY_SEARCH_LIBS(gethostbyname_r "nsl_r;nsl" LIBNSL)
MY_SEARCH_LIBS(bind "bind;socket" LIBBIND)
MY_SEARCH_LIBS(crypt crypt LIBCRYPT)
MY_SEARCH_LIBS(setsockopt socket LIBSOCKET)
MY_SEARCH_LIBS(dlopen dl LIBDL)
MY_SEARCH_LIBS(sched_yield rt LIBRT)
IF(NOT LIBRT)
MY_SEARCH_LIBS(clock_gettime rt LIBRT)
ENDIF()
MY_SEARCH_LIBS(timer_create rt LIBRT)
SET(CMAKE_REQUIRED_LIBRARIES
${LIBM} ${LIBNSL} ${LIBBIND} ${LIBCRYPT} ${LIBSOCKET} ${LIBDL} ${CMAKE_THREAD_LIBS_INIT} ${LIBRT})
# Need explicit pthread for gcc -fsanitize=address
IF(CMAKE_C_FLAGS MATCHES "-fsanitize=")
SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} pthread)
ENDIF()
LIST(LENGTH CMAKE_REQUIRED_LIBRARIES required_libs_length)
IF(${required_libs_length} GREATER 0)
LIST(REMOVE_DUPLICATES CMAKE_REQUIRED_LIBRARIES)
ENDIF()
LINK_LIBRARIES(${CMAKE_THREAD_LIBS_INIT})
OPTION(WITH_LIBWRAP "Compile with tcp wrappers support" OFF)
IF(WITH_LIBWRAP)
SET(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} wrap)
CHECK_C_SOURCE_COMPILES(
"
#include <tcpd.h>
int allow_severity = 0;
int deny_severity = 0;
int main()
{
hosts_access(0);
}"
HAVE_LIBWRAP)
SET(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES})
IF(HAVE_LIBWRAP)
SET(LIBWRAP "wrap")
ELSE()
MESSAGE(FATAL_ERROR
"WITH_LIBWRAP is defined, but can not find a working libwrap. "
"Make sure both the header files (tcpd.h) "
"and the library (libwrap) are installed.")
ENDIF()
ENDIF()
ENDIF()
# std::filesystem
SET(STD_FILESYSTEM_TEST [[
#include <filesystem>
int main() {
const auto cwd = std::filesystem::current_path();
}
]])
SET(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
FOREACH(CANDIDATE "" c++fs stdc++fs)
IF(NOT STD_FILESYSTEM_COMPILES)
UNSET(STD_FILESYSTEM_COMPILES CACHE)
SET(STD_FILESYSTEM_LIB ${CANDIDATE})
SET(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES} ${STD_FILESYSTEM_LIB})
CHECK_CXX_SOURCE_COMPILES("${STD_FILESYSTEM_TEST}" STD_FILESYSTEM_COMPILES)
ENDIF()
ENDFOREACH()
IF(NOT STD_FILESYSTEM_COMPILES)
MESSAGE(FATAL_ERROR "Could not find the linker flag for std::filesystem")
ENDIF()
IF(STD_FILESYSTEM_LIB)
SET(STD_FILESYSTEM_LIB ${STD_FILESYSTEM_LIB} CACHE STRING "std::filesystem library" FORCE)
LINK_LIBRARIES(${STD_FILESYSTEM_LIB})
ENDIF()
SET(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES})
#
# Tests for header files
#
INCLUDE (CheckIncludeFiles)
CHECK_INCLUDE_FILES (bsd/string.h HAVE_BSD_STRING_H)
#
# Tests for functions
#
CHECK_FUNCTION_EXISTS (getpwuid_r HAVE_GETPWUID_R)
CHECK_FUNCTION_EXISTS (getlogin_r HAVE_GETLOGIN_R)
CHECK_FUNCTION_EXISTS (memset_s HAVE_MEMSET_S)
CHECK_FUNCTION_EXISTS (explicit_bzero HAVE_EXPLICIT_BZERO)
#
# Tests for datatypes
#
INCLUDE (CheckTypeSize)
# If finds the size of a type, set SIZEOF_<type> and HAVE_<type>
FUNCTION(MY_CHECK_TYPE_SIZE type defbase)
CHECK_TYPE_SIZE("${type}" SIZEOF_${defbase})
IF(SIZEOF_${defbase})
SET(HAVE_${defbase} 1 PARENT_SCOPE)
ENDIF()
ENDFUNCTION()
MY_CHECK_TYPE_SIZE(ulong ULONG)