diff --git a/CMakeLists.txt b/CMakeLists.txt index edf16eb..670fd58 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,9 +19,9 @@ IF(APPLE) # productbuild packaging stuff - cmake_minimum_required(VERSION 3.23) + CMAKE_MINIMUM_REQUIRED(VERSION 3.23) ELSE() - cmake_minimum_required(VERSION 3.1) + CMAKE_MINIMUM_REQUIRED(VERSION 3.1) ENDIF() CMAKE_POLICY(SET CMP0048 NEW) @@ -57,6 +57,7 @@ LIST(REMOVE_ITEM MAODBC_LANGUAGES "RC") SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake) SET(LIBRARY_NAME "mariadbcpp") +SET(STATIC_LIBRARY_NAME "${LIBRARY_NAME}-static") CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/src/Version.h.in ${CMAKE_SOURCE_DIR}/src/Version.h) @@ -416,8 +417,6 @@ IF(WIN32) MESSAGE(STATUS "Sign MSI package: ${WITH_SIGNCODE}") ENDIF() -OPTION(BUILD_SHARED_LIBS "Build as a shared library" ON) - # By now we have everything needed by tests. If we need to build them only - firing config now and exit # There is "normal" tests config below IF(BUILD_TESTS_ONLY) @@ -539,19 +538,27 @@ ELSE() MESSAGE(STATUS "Linking Connector/C library statically(${MARIADB_CLIENT_TARGET_NAME})") ENDIF() -IF(BUILD_SHARED_LIBS) - SET(LIBRARY_TYPE SHARED) - MESSAGE(STATUS "Building as a shared library") -ELSE() - SET(LIBRARY_TYPE STATIC) - MESSAGE(STATUS "Building as a static library") + +ADD_LIBRARY(${LIBRARY_NAME}_obj OBJECT ${MACPP_SOURCES}) +IF(UNIX) + SET_TARGET_PROPERTIES(${LIBRARY_NAME}_obj PROPERTIES COMPILE_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS}") ENDIF() +SET(${LIBRARY_NAME}_OBJECTS $) IF(WIN32) - ADD_LIBRARY(${LIBRARY_NAME} ${LIBRARY_TYPE} ${MACPP_SOURCES} ${CMAKE_SOURCE_DIR}/src/maconncpp.def ${CMAKE_SOURCE_DIR}/src/maconncpp.rc) + ADD_LIBRARY(${LIBRARY_NAME} SHARED ${CMAKE_SOURCE_DIR}/src/maconncpp.rc ${${LIBRARY_NAME}_OBJECTS} ${CMAKE_SOURCE_DIR}/src/maconncpp.def) + ADD_LIBRARY(${STATIC_LIBRARY_NAME} STATIC ${${LIBRARY_NAME}_OBJECTS} ${CMAKE_SOURCE_DIR}/src/maconncpp.rc) ELSE() + # Xcode doesn't support targets that have only object files, + # so let's add an empty file to keep Xcode happy + IF(CMAKE_GENERATOR MATCHES Xcode) + FILE(WRITE ${CMAKE_BINARY_DIR}/empty.cpp "") + SET(EMPTY_FILE ${CMAKE_BINARY_DIR}/empty.cpp) + ENDIF() # MESSAGE(STATUS "Version script: ${CMAKE_SOURCE_DIR}/src/maconncpp.def") - ADD_LIBRARY(${LIBRARY_NAME} ${LIBRARY_TYPE} ${MACPP_SOURCES}) + ADD_LIBRARY(${LIBRARY_NAME} SHARED ${${LIBRARY_NAME}_OBJECTS} ${EMPTY_FILE}) + ADD_LIBRARY(${STATIC_LIBRARY_NAME} STATIC ${${LIBRARY_NAME}_OBJECTS} ${EMPTY_FILE}) + IF(APPLE) SET_TARGET_PROPERTIES(${LIBRARY_NAME} PROPERTIES LINK_FLAGS "-Wl" INSTALL_RPATH_USE_LINK_PATH 0 @@ -559,10 +566,18 @@ ELSE() XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME YES XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--timestamp -f" INSTALL_RPATH "${MAODBC_INSTALL_RPATH}") + SET_TARGET_PROPERTIES(${STATIC_LIBRARY_NAME} PROPERTIES + INSTALL_RPATH_USE_LINK_PATH 0 + BUILD_WITH_INSTALL_RPATH 1 + XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME YES + XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--timestamp -f" + INSTALL_RPATH "${MAODBC_INSTALL_RPATH}") IF(WITH_SIGNCODE) SET_TARGET_PROPERTIES(${LIBRARY_NAME} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Developer ID Application: ${DEVELOPER_ID}") + SET_TARGET_PROPERTIES(${STATIC_LIBRARY_NAME} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Developer ID Application: ${DEVELOPER_ID}") ELSE() SET_TARGET_PROPERTIES(${LIBRARY_NAME} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "") + SET_TARGET_PROPERTIES(${STATIC_LIBRARY_NAME} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "") ENDIF() ELSE() # SET_TARGET_PROPERTIES(${LIBRARY_NAME} PROPERTIES LINK_FLAGS "-Wl,--version-script=${CMAKE_SOURCE_DIR}/src/maconncpp.def") @@ -570,6 +585,11 @@ ELSE() ENDIF() TARGET_LINK_LIBRARIES(${LIBRARY_NAME} ${MARIADB_CLIENT_TARGET_NAME} ${PLATFORM_DEPENDENCIES}) +TARGET_LINK_LIBRARIES(${STATIC_LIBRARY_NAME} mariadbclient) + +INCLUDE(symlink) +CREATE_SYMLINK(lib${LIBRARY_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX} ${STATIC_LIBRARY_NAME} ${INSTALL_LIBDIR}) + ADD_DEPENDENCIES(${LIBRARY_NAME} DEPENDENCIES_FOR_PACKAGE) ########## Packaging ########## @@ -595,7 +615,11 @@ ELSE() INSTALL(TARGETS ${LIBRARY_NAME} LIBRARY DESTINATION ${INSTALL_LIBDIR} - COMPONENT CppLibs) + COMPONENT SharedLibraries) + INSTALL(TARGETS + ${STATIC_LIBRARY_NAME} + ARCHIVE DESTINATION ${INSTALL_LIBDIR} + COMPONENT Development) MESSAGE(STATUS "Documentation installed to ${INSTALL_DOCDIR}") MESSAGE(STATUS "License file installed to ${INSTALL_LICENSEDIR}") @@ -616,7 +640,7 @@ ENDIF() IF(WITH_UNIT_TESTS AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt") ADD_SUBDIRECTORY(test) ADD_CUSTOM_COMMAND(TARGET ${LIBRARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy $ test) + COMMAND ${CMAKE_COMMAND} ARGS -E copy $ test) IF(NOT USE_SYSTEM_INSTALLED_LIB) ADD_CUSTOM_COMMAND(TARGET ${LIBRARY_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E copy $ test) diff --git a/cmake/packaging.cmake b/cmake/packaging.cmake index a9cbfc2..27931ef 100644 --- a/cmake/packaging.cmake +++ b/cmake/packaging.cmake @@ -14,9 +14,9 @@ SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README") SET(CPACK_PACKAGE_API_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/include/") IF(INSTALL_LAYOUT STREQUAL "DEFAULT") - SET(CPACK_COMPONENTS_ALL ClientPlugins CppLibs ConCLib Documentation PublicAPI) + SET(CPACK_COMPONENTS_ALL ClientPlugins SharedLibraries ConCLib Documentation Development) ELSE() - SET(CPACK_COMPONENTS_ALL CppLibs Documentation PublicAPI) + SET(CPACK_COMPONENTS_ALL SharedLibraries Documentation Development) ENDIF() IF(NOT SYSTEM_NAME) diff --git a/cmake/symlink.cmake b/cmake/symlink.cmake new file mode 100644 index 0000000..c1c883d --- /dev/null +++ b/cmake/symlink.cmake @@ -0,0 +1,35 @@ +# +# Copyright (C) 2013-2016 MariaDB Corporation AB +# +# Redistribution and use is allowed according to the terms of the New +# BSD license. +# For details see the COPYING-CMAKE-SCRIPTS file. +# +MACRO(create_symlink symlink_name target install_path) +# According to cmake documentation symlinks work on unix systems only +IF(UNIX) + # Get target components + ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${symlink_name} + COMMAND ${CMAKE_COMMAND} ARGS -E remove -f ${symlink_name} + COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink $ ${symlink_name} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS ${target} + ) + + ADD_CUSTOM_TARGET(SYM_${symlink_name} + ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${symlink_name}) + SET_TARGET_PROPERTIES(SYM_${symlink_name} PROPERTIES CLEAN_DIRECT_OUTPUT 1) + + IF(CMAKE_GENERATOR MATCHES "Xcode") + # For Xcode, replace project config with install config + STRING(REPLACE "${CMAKE_CFG_INTDIR}" + "\${CMAKE_INSTALL_CONFIG_NAME}" output ${CMAKE_CURRENT_BINARY_DIR}/${symlink_name}) + ENDIF() + + # presumably this will be used for libmysql*.so symlinks + INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${symlink_name} DESTINATION ${install_path} + COMPONENT Development) +ENDIF() +ENDMACRO() diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index f674a1f..50052cd 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -33,13 +33,13 @@ ENDIF() INSTALL(FILES ${MARIADBCPP_PUBLIC_API} DESTINATION ${INSTALL_INCLUDEDIR} - COMPONENT PublicAPI) + COMPONENT Development) INSTALL(FILES ${MARIADBCPP_PUBLIC_CLASSES} DESTINATION ${INSTALL_INCLUDEDIR}/conncpp - COMPONENT PublicAPI) + COMPONENT Development) INSTALL(FILES ${MARIADBCPP_COMPAT_STUBS} DESTINATION ${INSTALL_INCLUDEDIR}/conncpp/compat - COMPONENT PublicAPI) + COMPONENT Development) diff --git a/libmariadb b/libmariadb index 458a439..c2b322d 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit 458a4396b443dcefedcf464067560078aa09d8b4 +Subproject commit c2b322d2ca27ef66385d9938b98541c7cf14ac74 diff --git a/src/CallableParameterMetaData.cpp b/src/CallableParameterMetaData.cpp index aab7334..149e2ca 100644 --- a/src/CallableParameterMetaData.cpp +++ b/src/CallableParameterMetaData.cpp @@ -59,7 +59,7 @@ namespace mariadb void CallableParameterMetaData::setIndex(uint32_t index) { if (index < 1 || index > parameterCount) { - throw SQLException("invalid parameter index " + index); + throw SQLException("invalid parameter index " + std::to_string(index)); } rs->absolute(index); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4abf9a8..041dfa8 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,5 +1,5 @@ # Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. -# 2020, 2022 MariaDB Corporation AB +# 2020, 2023 MariaDB Corporation AB # # 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 @@ -29,8 +29,8 @@ #default test server params configured in options_defaults.cmake -configure_file(tests_config.h.in - ${CMAKE_BINARY_DIR}/test/tests_config.h) +CONFIGURE_FILE(tests_config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/tests_config.h) INCLUDE_DIRECTORIES("${CMAKE_BINARY_DIR}/test") @@ -45,10 +45,24 @@ IF(WIN32) ADD_DEFINITIONS("-D_CRT_SECURE_NO_WARNINGS") ADD_DEFINITIONS("-DMARIADB_EXPORTED=__declspec(dllimport)") -ELSEIF(NOT WIN32) - #ADD_DEFINITIONS("-DMARIADB_EXPORTED") - -ENDIF(WIN32) +ELSE() + IF(USE_SYSTEM_INSTALLED_LIB) + IF(CMAKE_VERSION VERSION_GREATER 3.22.0) + CMAKE_HOST_SYSTEM_INFORMATION(RESULT DISTR QUERY DISTRIB_INFO) + ELSE() + EXECUTE_PROCESS(COMMAND cat /etc/os-release + COMMAND grep "^ID=" + COMMAND sed -e "s/ID=//g" + COMMAND sed -e "s/\"//g" + COMMAND xargs echo + OUTPUT_VARIABLE DISTR_ID) + STRING(STRIP "${DISTR_ID}" DISTR_ID) + ENDIF() + IF(DISTR_ID STREQUAL "centos" OR DISTR_ID STREQUAL "rhel") + SET(STATLIB_DEPS dl ssl crypto z) + ENDIF() + ENDIF() +ENDIF() ENABLE_TESTING() @@ -56,8 +70,9 @@ IF(CMAKE_COMPILER_IS_GNUCC AND MYSQLCPPCONN_GCOV_ENABLE) SET(MY_GCOV_LINK_LIBRARIES gcov) ENDIF(CMAKE_COMPILER_IS_GNUCC AND MYSQLCPPCONN_GCOV_ENABLE) +# static_test is now linked against static driver library ADD_EXECUTABLE(static_test static_test.cpp) -TARGET_LINK_LIBRARIES(static_test ${LIBRARY_NAME} ${PLATFORM_DEPENDENCIES} ${MY_GCOV_LINK_LIBRARIES}) +TARGET_LINK_LIBRARIES(static_test ${STATIC_LIBRARY_NAME} ${PLATFORM_DEPENDENCIES} ${STATLIB_DEPS} ${MY_GCOV_LINK_LIBRARIES}) ADD_TEST(static_test ${EXECUTABLE_OUTPUT_PATH}/static_test) SET_TESTS_PROPERTIES(static_test PROPERTIES TIMEOUT 120) diff --git a/wininstall/CMakeLists.txt b/wininstall/CMakeLists.txt index 4626b29..2fb4ad2 100644 --- a/wininstall/CMakeLists.txt +++ b/wininstall/CMakeLists.txt @@ -89,7 +89,7 @@ ADD_CUSTOM_TARGET( COMMAND ${WIX_DIR}candle.exe -ext WixUIExtension -ext WixUtilExtension mariadb_conncpp.xml -o mariadb_conncpp.wixobj) ADD_DEPENDENCIES(${MSI_PACKAGE} CPP_WIX) -ADD_DEPENDENCIES(CPP_WIX ${LIBRARY_NAME}) +ADD_DEPENDENCIES(CPP_WIX ${LIBRARY_NAME} ${STATIC_LIBRARY_NAME}) IF(NOT USE_SYSTEM_INSTALLED_LIB) ADD_DEPENDENCIES(CPP_WIX ${LIBRARY_NAME} dialog caching_sha2_password sha256_password mysql_clear_password) ENDIF() diff --git a/wininstall/mariadb_conncpp.xml.in b/wininstall/mariadb_conncpp.xml.in index f9f699e..368ff62 100644 --- a/wininstall/mariadb_conncpp.xml.in +++ b/wininstall/mariadb_conncpp.xml.in @@ -57,6 +57,7 @@ +