From f931b8ef76c2d349caaef65f340c5c4a4829b7a7 Mon Sep 17 00:00:00 2001 From: Lawrin Novitsky Date: Wed, 13 Dec 2023 17:54:24 +0100 Subject: [PATCH] CONCPP-117 Adding build and packaging of the static library Added new target for comiling objects that then used by both shared and static libraries targets. Static library on Windows named mariadbcpp-static.lib static_test is now linked against static library, as we need to test it (static library) somehow, and the name of test kinda suggested to use it. It's been added to msi and other packages. MSI target depends on static lib target. Renamed package components the way it's done in C/C. Static lib and headers are in Development, library is in SharedLibraries. Small error mistake in one class(not related to the commit, just not to be lost) --- CMakeLists.txt | 52 ++++++++++++++++++++++--------- cmake/packaging.cmake | 4 +-- cmake/symlink.cmake | 35 +++++++++++++++++++++ include/CMakeLists.txt | 6 ++-- libmariadb | 2 +- src/CallableParameterMetaData.cpp | 2 +- test/CMakeLists.txt | 31 +++++++++++++----- wininstall/CMakeLists.txt | 2 +- wininstall/mariadb_conncpp.xml.in | 1 + 9 files changed, 105 insertions(+), 30 deletions(-) create mode 100644 cmake/symlink.cmake 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 @@ +