diff options
author | Grimdhex <176165533+Grimdhex@users.noreply.github.com> | 2024-12-19 18:27:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-19 18:27:19 +0100 |
commit | 866c304d85e917b0330f4a7f2956538f0befe3c7 (patch) | |
tree | f5cee91ebbff5fdba39e666f97239afaad99042b /src/cmake | |
parent | 0bc70670d2eb129bc8629670420363089f9dded0 (diff) |
refactor(Deps/MySQL): replace hardcoded MySQL paths (#20870)
cherry-pick from https://github.com/TrinityCore/TrinityCore/commit/ab046bdc327374878b3bede39f2d519d0aef3493
Co-authored-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src/cmake')
-rw-r--r-- | src/cmake/macros/FindMySQL.cmake | 297 |
1 files changed, 218 insertions, 79 deletions
diff --git a/src/cmake/macros/FindMySQL.cmake b/src/cmake/macros/FindMySQL.cmake index 32a5775737..b78dfc2d87 100644 --- a/src/cmake/macros/FindMySQL.cmake +++ b/src/cmake/macros/FindMySQL.cmake @@ -10,21 +10,65 @@ # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # -# -# Find the MySQL client includes and library -# +#[=======================================================================[.rst: +FindMySQL +----------- + +Find MySQL. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module defines the following :prop_tgt:`IMPORTED` targets: -# This module defines -# MYSQL_INCLUDE_DIR, where to find mysql.h -# MYSQL_LIBRARIES, the libraries to link against to connect to MySQL -# MYSQL_FOUND, if false, you cannot build anything that requires MySQL. +``MySQL::MySQL`` + MySQL client library, if found. -# also defined, but not for general use are -# MYSQL_LIBRARY, where to find the MySQL library. +Result Variables +^^^^^^^^^^^^^^^^ -set( MYSQL_FOUND 0 ) +This module will set the following variables in your project: -if( UNIX ) +``MYSQL_FOUND`` + System has MySQL. +``MYSQL_INCLUDE_DIR`` + MySQL include directory. +``MYSQL_LIBRARY`` + MySQL library. +``MYSQL_EXECUTABLE`` + Path to mysql client binary. + +Hints +^^^^^ + +Set ``MYSQL_ROOT_DIR`` to the root directory of MySQL installation. +#]=======================================================================] + +set(MYSQL_FOUND 0) + +set(_MYSQL_ROOT_HINTS + ${MYSQL_ROOT_DIR} + ENV MYSQL_ROOT_DIR +) + +set(MYSQL_MINIMUM_VERSION "8.0") + +function(check_mysql_version) + if(MYSQL_CONFIG) + execute_process( + COMMAND "${MYSQL_CONFIG}" --version + OUTPUT_VARIABLE MYSQL_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(MYSQL_VERSION VERSION_LESS MYSQL_MINIMUM_VERSION) + message(FATAL_ERROR "MySQL version found (${MYSQL_VERSION}) is less than the required version (${MYSQL_MINIMUM_VERSION})") + else() + message(STATUS "Found MySQL version: ${MYSQL_VERSION}") + endif() + endif() +endfunction() + +if(UNIX) set(MYSQL_CONFIG_PREFER_PATH "$ENV{MYSQL_HOME}/bin" CACHE FILEPATH "preferred path to MySQL (mysql_config)" ) @@ -36,21 +80,23 @@ if( UNIX ) /usr/bin/ ) - if( MYSQL_CONFIG ) + if(MYSQL_CONFIG) message(STATUS "Using mysql-config: ${MYSQL_CONFIG}") # set INCLUDE_DIR - exec_program(${MYSQL_CONFIG} - ARGS --include + execute_process( + COMMAND "${MYSQL_CONFIG}" --include OUTPUT_VARIABLE MY_TMP + OUTPUT_STRIP_TRAILING_WHITESPACE ) string(REGEX REPLACE "-I([^ ]*)( .*)?" "\\1" MY_TMP "${MY_TMP}") set(MYSQL_ADD_INCLUDE_PATH ${MY_TMP} CACHE FILEPATH INTERNAL) #message("[DEBUG] MYSQL ADD_INCLUDE_PATH : ${MYSQL_ADD_INCLUDE_PATH}") # set LIBRARY_DIR - exec_program(${MYSQL_CONFIG} - ARGS --libs_r + execute_process( + COMMAND "${MYSQL_CONFIG}" --libs_r OUTPUT_VARIABLE MY_TMP + OUTPUT_STRIP_TRAILING_WHITESPACE ) set(MYSQL_ADD_LIBRARIES "") string(REGEX MATCHALL "-l[^ ]*" MYSQL_LIB_LIST "${MY_TMP}") @@ -68,15 +114,65 @@ if( UNIX ) #message("[DEBUG] MYSQL ADD_LIBRARIES_PATH : ${MYSQL_ADD_LIBRARIES_PATH}") endforeach(LIB ${MYSQL_LIBS}) - else( MYSQL_CONFIG ) + else(MYSQL_CONFIG) set(MYSQL_ADD_LIBRARIES "") list(APPEND MYSQL_ADD_LIBRARIES "mysqlclient_r") - endif( MYSQL_CONFIG ) -endif( UNIX ) + endif(MYSQL_CONFIG) +endif(UNIX) + +set(_MYSQL_ROOT_PATHS) + +if(WIN32) + # read environment variables and change \ to / + file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" PROGRAM_FILES_32) + file(TO_CMAKE_PATH "$ENV{ProgramW6432}" PROGRAM_FILES_64) + + cmake_host_system_information( + RESULT + _MYSQL_ROOT_HINTS_SUBKEYS + QUERY + WINDOWS_REGISTRY + "HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB" SUBKEYS + VIEW BOTH + ) + list(SORT _MYSQL_ROOT_HINTS_SUBKEYS COMPARE NATURAL ORDER DESCENDING) + + set(_MYSQL_ROOT_HINTS_REGISTRY_LOCATIONS) + foreach(subkey IN LISTS _MYSQL_ROOT_HINTS_SUBKEYS) + cmake_host_system_information( + RESULT + _MYSQL_ROOT_HINTS_REGISTRY_LOCATION + QUERY + WINDOWS_REGISTRY + "HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\${subkey}" VALUE "Location" + VIEW BOTH + ) + list(APPEND _MYSQL_ROOT_HINTS_REGISTRY_LOCATIONS ${_MYSQL_ROOT_HINTS_REGISTRY_LOCATION}) + endforeach() + + file(GLOB _MYSQL_ROOT_PATHS_VERSION_SUBDIRECTORIES + LIST_DIRECTORIES TRUE + "${PROGRAM_FILES_64}/MySQL/MySQL Server *" + "${PROGRAM_FILES_32}/MySQL/MySQL Server *" + "$ENV{SystemDrive}/MySQL/MySQL Server *" + ) + + list(SORT _MYSQL_ROOT_PATHS_VERSION_SUBDIRECTORIES COMPARE NATURAL ORDER DESCENDING) + + set(_MYSQL_ROOT_PATHS + ${_MYSQL_ROOT_PATHS} + ${_MYSQL_ROOT_PATHS_VERSION_SUBDIRECTORIES} + "${PROGRAM_FILES_64}/MySQL" + "${PROGRAM_FILES_32}/MySQL" + "$ENV{SystemDrive}/MySQL" + ) +endif(WIN32) find_path(MYSQL_INCLUDE_DIR NAMES mysql.h + HINTS + ${_MYSQL_ROOT_HINTS} PATHS ${MYSQL_ADD_INCLUDE_PATH} /usr/include @@ -84,22 +180,17 @@ find_path(MYSQL_INCLUDE_DIR /usr/local/include /usr/local/include/mysql /usr/local/mysql/include - "C:/tools/mysql/current/include" # chocolatey package - "$ENV{ProgramW6432}/MySQL/MySQL Server 8.4/include" - "$ENV{ProgramFiles}/MySQL/MySQL Server 8.4/include" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.4/include" - "$ENV{ProgramW6432}/MySQL/MySQL Server 8.0/include" - "$ENV{ProgramFiles}/MySQL/MySQL Server 8.0/include" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.0/include" - "$ENV{MYSQL_INCLUDE_DIR}" - "$ENV{MYSQL_DIR}/include" + ${_MYSQL_ROOT_PATHS} + PATH_SUFFIXES + include + include/mysql DOC "Specify the directory containing mysql.h." ) -if( UNIX ) +if(UNIX) foreach(LIB ${MYSQL_ADD_LIBRARIES}) - find_library( MYSQL_LIBRARY + find_library(MYSQL_LIBRARY NAMES mysql libmysql ${LIB} PATHS @@ -112,31 +203,29 @@ if( UNIX ) DOC "Specify the location of the mysql library here." ) endforeach(LIB ${MYSQL_ADD_LIBRARY}) -endif( UNIX ) +endif(UNIX) -if( WIN32 ) - find_library( MYSQL_LIBRARY +if(WIN32) + find_library(MYSQL_LIBRARY NAMES libmysql + HINTS + ${_MYSQL_ROOT_HINTS} PATHS ${MYSQL_ADD_LIBRARIES_PATH} - "C:/tools/mysql/current/lib" # chocolatey package - "$ENV{ProgramW6432}/MySQL/MySQL Server 8.4/lib" - "$ENV{ProgramFiles}/MySQL/MySQL Server 8.4/lib" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.4/lib" - "$ENV{ProgramW6432}/MySQL/MySQL Server 8.0/lib" - "$ENV{ProgramFiles}/MySQL/MySQL Server 8.0/lib" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.0/lib" - "$ENV{MYSQL_LIBRARY}" - "$ENV{MYSQL_DIR}/lib" + ${_MYSQL_ROOT_PATHS} + PATH_SUFFIXES + lib + lib/opt DOC "Specify the location of the mysql library here." ) -endif( WIN32 ) +endif(WIN32) # On Windows you typically don't need to include any extra libraries # to build MYSQL stuff. -if( NOT WIN32 ) - find_library( MYSQL_EXTRA_LIBRARIES + +if(NOT WIN32) + find_library(MYSQL_EXTRA_LIBRARIES NAMES z zlib PATHS @@ -145,49 +234,99 @@ if( NOT WIN32 ) DOC "if more libraries are necessary to link in a MySQL client (typically zlib), specify them here." ) -else( NOT WIN32 ) - set( MYSQL_EXTRA_LIBRARIES "" ) -endif( NOT WIN32 ) +else(NOT WIN32) + set(MYSQL_EXTRA_LIBRARIES "") +endif(NOT WIN32) -if( UNIX ) - find_program(MYSQL_EXECUTABLE mysql +if(UNIX) + find_program(MYSQL_EXECUTABLE mysql PATHS - ${MYSQL_CONFIG_PREFER_PATH} - /usr/local/mysql/bin/ - /usr/local/bin/ - /usr/bin/ + ${MYSQL_CONFIG_PREFER_PATH} + /usr/local/mysql/bin/ + /usr/local/bin/ + /usr/bin/ DOC - "path to your mysql binary." - ) -endif( UNIX ) + "path to your mysql binary." + ) +endif(UNIX) -if( WIN32 ) +if(WIN32) find_program(MYSQL_EXECUTABLE mysql + HINTS + ${_MYSQL_ROOT_HINTS} PATHS - "C:/tools/mysql/current/bin" # chocolatey package - "$ENV{ProgramW6432}/MySQL/MySQL Server 8.4/bin" - "$ENV{ProgramFiles}/MySQL/MySQL Server 8.4/bin" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.4/bin" - "$ENV{ProgramW6432}/MySQL/MySQL Server 8.0/bin" - "$ENV{ProgramFiles}/MySQL/MySQL Server 8.0/bin" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.0/bin" - "$ENV{MYSQL_ROOT}/bin" + ${_MYSQL_ROOT_PATHS} + PATH_SUFFIXES + bin + bin/opt DOC - "path to your mysql binary.") -endif( WIN32 ) + "path to your mysql binary." + ) +endif(WIN32) + +unset(MySQL_lib_WANTED) +unset(MySQL_binary_WANTED) +set(MYSQL_REQUIRED_VARS "") +foreach(_comp IN LISTS MySQL_FIND_COMPONENTS) + if(_comp STREQUAL "lib") + set(MySQL_${_comp}_WANTED TRUE) + if(MySQL_FIND_REQUIRED_${_comp}) + list(APPEND MYSQL_REQUIRED_VARS "MYSQL_LIBRARY") + list(APPEND MYSQL_REQUIRED_VARS "MYSQL_INCLUDE_DIR") + endif() + if(EXISTS "${MYSQL_LIBRARY}" AND EXISTS "${MYSQL_INCLUDE_DIR}") + set(MySQL_${_comp}_FOUND TRUE) + else() + set(MySQL_${_comp}_FOUND FALSE) + endif() + elseif(_comp STREQUAL "binary") + set(MySQL_${_comp}_WANTED TRUE) + if(MySQL_FIND_REQUIRED_${_comp}) + list(APPEND MYSQL_REQUIRED_VARS "MYSQL_EXECUTABLE") + endif() + if(EXISTS "${MYSQL_EXECUTABLE}" ) + set(MySQL_${_comp}_FOUND TRUE) + else() + set(MySQL_${_comp}_FOUND FALSE) + endif() + else() + message(WARNING "${_comp} is not a valid MySQL component") + set(MySQL_${_comp}_FOUND FALSE) + endif() +endforeach() +unset(_comp) -if( MYSQL_LIBRARY ) - if( MYSQL_INCLUDE_DIR ) - set( MYSQL_FOUND 1 ) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MySQL + REQUIRED_VARS + ${MYSQL_REQUIRED_VARS} + HANDLE_COMPONENTS + FAIL_MESSAGE + "Could not find the MySQL libraries! Please install the development libraries and headers" +) +unset(MYSQL_REQUIRED_VARS) + +if(MYSQL_FOUND) + if(MySQL_lib_WANTED AND MySQL_lib_FOUND) message(STATUS "Found MySQL library: ${MYSQL_LIBRARY}") message(STATUS "Found MySQL headers: ${MYSQL_INCLUDE_DIR}") - else( MYSQL_INCLUDE_DIR ) - message(FATAL_ERROR "Could not find MySQL headers! Please install the development libraries and headers") - endif( MYSQL_INCLUDE_DIR ) - if( MYSQL_EXECUTABLE ) + endif() + if(MySQL_binary_WANTED AND MySQL_binary_FOUND) message(STATUS "Found MySQL executable: ${MYSQL_EXECUTABLE}") - endif( MYSQL_EXECUTABLE ) - mark_as_advanced( MYSQL_FOUND MYSQL_LIBRARY MYSQL_EXTRA_LIBRARIES MYSQL_INCLUDE_DIR MYSQL_EXECUTABLE ) -else( MYSQL_LIBRARY ) + endif() + mark_as_advanced(MYSQL_FOUND MYSQL_LIBRARY MYSQL_EXTRA_LIBRARIES MYSQL_INCLUDE_DIR MYSQL_EXECUTABLE) + + check_mysql_version() + + if(NOT TARGET MySQL::MySQL AND MySQL_lib_WANTED AND MySQL_lib_FOUND) + add_library(MySQL::MySQL UNKNOWN IMPORTED) + set_target_properties(MySQL::MySQL + PROPERTIES + IMPORTED_LOCATION + "${MYSQL_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES + "${MYSQL_INCLUDE_DIR}") + endif() +else() message(FATAL_ERROR "Could not find the MySQL libraries! Please install the development libraries and headers") -endif( MYSQL_LIBRARY ) +endif() |