From 49a719b78a4c7feccc2aca970ec7fb242e1c121b Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Mon, 19 Mar 2018 10:30:33 -0700 Subject: [libmysql] Use system dependencies to avoid ODR violations --- ports/libmysql/CONTROL | 4 +- ports/libmysql/portfile.cmake | 12 ++- ports/libmysql/system-libs.patch | 150 ++++++++++++++++++++++++++++++++++ scripts/cmake/vcpkg_build_cmake.cmake | 22 +++-- 4 files changed, 178 insertions(+), 10 deletions(-) create mode 100644 ports/libmysql/system-libs.patch diff --git a/ports/libmysql/CONTROL b/ports/libmysql/CONTROL index 6a069b78e..4af150af9 100644 --- a/ports/libmysql/CONTROL +++ b/ports/libmysql/CONTROL @@ -1,4 +1,4 @@ Source: libmysql -Version: 8.0.4 -Build-Depends: boost-algorithm, boost-geometry, boost-optional, boost-functional, boost-graph +Version: 8.0.4-1 +Build-Depends: boost-algorithm, boost-geometry, boost-optional, boost-functional, boost-graph, openssl, icu, libevent, liblzma, lz4, zlib Description: A MySQL client library for C development. diff --git a/ports/libmysql/portfile.cmake b/ports/libmysql/portfile.cmake index 6c60d0ccc..c9859c47b 100644 --- a/ports/libmysql/portfile.cmake +++ b/ports/libmysql/portfile.cmake @@ -22,7 +22,9 @@ vcpkg_from_github( vcpkg_apply_patches( SOURCE_PATH ${SOURCE_PATH} - PATCHES ${CMAKE_CURRENT_LIST_DIR}/ignore-boost-version.patch + PATCHES + ${CMAKE_CURRENT_LIST_DIR}/ignore-boost-version.patch + ${CMAKE_CURRENT_LIST_DIR}/system-libs.patch ) file(REMOVE_RECURSE ${SOURCE_PATH}/include/boost_1_65_0) @@ -44,9 +46,15 @@ vcpkg_configure_cmake( ${STACK_DIRECTION} -DWINDOWS_RUNTIME_MD=ON # Note: this disables _replacement_ of /MD with /MT. If /MT is specified, it will be preserved. -DIGNORE_BOOST_VERSION=ON + -DWITH_SSL=system + -DWITH_ICU=system + -DWITH_LIBEVENT=system + -DWITH_LZMA=system + -DWITH_LZ4=system + -DWITH_ZLIB=system ) -vcpkg_install_cmake() +vcpkg_install_cmake(ADD_BIN_TO_PATH) # delete debug headers file(REMOVE_RECURSE diff --git a/ports/libmysql/system-libs.patch b/ports/libmysql/system-libs.patch new file mode 100644 index 000000000..b5c1cba0d --- /dev/null +++ b/ports/libmysql/system-libs.patch @@ -0,0 +1,150 @@ +diff --git a/cmake/icu.cmake b/cmake/icu.cmake +index ce9cc67..64445c5 100644 +--- a/cmake/icu.cmake ++++ b/cmake/icu.cmake +@@ -40,49 +40,10 @@ SET(DEFAULT_ICU "bundled") + # install_root is either 'system' or is assumed to be a path. + # + MACRO (FIND_ICU install_root) +- IF("${install_root}" STREQUAL "system") +- SET(EXTRA_FIND_LIB_ARGS) +- SET(EXTRA_FIND_INC_ARGS) +- ELSE() +- SET(EXTRA_FIND_LIB_ARGS HINTS "${install_root}" +- PATH_SUFFIXES "lib" "lib64" NO_DEFAULT_PATH) +- SET(EXTRA_FIND_INC_ARGS HINTS "${install_root}" +- PATH_SUFFIXES "include" NO_DEFAULT_PATH) +- ENDIF() +- +- FIND_PATH(ICU_INCLUDE_DIR NAMES unicode/regex.h ${EXTRA_FIND_INC_ARGS}) +- IF (NOT ICU_INCLUDE_DIR) +- MESSAGE(FATAL_ERROR "Cannot find ICU regular expression headers") +- ENDIF() +- +- IF(WIN32) +- SET(ICU_LIBS icuuc icuio icudt icuin) +- ELSE() +- SET(ICU_LIBS icuuc icuio icudata icui18n) +- ENDIF() +- +- SET(ICU_SYSTEM_LIBRARIES) +- FOREACH(ICU_LIB ${ICU_LIBS}) +- UNSET(ICU_LIB_PATH CACHE) +- FIND_LIBRARY(ICU_LIB_PATH NAMES ${ICU_LIB} ${EXTRA_FIND_LIB_ARGS}) +- IF(NOT ICU_LIB_PATH) +- MESSAGE(FATAL_ERROR "Cannot find the ICU library ${ICU_LIB}") +- ENDIF() +- LIST(APPEND ICU_SYSTEM_LIBRARIES ${ICU_LIB_PATH}) +- ENDFOREACH() +- +- # To do: If we include the path in ICU_INCLUDE_DIR, it leads to GUnit +- # picking up the wrong regex.h header. And it looks like we don't need it; +- # at least on Linux, the header gets installed in an OS path anyway. +- IF(NOT "${install_root}" STREQUAL "system") +- SET(ICU_INCLUDE_DIRS ${ICU_INCLUDE_DIR}) +- ENDIF() +- +- SET(ICU_LIBRARIES ${ICU_SYSTEM_LIBRARIES}) +- +- # Needed for version information. +- SET(ICU_COMMON_DIR ${ICU_INCLUDE_DIR}) +- ++ find_package(ICU REQUIRED COMPONENTS uc io dt in) ++ set(ICU_SYSTEM_LIBRARIES ICU::uc ICU::io ICU::dt ICU::in) ++ set(ICU_COMMON_DIR ${ICU_INCLUDE_DIR}) ++ SET(ICU_INCLUDE_DIRS ${ICU_INCLUDE_DIR}) + ENDMACRO() + + MACRO (MYSQL_USE_BUNDLED_ICU) +diff --git a/cmake/lz4.cmake b/cmake/lz4.cmake +index 6e576c3..60cb8ba 100644 +--- a/cmake/lz4.cmake ++++ b/cmake/lz4.cmake +@@ -25,7 +25,7 @@ + + MACRO (FIND_SYSTEM_LZ4) + FIND_PATH(PATH_TO_LZ4 NAMES lz4frame.h) +- FIND_LIBRARY(LZ4_SYSTEM_LIBRARY NAMES lz4) ++ FIND_LIBRARY(LZ4_SYSTEM_LIBRARY NAMES lz4d lz4) + IF (PATH_TO_LZ4 AND LZ4_SYSTEM_LIBRARY) + SET(SYSTEM_LZ4_FOUND 1) + INCLUDE_DIRECTORIES(SYSTEM ${PATH_TO_LZ4}) +diff --git a/cmake/lzma.cmake b/cmake/lzma.cmake +index ac8aaa7..78d8e8d 100644 +--- a/cmake/lzma.cmake ++++ b/cmake/lzma.cmake +@@ -24,15 +24,10 @@ + # bundled is the default + + MACRO (FIND_SYSTEM_LZMA) +- FIND_PATH(PATH_TO_LZMA NAMES lzma/lzma.h) +- FIND_LIBRARY(LZMA_SYSTEM_LIBRARY NAMES lzma) +- IF (PATH_TO_LZMA AND LZMA_SYSTEM_LIBRARY) +- SET(SYSTEM_LZMA_FOUND 1) +- SET(LZMA_INCLUDE_DIR ${PATH_TO_LZMA}) +- SET(LZMA_LIBRARY ${LZMA_SYSTEM_LIBRARY}) +- MESSAGE(STATUS "LZMA_INCLUDE_DIR ${LZMA_INCLUDE_DIR}") +- MESSAGE(STATUS "LZMA_LIBRARY ${LZMA_LIBRARY}") +- ENDIF() ++ find_package(LibLZMA REQUIRED) ++ set(LZMA_INCLUDE_DIR ${LZMA_INCLUDE_DIRS}) ++ set(LZMA_LIBRARY ${LZMA_LIBRARIES}) ++ set(SYSTEM_LZMA_FOUND 1) + ENDMACRO() + + MACRO (MYSQL_USE_BUNDLED_LZMA) +diff --git a/cmake/ssl.cmake b/cmake/ssl.cmake +index 8af9699..2bdfe14 100644 +--- a/cmake/ssl.cmake ++++ b/cmake/ssl.cmake +@@ -104,6 +104,16 @@ ENDMACRO() + # Provides the following configure options: + # WITH_SSL=[yes|bundled|system|] + MACRO (MYSQL_CHECK_SSL) ++ find_package(OpenSSL REQUIRED) ++ set(OPENSSL_LIBRARY ${OPENSSL_SSL_LIBRARY} CACHE STRING "") ++ set(CRYPTO_LIBRARY ${OPENSSL_CRYPTO_LIBRARY} CACHE STRING "") ++ FIND_PROGRAM(OPENSSL_EXECUTABLE openssl ++ DOC "path to the openssl executable") ++ SET(SSL_DEFINES "-DHAVE_OPENSSL") ++ set(SSL_LIBRARIES ${OPENSSL_LIBRARIES}) ++ENDMACRO() ++ ++MACRO (MYSQL_CHECK_SSL_OLD) + IF(NOT WITH_SSL) + IF(WIN32) + CHANGE_SSL_SETTINGS("bundled") +diff --git a/cmake/zlib.cmake b/cmake/zlib.cmake +index e74b8c9..6695075 100644 +--- a/cmake/zlib.cmake ++++ b/cmake/zlib.cmake +@@ -51,27 +51,7 @@ MACRO (MYSQL_CHECK_ZLIB_WITH_COMPRESS) + IF(WITH_ZLIB STREQUAL "bundled") + MYSQL_USE_BUNDLED_ZLIB() + ELSE() +- SET(ZLIB_FIND_QUIETLY TRUE) +- INCLUDE(FindZLIB) +- IF(ZLIB_FOUND) +- INCLUDE(CheckFunctionExists) +- SET(CMAKE_REQUIRED_LIBRARIES z) +- CHECK_FUNCTION_EXISTS(crc32 HAVE_CRC32) +- CHECK_FUNCTION_EXISTS(compressBound HAVE_COMPRESSBOUND) +- CHECK_FUNCTION_EXISTS(deflateBound HAVE_DEFLATEBOUND) +- SET(CMAKE_REQUIRED_LIBRARIES) +- IF(HAVE_CRC32 AND HAVE_COMPRESSBOUND AND HAVE_DEFLATEBOUND) +- SET(ZLIB_LIBRARY ${ZLIB_LIBRARIES} CACHE INTERNAL "System zlib library") +- SET(WITH_ZLIB "system" CACHE STRING +- "Which zlib to use (possible values are 'bundled' or 'system')") +- SET(ZLIB_SOURCES "") +- ELSE() +- SET(ZLIB_FOUND FALSE CACHE INTERNAL "Zlib found but not usable") +- MESSAGE(STATUS "system zlib found but not usable") +- ENDIF() +- ENDIF() +- IF(NOT ZLIB_FOUND) +- MYSQL_USE_BUNDLED_ZLIB() +- ENDIF() ++ find_package(ZLIB REQUIRED) ++ SET(ZLIB_LIBRARY ZLIB::ZLIB CACHE INTERNAL "System zlib library") + ENDIF() + ENDMACRO() diff --git a/scripts/cmake/vcpkg_build_cmake.cmake b/scripts/cmake/vcpkg_build_cmake.cmake index bdf192792..630662588 100644 --- a/scripts/cmake/vcpkg_build_cmake.cmake +++ b/scripts/cmake/vcpkg_build_cmake.cmake @@ -15,6 +15,9 @@ ## The target passed to the cmake build command (`cmake --build . --target `). If not specified, no target will ## be passed. ## +## ### ADD_BIN_TO_PATH +## Adds the appropriate Release and Debug `bin\` directories to the path during the build such that executables can run against the in-tree DLLs. +## ## ## Notes: ## This command should be preceeded by a call to [`vcpkg_configure_cmake()`](vcpkg_configure_cmake.md). ## You can use the alias [`vcpkg_install_cmake()`](vcpkg_configure_cmake.md) function if your CMake script supports the @@ -27,7 +30,7 @@ ## * [poco](https://github.com/Microsoft/vcpkg/blob/master/ports/poco/portfile.cmake) ## * [opencv](https://github.com/Microsoft/vcpkg/blob/master/ports/opencv/portfile.cmake) function(vcpkg_build_cmake) - cmake_parse_arguments(_bc "DISABLE_PARALLEL" "TARGET;LOGFILE_ROOT" "" ${ARGN}) + cmake_parse_arguments(_bc "DISABLE_PARALLEL;ADD_BIN_TO_PATH" "TARGET;LOGFILE_ROOT" "" ${ARGN}) if(NOT _bc_LOGFILE_ROOT) set(_bc_LOGFILE_ROOT "build") @@ -65,20 +68,24 @@ function(vcpkg_build_cmake) if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL BUILDTYPE) if(BUILDTYPE STREQUAL "debug") set(SHORT_BUILDTYPE "dbg") + set(CONFIG "Debug") else() set(SHORT_BUILDTYPE "rel") + set(CONFIG "Release") endif() message(STATUS "Build ${TARGET_TRIPLET}-${SHORT_BUILDTYPE}") set(LOGPREFIX "${CURRENT_BUILDTREES_DIR}/${_bc_LOGFILE_ROOT}-${TARGET_TRIPLET}-${SHORT_BUILDTYPE}") set(LOGS) - if(BUILDTYPE STREQUAL "release") - set(CONFIG "Release") - else() - set(CONFIG "Debug") + if(_bc_ADD_BIN_TO_PATH) + set(_BACKUP_ENV_PATH "$ENV{PATH}") + if(BUILDTYPE STREQUAL "debug") + set(ENV{PATH} "${CURRENT_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/bin;$ENV{PATH}") + else() + set(ENV{PATH} "${CURRENT_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin;$ENV{PATH}") + endif() endif() - execute_process( COMMAND ${CMAKE_COMMAND} --build . --config ${CONFIG} ${TARGET_PARAM} -- ${BUILD_ARGS} ${PARALLEL_ARG} OUTPUT_FILE "${LOGPREFIX}-out.log" @@ -134,6 +141,9 @@ function(vcpkg_build_cmake) endif() endif() message(STATUS "Build ${TARGET_TRIPLET}-${SHORT_BUILDTYPE} done") + if(_bc_ADD_BIN_TO_PATH) + set(ENV{PATH} "${_BACKUP_ENV_PATH}") + endif() endif() endforeach() endfunction() -- cgit v1.2.3