summaryrefslogtreecommitdiff
path: root/src/cmake
diff options
context:
space:
mode:
authorGrimdhex <176165533+Grimdhex@users.noreply.github.com>2024-12-19 18:27:19 +0100
committerGitHub <noreply@github.com>2024-12-19 18:27:19 +0100
commit866c304d85e917b0330f4a7f2956538f0befe3c7 (patch)
treef5cee91ebbff5fdba39e666f97239afaad99042b /src/cmake
parent0bc70670d2eb129bc8629670420363089f9dded0 (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.cmake297
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()