mysql-concpp-config.cmake.in (741 lines of code) (raw):
# Copyright (c) 2023, 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.
#
# Without limiting anything contained in the foregoing, this file,
# which is part of Connector/C++, is also subject to the
# Universal FOSS Exception, version 1.0, a copy of which can be found at
# https://oss.oracle.com/licenses/universal-foss-exception.
#
# 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
#
# Cmake configuration file for MySQL Connector/C++ package `mysql-concpp`
# =======================================================================
#
# See also: https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html
#
# The following import targets are created by the package. All these targets
# are in the `mysql::` namespace.
#
# - concpp-xdevapi, concpp -- the XDevAPI variant of the library
# - concpp-xdevapi-static, concpp-static -- static variant of the above
# - concpp-jdbc -- the JDBC variant of the library
# - concpp-jdbc-static -- static variant of the above
#
# Targets `mysql::concpp` and `mysql::concpp-static` are aliases for
# `mysql::concpp-xdevapi` and `mysql::concpp-xdevapi-static`, respectively.
#
# Also, the following variables are set:
#
# - Xxx_FOUND
# - Xxx_JDBC_FOUND, Xxx_jdbc_FOUND -- (1a)
# - Xxx_DEBUG_FOUND, Xxx_debug_FOUND -- (1b)
# - Xxx_RELEASE_FOUND, Xxx_release_FOUND -- (1b)
# - Xxx_VERSION, Xxx_VERSION_CC
# - Xxx_ROOT_DIR -- (2)
# - Xxx_RUNTIME_LIBRARY_DIRS, Xxx_RUNTIME_LIBRARY_DIR -- (2,3)
# - Xxx_RUNTIME_LIBRARY_DIRS_DEBUG, Xxx_RUNTIME_LIBRARY_DIR_DEBUG -- (4a)
# - Xxx_RUNTIME_LIBRARY_DIRS_RELEASE, Xxx_RUNTIME_LIBRARY_DIR_RELEASE -- (4b)
# - Xxx_PLUGIN_DIR -- (5a,5b)
#
# In these variable names Xxx is either `MYSQL_CONCPP` or `mysql-concpp`,
# CC is version component: one of `MAJOR`, `MINOR` or `PATCH`.
#
# Note (1a): Set to true if the classic JDBC connector libraries were found and
# the -jdbc targets are defined. It must be the case if `REQUIRE jdbc` clause
# was used in the cmake `find_package()` command.
#
# Note (1b): These are set to true if debug/release libraries are available
# (see below).
#
# Note (2): Set only in case of a monolithic install (TGZ, ZIP, MSI).
#
# Note (3): Application that links to shared connector libraries must find
# these libraries at runtime. Depending on the platform this is achieved by
# configuring RPATH in the executable, editing environment variables
# or copying shared libraries to the location of the executable. In either
# case the _RUNTIME_LIBRARY_DIR(S) variable gives the location where shared
# connector libraries can be found.
#
# Note (4a): If debug variants of connector libraries were found these
# variables are set to their location.
#
# Note (4b): For consistency, these variables are set if release variants
# of connector libraries were found and in that case they are equal
# to _RUNTIME_LIBRARY_DIR(S) ones.
#
# Note (5a): The JDBC connector might require loading of authentication plugins
# at connection time (depending on authentication mechanism being used). These
# plugins are in the location given by _PLUGIN_DIR variable. Depending on
# the installation type it might be necessary to specify this location
# with connection configuration options for plugins to be correctly found
# at runtime (see: https://dev.mysql.com/doc/connector-cpp/8.2/en/connector-cpp-authentication.html)
#
# Note (5b): Authentication plugins are bundled with the connector and
# the _PLUGIN_DIR variable is set only when the JDBC connector links the MySQL
# client library statically (which is the typical case). It is also possible
# to build JDBC connector with dynamic linking to the MySQL client library.
# In that case plugins are not bundled with the connector and _PLUGIN_DIR
# variable is not set -- if needed the plugins that come with the MySQL client
# library should be used in that case.
#
# Note: The variables are put in the cache but if Xxx_FOUND is not set or
# is false then the module will be re-loaded and the other variables in
# the cache will be overwritten with newly detected values.
#
# Note: If mysql-concpp_FIND_VERBOSE is true when loading package diagnostic
# messages will be printed by this script.
#
#
# OpenSSL dependency
# ------------------
#
# Connector/C++ requires OpenSSL libraries. Depending on the platform and
# the installation type it is either expected that OpenSSL will be installed
# on the system or these libraries are bundled in the connector package.
# Connector library targets are configured to use OpenSSL from appropriate
# locations. This can be overridden by user -- if `mysql::openssl` target
# is defined prior to loading `mysql-concpp` package then this target is used
# to resolve dependency on the OpenSSL library.
#
# MySQL client library dependency
# -------------------------------
#
# If JDBC connector library is built with the MySQL client library linked
# dynamically then the `concpp-jdbc-static` target depends on `libmysqlclient`
# which should be available on the build host. If it is installed
# in non-standard location then config variable WITH_MYSQL should be set
# to point at the MySQL install location. The library search path will
# be augmented to find the client library installed at that location.
#
# Note that connector libraries published by MySQL have the client library
# statically linked in so that there is no external dependency on it.
#
# Debug libraries
# ---------------
#
# When linking with static Connector/C++ library on Windows and building
# in debug mode the library built in debug mode is needed. Such debug builds
# of Connector/C++ are distributed as a separate package to be installed
# on top of the regular one. If debug libraries are available this script
# will detect them and configure mysql:: import targets so that they use
# debug variants of the library for builds in debug mode. The presence
# of debug libraries is indicated by setting _DEBUG_FOUND variable to true.
# It is also possible to request "debug" component using `REQUIRE debug`
# clause of `find_package()` command. If this is done then `find_package()`
# will fail if debug libraries were not found.
#
# When using custom builds of Connector/C++ it is possible to have
# an installation with only debug libraries. On Windows, in such situation,
# the connector targets created here will work only for debug builds.
# On non-Windows platforms debug libraries can and will be used for building
# in any mode. Presence of release libraries is indicated by _RELEASE_FOUND
# variable. One can use `REQUIRE release` clause of `find_package()` command
# to ensure that release variants of the libraries are present.
#
# Note: Debug libraries are needed and used only on Windows. For Linux
# separate packages with debug symbols are available that can be used
# to debug connector libraries but only release builds of these libraries
# are distributed.
#
# Note: When only debug libraries are available the _RUNTIME_LIBRARY_DIR(S)
# variables point at the location of these debug libraries on non-Windows
# platforms (because they are used by other build types). However, on Windows
# the _RUNTIME_LIBRARY_DIR(S) variables still point to the location where
# release variants of the libraries should be installed (but are not present).
# The libraries can be located using _RUNTIME_LIBRARY_DIR(S)_DEBUG variables
# in such scenario.
# message(STATUS "mysql-concpp module config (${MYSQL_CONCPP_FOUND}, ${mysql-concpp_FOUND})")
if(mysql-concpp_FOUND)
return()
endif()
function(message_info)
if(NOT mysql-concpp_FIND_VERBOSE OR mysql-concpp_FIND_QUIETLY)
return()
endif()
message(STATUS "mysql-concpp: " ${ARGV})
endfunction()
function(set_warning)
set(warning_message ${ARGV} CACHE INTERNAL "warning message")
endfunction()
#
# JDBC_MYSQL_DEP tells whether JDBC connector library depends on the MySQL
# client library. This is not the case when the connector library links
# the client library statically. However, if WITH_MYSQL option is defined
# and not false then JDBC targets are always configured to depend on the client
# library. Additionally, if WITH_MYSQL is a path pointing at MySQL install
# location, the library path will be extended so that linker looks for the
# client library at that location.
#
set(JDBC_MYSQL_DEP OFF)
if(WITH_MYSQL OR NOT @MYSQLCLIENT_STATIC_LINKING@)
set(JDBC_MYSQL_DEP ON)
endif()
macro(main)
# We can have two types of installations -- in case of RPM/DEB install
# connector files are installed to system-wide locations (system-wide
# install), in other cases all connector files are installed into a single
# root directory (monolithic install).
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/include/mysqlx/xdevapi.h")
# Case of monolithic install
set(monolithic 1)
set(MYSQL_CONCPP_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}")
message_info("Module installed at: ${MYSQL_CONCPP_ROOT_DIR}")
set(INCLUDE_DIR "${MYSQL_CONCPP_ROOT_DIR}/include")
set(LIBRARY_DIR "${MYSQL_CONCPP_ROOT_DIR}/@INSTALL_LIB_DIR@")
set(fail_message "Could NOT find MySQL Connector/C++ libraries at ${MYSQL_CONCPP_ROOT_DIR}.")
else()
# System-wide install, DEB or RPM layout.
set(monolithic 0)
set(INCLUDE_DIR "/usr/include/mysql-cppconn")
# We do not set LIBRARY_DIR because in this case we will search for the libraries in system-wide locations.
set(fail_message
"Could NOT find MySQL Connector/C++ libraries at system-wide locations."
)
endif()
# Headers must always be found first.
find_includes()
if(fail_message_includes)
set_not_found(
"Could NOT find MySQL Connector/C++ headers (${fail_message_includes})."
)
# Note: Error out early.
message(FATAL_ERROR ${mysql-concpp_NOT_FOUND_MESSAGE})
endif()
message_info("Include path: ${MYSQL_CONCPP_INCLUDE_DIR}")
# This suffix is used to locate static and import libraries on Windows
set(vs_suffix)
if(WIN32)
set(vs_suffix vs14)
endif()
# Find required dependencies. Currently this looks for OpenSSL and defines
# `mysql::openssl` interface library for it if found.
find_deps()
# Find connector libraries and define interface targets for the ones that
# were found. This will set/update LIBRARY_DIR to the location where
# libraries were found and will also set RELEASE/DEBUG_FOUND flags
# if the corresponding variant of the libraries was found.
set(DEBUG_FOUND 0)
set(RELEASE_FOUND 0)
find_connector(XDevAPI)
find_connector(JDBC)
set(MYSQL_CONCPP_DEBUG_FOUND ${DEBUG_FOUND})
set(MYSQL_CONCPP_RELEASE_FOUND ${RELEASE_FOUND})
if(monolithic)
# Set MYSQL_CONCPP_RUNTIME_LIBRARY_DIR_*. Variables based on LIBRARY_DIR
# determined above.
if(DEBUG_FOUND)
set(MYSQL_CONCPP_RUNTIME_LIBRARY_DIR_DEBUG "${LIBRARY_DIR}/debug")
elseif(WIN32)
set_warning(
"Debug variants of connector libraries were not found"
"at the install location -- building in debug mode will not work"
)
endif()
if(RELEASE_FOUND)
set(MYSQL_CONCPP_RUNTIME_LIBRARY_DIR_RELEASE "${LIBRARY_DIR}")
set(MYSQL_CONCPP_RUNTIME_LIBRARY_DIR "${LIBRARY_DIR}")
elseif(NOT WIN32)
# If release libraries were not found and we are on non-Win platform we
# will use debug libraries also for release builds.
message_info(
"Using debug variants of connector libraries for release builds because"
" release variants are not found at the install location"
)
set(
MYSQL_CONCPP_RUNTIME_LIBRARY_DIR
"${MYSQL_CONCPP_RUNTIME_LIBRARY_DIR_DEBUG}"
)
else()
# On Windows one can not mix release and debug code. The targets created
# above have only debug-mode paths defined. We set
# MYSQL_CONCPP_RUNTIME_LIBRARY_DIR to the path where release libraries
# would be expected even if they were not found there.
set_warning(
"Release variants of connector libraries were not found"
"at the install location -- building in release mode will not work"
)
set(MYSQL_CONCPP_RUNTIME_LIBRARY_DIR "${LIBRARY_DIR}")
endif()
# Note: Set plugin dir location only if connector has client library
# statically linked in (does not depend on external one).
if(NOT JDBC_MYSQL_DEP)
set(MYSQL_CONCPP_PLUGIN_DIR "${LIBRARY_DIR}/plugin")
endif()
else()
# Note: In system-wide install case we do not set _RUNTIME_LIBRARY_DIR_*
# variables as libraries are installed at system-wide locations.
if(NOT JDBC_MYSQL_DEP)
set(MYSQL_CONCPP_PLUGIN_DIR
"${LIBRARY_DIR}/mysql/libmysqlcppconn@JDBC_ABI_VERSION_MAJOR@/plugin"
)
endif()
endif()
# Aliases for -xdevapi* targets.
foreach(suffix "" "-static" "-debug" "-static-debug")
if(TARGET mysql::concpp-xdevapi${suffix})
set(MYSQL_CONCPP_FOUND 1)
add_library(mysql::concpp${suffix} ALIAS mysql::concpp-xdevapi${suffix})
endif()
if(TARGET mysql::concpp-jdbc${suffix})
set(MYSQL_CONCPP_JDBC_FOUND 1)
endif()
endforeach()
# Build the NOT_FOUND message.
# Note: The different find_xxx() functions set the specific part
# of the message, such as ${fail_message_devapi}, in case of failure.
if(fail_message_devapi) # AND MYSQL_CONCPP_FIND_REQUIRED_devapi)
list(APPEND fail_message ${fail_message_devapi})
elseif(fail_message_jdbc) # AND MYSQL_CONCPP_FIND_REQUIRED_jdbc)
list(APPEND fail_message ${fail_message_jdbc})
endif()
set_not_found(${fail_message})
# Build the success message which can optionally contain warnings
# TODO: Warnings about missing debug/release library variants
set(MYSQL_CONCPP_FOUND_MSG ${MYSQL_CONCPP_INCLUDE_DIR})
if(warning_message)
string(JOIN " " warning_message ${warning_message})
set(MYSQL_CONCPP_FOUND_MSG
"${MYSQL_CONCPP_FOUND_MSG} WARNING: ${warning_message}"
)
endif()
include(FindPackageHandleStandardArgs)
# Note: The _FOUND variable name expected by FPHSA for component CCC
# is mysql-concpp_CCC_FOUND
set(mysql-concpp_jdbc_FOUND ${MYSQL_CONCPP_JDBC_FOUND})
set(mysql-concpp_debug_FOUND ${MYSQL_CONCPP_DEBUG_FOUND})
set(mysql-concpp_release_FOUND ${MYSQL_CONCPP_RELEASE_FOUND})
find_package_handle_standard_args(mysql-concpp
REQUIRED_VARS
MYSQL_CONCPP_FOUND_MSG
MYSQL_CONCPP_INCLUDE_DIR
MYSQL_CONCPP_FOUND
VERSION_VAR mysql-concpp_VERSION
HANDLE_COMPONENTS
FAIL_MESSAGE "${mysql-concpp_NOT_FOUND_MESSAGE}"
)
# Set alternative variables
set(MYSQL_CONCPP_jdbc_FOUND ${MYSQL_CONCPP_JDBC_FOUND})
set(MYSQL_CONCPP_debug_FOUND ${MYSQL_CONCPP_DEBUG_FOUND})
set(MYSQL_CONCPP_release_FOUND ${MYSQL_CONCPP_RELEASE_FOUND})
foreach(var
ROOT_DIR PLUGIN_DIR
RUNTIME_LIBRARY_DIR RUNTIME_LIBRARY_DIRS
RUNTIME_LIBRARY_DIR_DEBUG RUNTIME_LIBRARY_DIRS_DEBUG
RUNTIME_LIBRARY_DIR_RELEASE RUNTIME_LIBRARY_DIRS_RELEASE
DEBUG_FOUND debug_FOUND RELEASE_FOUND release_FOUND
JDBC_FOUND jdbc_FOUND
)
if(NOT DEFINED MYSQL_CONCPP_${var})
continue()
endif()
# handle _DIR_ and _DIRS_ variants
if(var STREQUAL "RUNTIME_LIBRARY_DIR")
foreach(suffix "" "_RELEASE" "_DEBUG")
if(NOT DEFINED MYSQL_CONCPP_RUNTIME_LIBRARY_DIR${suffix})
continue()
endif()
set(
MYSQL_CONCPP_RUNTIME_LIBRARY_DIRS${suffix}
"${MYSQL_CONCPP_RUNTIME_LIBRARY_DIR${suffix}}"
)
endforeach()
endif()
set(mysql-concpp_${var} ${MYSQL_CONCPP_${var}} CACHE INTERNAL "mysql-concpp module config variable" FORCE)
set(MYSQL_CONCPP_${var} ${MYSQL_CONCPP_${var}} CACHE INTERNAL "mysql-concpp module config variable" FORCE)
endforeach(var)
foreach(ver "" _MAJOR _MINOR _PATCH _TWEAK _COUNT)
if(NOT DEFINED mysql-concpp_VERSION${ver})
continue()
endif()
set(mysql-concpp_VERSION${ver} ${mysql-concpp_VERSION${ver}} CACHE INTERNAL "mysql-concpp module config variable" FORCE)
set(MYSQL_CONCPP_VERSION${ver} ${mysql-concpp_VERSION${ver}} CACHE INTERNAL "mysql-concpp module config variable" FORCE)
endforeach(ver)
endmacro(main)
# Set the _NOT_FOUND message for the module from a list of strings passed
# to the function.
function(set_not_found)
list(JOIN ARGN " " message)
set(mysql-concpp_NOT_FOUND_MESSAGE "${message}" PARENT_SCOPE)
endfunction()
function(find_includes)
#message(STATUS "Looking for headers at: ${INCLUDE_DIR}")
unset(MYSQL_CONCPP_INCLUDE_DIR CACHE)
find_path(MYSQL_CONCPP_INCLUDE_DIR
NAMES mysqlx/xdevapi.h
PATHS ${INCLUDE_DIR}
NO_DEFAULT_PATH
# NO_CACHE # Note: requires cmake 3.21
)
if(NOT MYSQL_CONCPP_INCLUDE_DIR)
if(MYSQL_CONCPP_ROOT_DIR)
set(fail_message_includes
"at MYSQL_CONCPP_ROOT_DIR: ${INCLUDE_DIR}"
)
else()
set(fail_message_includes "at ${INCLUDE_DIR}")
endif()
set_parent(fail_message_includes)
return()
endif()
set_parent(MYSQL_CONCPP_INCLUDE_DIR)
endfunction()
# Find XDevAPI or JDBC connector libraries, as specified by parameter `which`
# and create interface library targets for them. Both shared and static
# variants are searched for. If some libraries are not found the corresponding
# targets are not created.
#
# If LIBRARY_DIR is set the libraries are searched in that location, otherwise
# they are searched in system-wide locations. In either case LIBRARY_DIR is
# set/updated to the location where libraries were found.
#
# Flags RELEASE_FOUND and DEBUG_FOUND are set if the corresponding variants
# of the libraries were found.
function(find_connector which)
if(which STREQUAL "JDBC")
set(base_name "mysqlcppconn")
set(target_name "jdbc")
else()
set(base_name "mysqlcppconnx")
set(target_name "xdevapi")
endif()
# Look for the connector library and if found create the import target for
# it. Sets ${target_name}_RELEASE and ${target_name}_DEBUG to indicate
# whether release/debug variant of the library was found. Also sets
# or updates LIBRARY_DIR to the location where the library was found.
add_connector_target(${which} ${target_name} ${base_name})
# Note: if the mysql::openssl target is not defined then we are on Windows
# and no suitable OpenSSL was found. In that case static libraries will
# not work and we do not define these targets.
if(TARGET mysql::openssl)
add_connector_target(${which} ${target_name}-static ${base_name}-static)
endif()
# Process targets created above to do consistency checks and declare required
# dependencies. Also sets DEBUG/RELEASE_FOUND flags as needed.
foreach(tgt ${target_name} ${target_name}-static)
if(${tgt}_RELEASE)
set_parent(RELEASE_FOUND 1)
endif()
if(${tgt}_DEBUG)
set_parent(DEBUG_FOUND 1)
endif()
if(NOT TARGET mysql::concpp-${tgt})
continue()
endif()
if(DEBUG_FOUND AND NOT ${tgt}_DEBUG)
list(APPEND DEBUG_MISSING ${tgt})
endif()
set_parent(DEBUG_MISSING)
if(RELEASE_FOUND AND NOT ${tgt}_RELEASE)
list(APPEND RELEASE_MISSING ${tgt})
endif()
set_parent(RELEASE_MISSING)
unset(libs)
# JDBC dependency on the client library
if(tgt MATCHES "jdbc" AND JDBC_MYSQL_DEP)
if(NOT WIN32)
list(APPEND libs mysqlclient)
endif()
if(DEFINED WITH_MYSQL AND EXISTS "${WITH_MYSQL}/lib")
message_info("Client library path: ${WITH_MYSQL}/lib")
target_link_directories(mysql::concpp-${tgt}
INTERFACE "${WITH_MYSQL}/lib"
)
endif()
endif()
# OpenSSL dependency (target `mysql::openssl` is defined by find_deps())
#
# Note: Even though JDBC connector does not use OpenSSL directly it might
# have the client library statically linked in and get dependency
# on OpenSSL that way.
if(TARGET mysql::openssl)
list(APPEND libs mysql::openssl)
endif()
if(tgt MATCHES "-static")
set_target_properties(mysql::concpp-${tgt} PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES CXX
INTERFACE_COMPILE_DEFINITIONS STATIC_CONCPP
)
# Handle additional dependencies required for static library.
if(WIN32)
list(APPEND libs Dnsapi)
else()
if(NOT APPLE)
list(APPEND libs pthread)
endif()
# On Solaris we additionally need couple more libs.
if(CMAKE_SYSTEM_NAME MATCHES "SunOS")
list(APPEND libs socket nsl)
endif()
if(NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
list(APPEND libs resolv dl)
endif()
endif()
endif()
target_link_libraries(mysql::concpp-${tgt} INTERFACE ${libs})
if(libs)
string(JOIN " " libs ${libs})
message_info("Link libraries for target ${tgt}: ${libs}")
endif()
endforeach(tgt)
endfunction(find_connector)
# Create connector library import target named ${tgt} pointing at library
# with base name ${base_name} if it was found.
#
# If LIBRARY_DIR is set the library is searched in that location, otherwise it
# is searched in system-wide locations. If the library is found, LIBRARY_DIR
# is set/updated to the location where it was found.
#
# Both release and debug variants of the library are searched for. Flags
# ${tgt}_RELEASE and ${tgt}_DEBUG are set to tell which variant was found.
#
# Note: The which parameter, either "XDevAPI" or "JDBC", is used for
# diagnostics only.
function(add_connector_target which tgt base_name)
set(lib_name "${base_name}")
set(type "SHARED")
set(static 0)
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX})
if(tgt MATCHES "-static")
set(type "STATIC")
set(static 1)
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
endif()
set(XDevAPI_abi @ABI_VERSION_MAJOR@)
set(JDBC_abi @JDBC_ABI_VERSION_MAJOR@)
set(find_lib_paths)
set(win_opts)
if(LIBRARY_DIR)
set(find_lib_paths PATHS "${LIBRARY_DIR}" NO_DEFAULT_PATH)
endif()
if(WIN32)
if(static)
set(win_opts PATH_SUFFIXES ${vs_suffix})
else()
set(lib_name "${base_name}-${${which}_abi}-vs14")
endif()
endif()
#message("!!! looking for ${lib_name} with options: ${find_lib_opts}")
unset(lib_path CACHE)
find_library(lib_path
NAMES ${lib_name}
${find_lib_paths} ${win_opts}
# NO_CACHE
)
if(lib_path)
message_info(
"Found ${which} ${type} library at: ${lib_path}"
)
set_parent(${tgt}_RELEASE 1)
# Note: LIBRARY_DIR is not yet set here if we were looking for the library
# in system-wide locations. In any case we set/update LIBRARY_DIR to
# the actual location of the library that was found.
get_filename_component(LIBRARY_DIR "${lib_path}" DIRECTORY)
set_parent(LIBRARY_DIR)
if(WIN32 AND NOT static)
find_imp_lib(imp_lib_path ${base_name} "${lib_path}")
endif()
endif()
# Look for debug variant of the library if LIBRARY_DIR is set. This is
# the case in one of these situations:
#
# a) the release library was found at LIBRARY_DIR above;
#
# b) we have monolithic connector install and LIBRARY_DIR is the library
# location inside that monolithic install.
#
# Case (b) is if we have not found the release library inside a monolithic
# connector installation but we still can find a debug library there.
if(LIBRARY_DIR)
unset(lib_path_debug CACHE)
find_library(lib_path_debug
NAMES ${lib_name}
PATHS "${LIBRARY_DIR}/debug"
${win_opts}
NO_DEFAULT_PATH
# NO_CACHE
)
if(lib_path_debug)
message_info(
"Found debug variant of ${which} ${type} library at: ${lib_path_debug}"
)
set_parent(${tgt}_DEBUG 1)
if(WIN32 AND NOT static)
find_imp_lib(imp_lib_path_debug ${base_name} "${lib_path_debug}")
endif()
endif()
endif()
if(NOT lib_path AND NOT lib_path_debug)
message_info("Did not find ${which} ${type} library")
return()
endif()
#
# Note: At this point we know that either the release or the debug connector
# was found.
#
# On non-Windows platforms the release connector can be used for debug
# builds if the debug connector was not found and vice-versa, the debug
# connector can be used for release builds if the release connector was
# not found.
#
# However, on Windows it is not possible to mix debug and release code which
# is reflected in the logic below.
#
if(WIN32 AND NOT lib_path_debug)
# If debug connector was not found on Windows we still set debug path to its
# expected location so that:
#
# 1. If debug connector is added later it will be used in debug builds.
#
# 2. If debug connector is not present then debug builds will fail which
# is what we want in that case (rather than incorrectly using the release
# variant of the library).
#
# Note: LIBRARY_DIR must be defined because the release library must have
# been found above.
set(lib_path_debug
"${LIBRARY_DIR}/debug/${lib_name}.dll"
)
set(imp_lib_path_debug
"${LIBRARY_DIR}/debug/${vs_suffix}/${base_name}.lib"
)
# Note: If debug connector was not found on non-Windows platform then
# lib_path_debug remains undefined which means that the import target will
# not have a _DEBUG location defined. Therefore the main (release) location
# will be used also in debug builds as we want in that case.
elseif(WIN32 AND NOT lib_path)
# If release connector was not found on Windows we still set the release
# path to its expected location so that release builds will fail (because
# the release library will be not found at the location) or, if release
# connector is added later release builds will start working.
set(lib_path "${LIBRARY_DIR}/${lib_name}.dll")
set(imp_lib_path "${LIBRARY_DIR}/${vs_suffix}/${base_name}.lib")
elseif(NOT WIN32 AND NOT lib_path)
# If we are on non-Windows platform and the release connector was not found
# then use the debug connector as a replacement.
set(lib_path "${lib_path_debug}")
endif()
set(tgt "concpp-${tgt}")
#message(STATUS "Creating target: mysql::${tgt}")
add_library(mysql::${tgt} ${type} IMPORTED GLOBAL)
target_compile_features(mysql::${tgt} INTERFACE cxx_std_11)
set_target_properties(mysql::${tgt} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${MYSQL_CONCPP_INCLUDE_DIR}"
)
if(lib_path)
set_target_properties(mysql::${tgt} PROPERTIES
IMPORTED_LOCATION "${lib_path}"
)
if(WIN32 AND imp_lib_path)
set_target_properties(mysql::${tgt} PROPERTIES
IMPORTED_IMPLIB "${imp_lib_path}"
)
endif()
endif()
if(lib_path_debug)
set_target_properties(mysql::${tgt} PROPERTIES
IMPORTED_LOCATION_DEBUG "${lib_path_debug}"
)
if(WIN32 AND imp_lib_path_debug)
set_target_properties(mysql::${tgt} PROPERTIES
IMPORTED_IMPLIB_DEBUG "${imp_lib_path_debug}"
)
endif()
endif()
endfunction(add_connector_target)
# On Windows find import library for the DLL library at the given `path` with
# given `base_name`. The location of the import library is stored in variable
# named by `var`.
#
# Note: Not finding an import library for a DLL is a fatal error.
function(find_imp_lib var base_name path)
get_filename_component(base_path ${path} DIRECTORY)
set(CMAKE_FIND_LIBRARY_SUFFIXES .lib)
#message("!!! Looking for import library for: ${path}")
unset(${var} CACHE)
find_library(${var}
NAMES ${base_name}
PATHS ${base_path}
PATH_SUFFIXES ${vs_suffix}
NO_DEFAULT_PATH
# NO_CACHE
)
if(NOT ${var})
message(FATAL_ERROR "Could not find import library for ${path}")
endif()
set_parent(${var})
endfunction(find_imp_lib)
function(find_deps)
if(TARGET mysql::openssl)
message_info(
"Using custom mysql::openssl target to resolve dependency on OpenSSL"
)
return()
endif()
unset(ssl_lib)
if(MYSQL_CONCPP_ROOT_DIR)
# Try to find the bundled OpenSSL
# Note: On Windows we look for the import library with .lib extension.
set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".lib" ".dylib")
unset(ssl_lib CACHE)
find_library(ssl_lib
NAMES ssl libssl
PATHS ${LIBRARY_DIR}
PATH_SUFFIXES private ${vs_suffix}
NO_DEFAULT_PATH
# NO_CACHE
)
unset(ssl_crypto CACHE)
find_library(ssl_crypto
NAMES crypto libcrypto
PATHS ${LIBRARY_DIR}
PATH_SUFFIXES private ${vs_suffix}
NO_DEFAULT_PATH
# NO_CACHE
)
if(NOT ssl_lib OR NOT ssl_crypto)
message_info("Bundled OpenSSL was not found")
set(ssl_lib false)
endif()
endif()
# Note: For some reason interface libraries can not have names with "::"
add_library(mysql_concpp_openssl INTERFACE)
if(ssl_lib)
message_info("Using bundled OpenSSL")
elseif(WIN32)
message(STATUS "mysql-concpp:"
" For static linking the OpenSSL libraries are required but they are"
" not bundled with the connector -- static connector targets will not"
" be created. To use static connector libraries define mysql::openssl"
" target to point at an OpenSSL installation to be used."
)
return()
else()
message_info("Using system OpenSSL libraries")
set(ssl_lib "ssl")
set(ssl_crypto "crypto")
endif()
target_link_libraries(mysql_concpp_openssl INTERFACE
${ssl_lib} ${ssl_crypto}
)
add_library(mysql::openssl ALIAS mysql_concpp_openssl)
endfunction(find_deps)
# Sets given variable in the parent scope to its current value in this scope.
# Optionally, if new value is given after variable name, variable's value
# is changed first.
macro(set_parent var)
#message(STATUS "set_parent: ${var} (${ARGN})")
if(${ARGC} GREATER 1)
set(${var} "${ARGN}")
endif()
set(${var} "${${var}}" PARENT_SCOPE)
endmacro()
main()