diff --git a/CMakeLists.txt b/CMakeLists.txt index 92088c6d..c5f0c4b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,64 +1,64 @@ cmake_minimum_required(VERSION 3.0 FATAL_ERROR) find_package(ECM 1.8.0 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) include(SetKDbCMakePolicies NO_POLICY_SCOPE) project(KDb VERSION 3.1.90) # Update this include(KDbAddTests) include(KDbAddExamples) kdb_add_tests(OFF) kdb_add_examples(OFF) # ECM include(ECMGeneratePriFile) include(ECMInstallIcons) include(ECMOptionalAddSubdirectory) include(ECMPoQmTools) include(ECMSetupVersion) include(KDEInstallDirs) include(KDECMakeSettings NO_POLICY_SCOPE) include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) # Own include(KDbCreateSharedDataClasses) include(KDbGenerateHeaders) include(KDbMacros) include(KDbAddQCH) simple_option(BUILD_QCH "Build API documentation in QCH format" OFF) # Dependencies set(REQUIRED_QT_VERSION 5.4.0) set(REQUIRED_KF5_VERSION 5.16.0) # Required components to build this framework # TODO move Widgets-dependent part to a libKDbWidgets find_package(Qt5 ${REQUIRED_QT_VERSION} NO_MODULE REQUIRED Core Widgets Xml) find_package(KF5 ${REQUIRED_KF5_VERSION} REQUIRED CoreAddons) -find_package(ICU) -set_package_properties(ICU PROPERTIES TYPE REQUIRED +find_package(ICU REQUIRED i18n uc) +set_package_properties(ICU PROPERTIES PURPOSE "Required by KDb for unicode-aware string comparisons") get_git_revision_and_branch() add_unfinished_features_option() add_pc_file(${PROJECT_NAME}) add_subdirectory(src) add_subdirectory(tools) if(BUILD_TESTING) add_subdirectory(autotests) add_subdirectory(tests) endif() add_custom_target(cppclean COMMAND ${CMAKE_SOURCE_DIR}/tools/cppclean-kdb.sh ${CMAKE_BINARY_DIR} COMMENT "Running CPPCLEAN" ) if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/po") ecm_install_po_files_as_qm(po) endif() feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/cmake/modules/FindICU.cmake b/cmake/modules/FindICU.cmake index 7c85e353..c78be741 100644 --- a/cmake/modules/FindICU.cmake +++ b/cmake/modules/FindICU.cmake @@ -1,92 +1,394 @@ -# Finds the International Components for Unicode (ICU) Library -# -# ICU_FOUND - True if ICU found. -# ICU_I18N_FOUND - True if ICU's internationalization library found. -# ICU_INCLUDE_DIRS - Directory to include to get ICU headers -# Note: always include ICU headers as, e.g., -# unicode/utypes.h -# ICU_LIBRARIES - Libraries to link against for the common ICU -# ICU_I18N_LIBRARIES - Libraries to link against for ICU internationaliation -# (note: in addition to ICU_LIBRARIES) - -include(FeatureSummary) -set_package_properties(ICU PROPERTIES DESCRIPTION "International Components for Unicode Library (ICU)" - URL "http://icu-project.org") - -# Look for the header file. -find_path( - ICU_INCLUDE_DIR - NAMES unicode/utypes.h - DOC "Include directory for the ICU library") -mark_as_advanced(ICU_INCLUDE_DIR) - -if(CYGWIN) - set(LIB_NAMES icuuc cygicuuc cygicuuc32) -else() - set(LIB_NAMES icuuc) -endif() +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindICU +# ------- +# +# Find the International Components for Unicode (ICU) libraries and +# programs. +# +# This module supports multiple components. +# Components can include any of: ``data``, ``i18n``, ``io``, ``le``, +# ``lx``, ``test``, ``tu`` and ``uc``. +# +# Note that on Windows ``data`` is named ``dt`` and ``i18n`` is named +# ``in``; any of the names may be used, and the appropriate +# platform-specific library name will be automatically selected. +# +# This module reports information about the ICU installation in +# several variables. General variables:: +# +# ICU_VERSION - ICU release version +# ICU_FOUND - true if the main programs and libraries were found +# ICU_LIBRARIES - component libraries to be linked +# ICU_INCLUDE_DIRS - the directories containing the ICU headers +# +# Imported targets:: +# +# ICU:: +# +# Where ```` is the name of an ICU component, for example +# ``ICU::i18n``. +# +# ICU programs are reported in:: +# +# ICU_GENCNVAL_EXECUTABLE - path to gencnval executable +# ICU_ICUINFO_EXECUTABLE - path to icuinfo executable +# ICU_GENBRK_EXECUTABLE - path to genbrk executable +# ICU_ICU-CONFIG_EXECUTABLE - path to icu-config executable +# ICU_GENRB_EXECUTABLE - path to genrb executable +# ICU_GENDICT_EXECUTABLE - path to gendict executable +# ICU_DERB_EXECUTABLE - path to derb executable +# ICU_PKGDATA_EXECUTABLE - path to pkgdata executable +# ICU_UCONV_EXECUTABLE - path to uconv executable +# ICU_GENCFU_EXECUTABLE - path to gencfu executable +# ICU_MAKECONV_EXECUTABLE - path to makeconv executable +# ICU_GENNORM2_EXECUTABLE - path to gennorm2 executable +# ICU_GENCCODE_EXECUTABLE - path to genccode executable +# ICU_GENSPREP_EXECUTABLE - path to gensprep executable +# ICU_ICUPKG_EXECUTABLE - path to icupkg executable +# ICU_GENCMN_EXECUTABLE - path to gencmn executable +# +# ICU component libraries are reported in:: +# +# ICU__FOUND - ON if component was found +# ICU__LIBRARIES - libraries for component +# +# ICU datafiles are reported in:: +# +# ICU_MAKEFILE_INC - Makefile.inc +# ICU_PKGDATA_INC - pkgdata.inc +# +# Note that ```` is the uppercased name of the component. +# +# This module reads hints about search results from:: +# +# ICU_ROOT - the root of the ICU installation +# +# The environment variable ``ICU_ROOT`` may also be used; the +# ICU_ROOT variable takes precedence. +# +# The following cache variables may also be set:: +# +# ICU_

_EXECUTABLE - the path to executable

+# ICU_INCLUDE_DIR - the directory containing the ICU headers +# ICU__LIBRARY - the library for component +# +# .. note:: +# +# In most cases none of the above variables will require setting, +# unless multiple ICU versions are available and a specific version +# is required. +# +# Other variables one may set to control this module are:: +# +# ICU_DEBUG - Set to ON to enable debug output from FindICU. + +# Written by Roger Leigh + +set(icu_programs + gencnval + icuinfo + genbrk + icu-config + genrb + gendict + derb + pkgdata + uconv + gencfu + makeconv + gennorm2 + genccode + gensprep + icupkg + gencmn) -# Look for the library. -find_library( - ICU_LIBRARY - NAMES ${LIB_NAMES} - DOC "Libraries to link against for the common parts of ICU") -mark_as_advanced(ICU_LIBRARY) - -# Copy the results to the output variables. -if(ICU_INCLUDE_DIR AND ICU_LIBRARY) - set(ICU_FOUND 1) - set(ICU_LIBRARIES ${ICU_LIBRARY}) - set(ICU_INCLUDE_DIRS ${ICU_INCLUDE_DIR}) - - set(ICU_VERSION 0) - set(ICU_MAJOR_VERSION 0) - set(ICU_MINOR_VERSION 0) - if (EXISTS "${ICU_INCLUDE_DIR}/unicode/uvernum.h") - file(READ "${ICU_INCLUDE_DIR}/unicode/uvernum.h" _ICU_VERSION_CONTENTS) +set(icu_data + Makefile.inc + pkgdata.inc) + +# The ICU checks are contained in a function due to the large number +# of temporary variables needed. +function(_ICU_FIND) + # Set up search paths, taking compiler into account. Search ICU_ROOT, + # with ICU_ROOT in the environment as a fallback if unset. + if(ICU_ROOT) + list(APPEND icu_roots "${ICU_ROOT}") else() - file(READ "${ICU_INCLUDE_DIR}/unicode/uversion.h" _ICU_VERSION_CONTENTS) + if(NOT "$ENV{ICU_ROOT}" STREQUAL "") + file(TO_CMAKE_PATH "$ENV{ICU_ROOT}" NATIVE_PATH) + list(APPEND icu_roots "${NATIVE_PATH}") + set(ICU_ROOT "${NATIVE_PATH}" + CACHE PATH "Location of the ICU installation" FORCE) + endif() endif() - string(REGEX REPLACE ".*#define U_ICU_VERSION_MAJOR_NUM ([0-9]+).*" "\\1" ICU_MAJOR_VERSION "${_ICU_VERSION_CONTENTS}") - string(REGEX REPLACE ".*#define U_ICU_VERSION_MINOR_NUM ([0-9]+).*" "\\1" ICU_MINOR_VERSION "${_ICU_VERSION_CONTENTS}") - - set(ICU_VERSION "${ICU_MAJOR_VERSION}.${ICU_MINOR_VERSION}") - - # Look for the ICU internationalization libraries - find_library( - ICU_I18N_LIBRARY - NAMES icuin icui18n cygicuin cygicuin32 - DOC "Libraries to link against for ICU internationalization") - mark_as_advanced(ICU_I18N_LIBRARY) - if (ICU_I18N_LIBRARY) - set(ICU_I18N_FOUND 1) - set(ICU_I18N_LIBRARIES ${ICU_I18N_LIBRARY}) - else () - set(ICU_I18N_FOUND 0) - set(ICU_I18N_LIBRARIES) - endif () -else() - set(ICU_FOUND 0) - set(ICU_I18N_FOUND 0) - set(ICU_LIBRARIES) - set(ICU_I18N_LIBRARIES) - set(ICU_INCLUDE_DIRS) - set(ICU_VERSION) - set(ICU_MAJOR_VERSION) - set(ICU_MINOR_VERSION) -endif() + # Find include directory + list(APPEND icu_include_suffixes "include") + find_path(ICU_INCLUDE_DIR + NAMES "unicode/utypes.h" + HINTS ${icu_roots} + PATH_SUFFIXES ${icu_include_suffixes} + DOC "ICU include directory") + set(ICU_INCLUDE_DIR "${ICU_INCLUDE_DIR}" PARENT_SCOPE) -if(ICU_FOUND) - if( NOT ICU_FIND_QUIETLY ) - message( STATUS "Found ICU header files in ${ICU_INCLUDE_DIRS}") - message( STATUS "Found ICU libraries: ${ICU_LIBRARIES}") + # Get version + if(ICU_INCLUDE_DIR AND EXISTS "${ICU_INCLUDE_DIR}/unicode/uvernum.h") + file(STRINGS "${ICU_INCLUDE_DIR}/unicode/uvernum.h" icu_header_str + REGEX "^#define[\t ]+U_ICU_VERSION[\t ]+\".*\".*") + + string(REGEX REPLACE "^#define[\t ]+U_ICU_VERSION[\t ]+\"([^ \\n]*)\".*" + "\\1" icu_version_string "${icu_header_str}") + set(ICU_VERSION "${icu_version_string}") + set(ICU_VERSION "${icu_version_string}" PARENT_SCOPE) + unset(icu_header_str) + unset(icu_version_string) endif() -else() - if(ICU_FIND_REQUIRED) - message( FATAL_ERROR "Could not find ICU" ) - else() - message( STATUS "Optional package ICU was not found" ) + + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + # 64-bit binary directory + set(_bin64 "bin64") + # 64-bit library directory + set(_lib64 "lib64") + endif() + + + # Find all ICU programs + list(APPEND icu_binary_suffixes "${_bin64}" "bin") + foreach(program ${icu_programs}) + string(TOUPPER "${program}" program_upcase) + set(cache_var "ICU_${program_upcase}_EXECUTABLE") + set(program_var "ICU_${program_upcase}_EXECUTABLE") + find_program("${cache_var}" "${program}" + HINTS ${icu_roots} + PATH_SUFFIXES ${icu_binary_suffixes} + DOC "ICU ${program} executable") + mark_as_advanced(cache_var) + set("${program_var}" "${${cache_var}}" PARENT_SCOPE) + endforeach() + + # Find all ICU libraries + list(APPEND icu_library_suffixes "${_lib64}" "lib") + set(ICU_REQUIRED_LIBS_FOUND ON) + foreach(component ${ICU_FIND_COMPONENTS}) + string(TOUPPER "${component}" component_upcase) + set(component_cache "ICU_${component_upcase}_LIBRARY") + set(component_cache_release "${component_cache}_RELEASE") + set(component_cache_debug "${component_cache}_DEBUG") + set(component_found "${component_upcase}_FOUND") + set(component_libnames "icu${component}") + set(component_debug_libnames "icu${component}d") + + # Special case deliberate library naming mismatches between Unix + # and Windows builds + unset(component_libnames) + unset(component_debug_libnames) + list(APPEND component_libnames "icu${component}") + list(APPEND component_debug_libnames "icu${component}d") + if(component STREQUAL "data") + list(APPEND component_libnames "icudt") + # Note there is no debug variant at present + list(APPEND component_debug_libnames "icudtd") + endif() + if(component STREQUAL "dt") + list(APPEND component_libnames "icudata") + # Note there is no debug variant at present + list(APPEND component_debug_libnames "icudatad") + endif() + if(component STREQUAL "i18n") + list(APPEND component_libnames "icuin") + list(APPEND component_debug_libnames "icuind") + endif() + if(component STREQUAL "in") + list(APPEND component_libnames "icui18n") + list(APPEND component_debug_libnames "icui18nd") + endif() + + find_library("${component_cache_release}" ${component_libnames} + HINTS ${icu_roots} + PATH_SUFFIXES ${icu_library_suffixes} + DOC "ICU ${component} library (release)") + find_library("${component_cache_debug}" ${component_debug_libnames} + HINTS ${icu_roots} + PATH_SUFFIXES ${icu_library_suffixes} + DOC "ICU ${component} library (debug)") + include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake) + select_library_configurations(ICU_${component_upcase}) + mark_as_advanced("${component_cache_release}" "${component_cache_debug}") + if(${component_cache}) + set("${component_found}" ON) + list(APPEND ICU_LIBRARY "${${component_cache}}") + endif() + mark_as_advanced("${component_found}") + set("${component_cache}" "${${component_cache}}" PARENT_SCOPE) + set("${component_found}" "${${component_found}}" PARENT_SCOPE) + if(${component_found}) + if (ICU_FIND_REQUIRED_${component}) + list(APPEND ICU_LIBS_FOUND "${component} (required)") + else() + list(APPEND ICU_LIBS_FOUND "${component} (optional)") + endif() + else() + if (ICU_FIND_REQUIRED_${component}) + set(ICU_REQUIRED_LIBS_FOUND OFF) + list(APPEND ICU_LIBS_NOTFOUND "${component} (required)") + else() + list(APPEND ICU_LIBS_NOTFOUND "${component} (optional)") + endif() + endif() + endforeach() + set(_ICU_REQUIRED_LIBS_FOUND "${ICU_REQUIRED_LIBS_FOUND}" PARENT_SCOPE) + set(ICU_LIBRARY "${ICU_LIBRARY}" PARENT_SCOPE) + + # Find all ICU data files + if(CMAKE_LIBRARY_ARCHITECTURE) + list(APPEND icu_data_suffixes + "${_lib64}/${CMAKE_LIBRARY_ARCHITECTURE}/icu/${ICU_VERSION}" + "lib/${CMAKE_LIBRARY_ARCHITECTURE}/icu/${ICU_VERSION}" + "${_lib64}/${CMAKE_LIBRARY_ARCHITECTURE}/icu" + "lib/${CMAKE_LIBRARY_ARCHITECTURE}/icu") endif() + list(APPEND icu_data_suffixes + "${_lib64}/icu/${ICU_VERSION}" + "lib/icu/${ICU_VERSION}" + "${_lib64}/icu" + "lib/icu") + foreach(data ${icu_data}) + string(TOUPPER "${data}" data_upcase) + string(REPLACE "." "_" data_upcase "${data_upcase}") + set(cache_var "ICU_${data_upcase}") + set(data_var "ICU_${data_upcase}") + find_file("${cache_var}" "${data}" + HINTS ${icu_roots} + PATH_SUFFIXES ${icu_data_suffixes} + DOC "ICU ${data} data file") + mark_as_advanced(cache_var) + set("${data_var}" "${${cache_var}}" PARENT_SCOPE) + endforeach() + + if(NOT ICU_FIND_QUIETLY) + if(ICU_LIBS_FOUND) + message(STATUS "Found the following ICU libraries:") + foreach(found ${ICU_LIBS_FOUND}) + message(STATUS " ${found}") + endforeach() + endif() + if(ICU_LIBS_NOTFOUND) + message(STATUS "The following ICU libraries were not found:") + foreach(notfound ${ICU_LIBS_NOTFOUND}) + message(STATUS " ${notfound}") + endforeach() + endif() + endif() + + if(ICU_DEBUG) + message(STATUS "--------FindICU.cmake search debug--------") + message(STATUS "ICU binary path search order: ${icu_roots}") + message(STATUS "ICU include path search order: ${icu_roots}") + message(STATUS "ICU library path search order: ${icu_roots}") + message(STATUS "----------------") + endif() +endfunction() + +_ICU_FIND() + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(ICU + FOUND_VAR ICU_FOUND + REQUIRED_VARS ICU_INCLUDE_DIR + ICU_LIBRARY + _ICU_REQUIRED_LIBS_FOUND + VERSION_VAR ICU_VERSION + FAIL_MESSAGE "Failed to find all ICU components") + +unset(_ICU_REQUIRED_LIBS_FOUND) + +if(ICU_FOUND) + set(ICU_INCLUDE_DIRS "${ICU_INCLUDE_DIR}") + set(ICU_LIBRARIES "${ICU_LIBRARY}") + foreach(_ICU_component ${ICU_FIND_COMPONENTS}) + string(TOUPPER "${_ICU_component}" _ICU_component_upcase) + set(_ICU_component_cache "ICU_${_ICU_component_upcase}_LIBRARY") + set(_ICU_component_cache_release "ICU_${_ICU_component_upcase}_LIBRARY_RELEASE") + set(_ICU_component_cache_debug "ICU_${_ICU_component_upcase}_LIBRARY_DEBUG") + set(_ICU_component_lib "ICU_${_ICU_component_upcase}_LIBRARIES") + set(_ICU_component_found "${_ICU_component_upcase}_FOUND") + set(_ICU_imported_target "ICU::${_ICU_component}") + if(${_ICU_component_found}) + set("${_ICU_component_lib}" "${${_ICU_component_cache}}") + if(NOT TARGET ${_ICU_imported_target}) + add_library(${_ICU_imported_target} UNKNOWN IMPORTED) + if(ICU_INCLUDE_DIR) + set_target_properties(${_ICU_imported_target} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${ICU_INCLUDE_DIR}") + endif() + if(EXISTS "${${_ICU_component_cache}}") + set_target_properties(${_ICU_imported_target} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${${_ICU_component_cache}}") + endif() + if(EXISTS "${${_ICU_component_cache_release}}") + set_property(TARGET ${_ICU_imported_target} APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(${_ICU_imported_target} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX" + IMPORTED_LOCATION_RELEASE "${${_ICU_component_cache_release}}") + endif() + if(EXISTS "${${_ICU_component_cache_debug}}") + set_property(TARGET ${_ICU_imported_target} APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties(${_ICU_imported_target} PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX" + IMPORTED_LOCATION_DEBUG "${${_ICU_component_cache_debug}}") + endif() + endif() + endif() + unset(_ICU_component_upcase) + unset(_ICU_component_cache) + unset(_ICU_component_lib) + unset(_ICU_component_found) + unset(_ICU_imported_target) + endforeach() +endif() + +if(ICU_DEBUG) + message(STATUS "--------FindICU.cmake results debug--------") + message(STATUS "ICU found: ${ICU_FOUND}") + message(STATUS "ICU_VERSION number: ${ICU_VERSION}") + message(STATUS "ICU_ROOT directory: ${ICU_ROOT}") + message(STATUS "ICU_INCLUDE_DIR directory: ${ICU_INCLUDE_DIR}") + message(STATUS "ICU_LIBRARIES: ${ICU_LIBRARIES}") + + foreach(program IN LISTS icu_programs) + string(TOUPPER "${program}" program_upcase) + set(program_lib "ICU_${program_upcase}_EXECUTABLE") + message(STATUS "${program} program: ${${program_lib}}") + unset(program_upcase) + unset(program_lib) + endforeach() + + foreach(data IN LISTS icu_data) + string(TOUPPER "${data}" data_upcase) + string(REPLACE "." "_" data_upcase "${data_upcase}") + set(data_lib "ICU_${data_upcase}") + message(STATUS "${data} data: ${${data_lib}}") + unset(data_upcase) + unset(data_lib) + endforeach() + + foreach(component IN LISTS ICU_FIND_COMPONENTS) + string(TOUPPER "${component}" component_upcase) + set(component_lib "ICU_${component_upcase}_LIBRARIES") + set(component_found "${component_upcase}_FOUND") + message(STATUS "${component} library found: ${${component_found}}") + message(STATUS "${component} library: ${${component_lib}}") + unset(component_upcase) + unset(component_lib) + unset(component_found) + endforeach() + message(STATUS "----------------") endif() +unset(icu_programs) diff --git a/cmake/modules/SelectLibraryConfigurations.cmake b/cmake/modules/SelectLibraryConfigurations.cmake new file mode 100644 index 00000000..dce6f992 --- /dev/null +++ b/cmake/modules/SelectLibraryConfigurations.cmake @@ -0,0 +1,70 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# SelectLibraryConfigurations +# --------------------------- +# +# +# +# select_library_configurations( basename ) +# +# This macro takes a library base name as an argument, and will choose +# good values for basename_LIBRARY, basename_LIBRARIES, +# basename_LIBRARY_DEBUG, and basename_LIBRARY_RELEASE depending on what +# has been found and set. If only basename_LIBRARY_RELEASE is defined, +# basename_LIBRARY will be set to the release value, and +# basename_LIBRARY_DEBUG will be set to basename_LIBRARY_DEBUG-NOTFOUND. +# If only basename_LIBRARY_DEBUG is defined, then basename_LIBRARY will +# take the debug value, and basename_LIBRARY_RELEASE will be set to +# basename_LIBRARY_RELEASE-NOTFOUND. +# +# If the generator supports configuration types, then basename_LIBRARY +# and basename_LIBRARIES will be set with debug and optimized flags +# specifying the library to be used for the given configuration. If no +# build type has been set or the generator in use does not support +# configuration types, then basename_LIBRARY and basename_LIBRARIES will +# take only the release value, or the debug value if the release one is +# not set. + +# This macro was adapted from the FindQt4 CMake module and is maintained by Will +# Dicharry . + +macro( select_library_configurations basename ) + if(NOT ${basename}_LIBRARY_RELEASE) + set(${basename}_LIBRARY_RELEASE "${basename}_LIBRARY_RELEASE-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + if(NOT ${basename}_LIBRARY_DEBUG) + set(${basename}_LIBRARY_DEBUG "${basename}_LIBRARY_DEBUG-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + + if( ${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE AND + NOT ${basename}_LIBRARY_DEBUG STREQUAL ${basename}_LIBRARY_RELEASE AND + ( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) ) + # if the generator supports configuration types or CMAKE_BUILD_TYPE + # is set, then set optimized and debug options. + set( ${basename}_LIBRARY "" ) + foreach( _libname IN LISTS ${basename}_LIBRARY_RELEASE ) + list( APPEND ${basename}_LIBRARY optimized "${_libname}" ) + endforeach() + foreach( _libname IN LISTS ${basename}_LIBRARY_DEBUG ) + list( APPEND ${basename}_LIBRARY debug "${_libname}" ) + endforeach() + elseif( ${basename}_LIBRARY_RELEASE ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_RELEASE} ) + elseif( ${basename}_LIBRARY_DEBUG ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_DEBUG} ) + else() + set( ${basename}_LIBRARY "${basename}_LIBRARY-NOTFOUND") + endif() + + set( ${basename}_LIBRARIES "${${basename}_LIBRARY}" ) + + if( ${basename}_LIBRARY ) + set( ${basename}_FOUND TRUE ) + endif() + + mark_as_advanced( ${basename}_LIBRARY_RELEASE + ${basename}_LIBRARY_DEBUG + ) +endmacro() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6ff7d4e6..59e890ab 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,467 +1,466 @@ # Private options (visible only within KDb) simple_option(KDB_EXPRESSION_DEBUG "Debugging of Expression classes" OFF) simple_option(KDB_DRIVERMANAGER_DEBUG "Debugging of the Driver Manager class" OFF) simple_option(KDB_TRANSACTIONS_DEBUG "Debugging of the Transaction class" OFF) simple_option(KDB_TABLESCHEMACHANGELISTENER_DEBUG "Debugging of the KDbTableSchemaChangeListener class" OFF) # Public options (affecting public behavior or contents of KDb) simple_option(KDB_DEBUG_GUI "GUI for debugging" OFF) # NOTE: always add public options to KDbConfig.cmake.in as well include(CheckIncludeFile) check_include_file(unistd.h HAVE_UNISTD_H) #add_definitions( # TODO -DKDE_DEFAULT_DEBUG_AREA=44000 #) ########### generate parser/lexer files ############### # as described at http://public.kitware.com/pipermail/cmake/2002-September/003028.html # Create target for the parser add_custom_target(parser echo "Creating parser/lexer files") set(PARSER_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/parser) # Create custom command for flex/lex (note the outputs) # TODO(GEN) uncomment GENERATED if we ever use this patch: https://phabricator.kde.org/D357 "No more generated parser/scanner files in the source dir" add_custom_command( TARGET parser COMMAND ${PARSER_SOURCE_DIR}/generate_parser_code.sh DEPENDS ${PARSER_SOURCE_DIR}/KDbSqlParser.y ${PARSER_SOURCE_DIR}/KDbSqlScanner.l ${PARSER_SOURCE_DIR}/generate_parser_code.sh OUTPUT #TODO(GEN) ${PARSER_SOURCE_DIR}/generated/sqlparser.h #TODO(GEN) ${PARSER_SOURCE_DIR}/generated/sqlparser.cpp #TODO(GEN) ${PARSER_SOURCE_DIR}/generated/sqlscanner.cpp #TODO(GEN) ${PARSER_SOURCE_DIR}/generated/KDbToken.h #TODO(GEN) ${PARSER_SOURCE_DIR}/generated/KDbToken.cpp ) string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER) if("${CMAKE_BUILD_TYPE_LOWER}" MATCHES "debug") add_definitions(-DYYDEBUG=1) # needed where sqlparser.h is used endif() if(NOT HAVE_UNISTD_H) set(EXTRA_SCANNER_COMPILE_FLAGS "-DYY_NO_UNISTD_H=1") endif() if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG) set(EXTRA_SCANNER_COMPILE_FLAGS "${EXTRA_SCANNER_COMPILE_FLAGS} -Wno-sign-compare -Wno-unused-function -Wno-deprecated-register") elseif(MSVC) set(EXTRA_SCANNER_COMPILE_FLAGS "${EXTRA_SCANNER_COMPILE_FLAGS} /wd4018") # disable warning C4018: '<' : signed/unsigned mismatch endif() # Mark files as generated, set compile flags set_source_files_properties(${PARSER_SOURCE_DIR}/generated/sqlparser.cpp PROPERTIES #TODO(GEN) GENERATED TRUE SKIP_AUTOMOC ON # YYERROR_VERBOSE=1 needed to get a token table for tokenName() even for release builds COMPILE_FLAGS "-DYYERROR_VERBOSE=1 ${EXTRA_PARSER_COMPILE_FLAGS} " ) # TODO(GEN) set_source_files_properties(${PARSER_SOURCE_DIR}/generated/sqlparser.h PROPERTIES GENERATED TRUE) # TODO(GEN) set_source_files_properties(${PARSER_SOURCE_DIR}/generated/KDbToken.h PROPERTIES GENERATED TRUE) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/KDbConnectionData_sdc.cpp PROPERTIES GENERATED TRUE SKIP_AUTOMOC ON ) set_source_files_properties( ${PARSER_SOURCE_DIR}/generated/sqlscanner.cpp PROPERTIES #TODO(GEN) GENERATED TRUE SKIP_AUTOMOC ON COMPILE_FLAGS "${EXTRA_SCANNER_COMPILE_FLAGS} " ) set(kdb_LIB_SRCS parser/generated/sqlscanner.cpp parser/generated/sqlparser.cpp parser/generated/KDbToken.cpp parser/KDbParser.cpp parser/KDbParser_p.cpp parser/KDbSqlParser.y parser/KDbSqlScanner.l parser/generate_parser_code.sh parser/extract_tokens.sh parser/TODO tools/KDbJsonTrader_p.cpp # mostly copied from KReport's KReportJsonTrader_p.cpp tools/KDbValidator.cpp tools/KDbFieldValidator.cpp tools/KDbLongLongValidator.cpp tools/KDbObjectNameValidator.cpp tools/KDbIdentifierValidator.cpp tools/KDbUtils.cpp #TODO tools/debuggui.cpp #TODO tools/KDbSimpleCommandLineApp.cpp tools/transliteration/transliteration_table.cpp tools/transliteration/generate_transliteration_table.sh tools/transliteration/transliteration_table.readme KDbEscapedString.cpp KDbResult.cpp KDbQueryAsterisk.cpp KDbConnectionData.cpp KDbVersionInfo.cpp ${CMAKE_CURRENT_BINARY_DIR}/KDbConnectionData_sdc.cpp KDbField.cpp KDbQuerySchemaParameter.cpp expression/KDbExpression.cpp expression/KDbNArgExpression.cpp expression/KDbUnaryExpression.cpp expression/KDbBinaryExpression.cpp expression/KDbConstExpression.cpp expression/KDbQueryParameterExpression.cpp expression/KDbVariableExpression.cpp expression/KDbFunctionExpression.cpp KDbFieldList.cpp KDbTableSchema.cpp KDbTableSchemaChangeListener.cpp KDbIndexSchema.cpp KDbOrderByColumn.cpp KDbQuerySchema.cpp KDbQuerySchema_p.cpp KDbQueryColumnInfo.cpp KDbTableOrQuerySchema.cpp KDbDriverManager.cpp KDbDriver.cpp KDbDriver_p.cpp KDbDriverMetaData.cpp KDbConnection.cpp KDbConnectionProxy.cpp generated/sqlkeywords.cpp KDbObject.cpp KDb.cpp KDbRecordData.cpp KDbCursor.cpp KDbTransaction.cpp KDbGlobal.cpp KDbRelationship.cpp KDbRecordEditBuffer.cpp KDbMessageHandler.cpp KDbPreparedStatement.cpp KDbProperties.cpp KDbAdmin.cpp KDbLookupFieldSchema.cpp KDbAlter.cpp KDbNativeStatementBuilder.cpp kdb_debug.cpp views/KDbTableViewData.cpp views/KDbTableViewColumn.cpp views/chartable.txt sql/KDbSqlField.cpp sql/KDbSqlRecord.cpp sql/KDbSqlResult.cpp # private: tools/KDbUtils_p.h # non-source: Mainpage.dox Messages.sh ) ecm_create_qm_loader(kdb_LIB_SRCS kdb_qt) add_library(KDb SHARED ${kdb_LIB_SRCS}) set_coinstallable_lib_version(KDb) kdb_create_shared_data_classes( kdb_GENERATED_SHARED_DATA_CLASS_HEADERS # output variable with list of headers NO_PREFIX # subdirectory in which the headers should be generated KDbConnectionData.shared.h KDbObject.shared.h KDbQuerySchemaParameter.shared.h KDbResult.shared.h KDbSelectStatementOptions.shared.h KDbVersionInfo.shared.h ) kdb_remove_extensions( kdb_GENERATED_SHARED_DATA_CLASS_BASENAMES ${kdb_GENERATED_SHARED_DATA_CLASS_HEADERS} ) #message(STATUS "kdb_GENERATED_SHARED_DATA_CLASS_HEADERS: ${kdb_GENERATED_SHARED_DATA_CLASS_HEADERS}") #add_dependencies(KDb _shared_classes) # generate shared classes before they can be used in KDb generate_export_header(KDb) set(kdb_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/expression ${CMAKE_CURRENT_SOURCE_DIR}/interfaces ${CMAKE_CURRENT_SOURCE_DIR}/parser ${CMAKE_CURRENT_SOURCE_DIR}/parser/generated ${CMAKE_CURRENT_SOURCE_DIR}/sql ${CMAKE_CURRENT_SOURCE_DIR}/tools ${CMAKE_CURRENT_SOURCE_DIR}/views ) target_include_directories(KDb PUBLIC "$" INTERFACE "$" - PRIVATE ${ICU_INCLUDE_DIRS} ) target_link_libraries(KDb PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets KF5::CoreAddons PRIVATE Qt5::Xml - ${ICU_I18N_LIBRARY} + ICU::i18n ) if(BUILD_TEST_COVERAGE) target_link_libraries(KDb PRIVATE gcov ) endif() # Create a Config.cmake and a ConfigVersion.cmake file and install them set(CMAKECONFIG_INSTALL_DIR "${CMAKECONFIG_INSTALL_PREFIX}/${KDB_BASE_NAME}") ecm_setup_version(${PROJECT_VERSION} VARIABLE_PREFIX KDB SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/kdb_version.h" PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KDbConfigVersion.cmake" ) install(TARGETS KDb EXPORT KDbTargets ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/KDbConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/KDbConfig.cmake" INSTALL_DESTINATION "${CMAKECONFIG_INSTALL_DIR}" ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/KDbConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/KDbConfigVersion.cmake" DESTINATION "${CMAKECONFIG_INSTALL_DIR}" COMPONENT Devel) install(EXPORT KDbTargets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE KDbTargets.cmake) ecm_generate_pri_file( BASE_NAME ${KDB_BASE_NAME} LIB_NAME ${KDB_BASE_NAME} DEPS "widgets xml" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDB_INCLUDE_INSTALL_DIR} ) install(FILES ${PRI_FILENAME} DESTINATION ${ECM_MKSPECS_INSTALL_DIR}) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/kdb_version.h" DESTINATION "${KDB_INCLUDE_INSTALL_DIR}" COMPONENT Devel) ecm_generate_headers(kdb_FORWARDING_HEADERS REQUIRED_HEADERS kdb_HEADERS ORIGINAL CAMELCASE HEADER_NAMES KDb KDbAdmin KDbAlter KDbQueryAsterisk KDbConnection KDbConnectionOptions KDbConnectionProxy KDbCursor KDbDriver KDbDriverBehavior KDbDriverManager KDbDriverMetaData KDbError KDbEscapedString KDbField KDbFieldList KDbGlobal KDbIndexSchema KDbLookupFieldSchema KDbMessageHandler KDbNativeStatementBuilder KDbPreparedStatement KDbProperties KDbQueryColumnInfo KDbOrderByColumn KDbQuerySchema KDbRecordData KDbRecordEditBuffer KDbRelationship KDbTableOrQuerySchema KDbTableSchema KDbTableSchemaChangeListener KDbTransaction KDbTransactionData KDbTransactionGuard ) ecm_generate_headers(kdb_FORWARDING_HEADERS REQUIRED_HEADERS kdb_HEADERS ORIGINAL CAMELCASE RELATIVE expression HEADER_NAMES KDbExpression KDbExpressionData ) ecm_generate_headers(kdb_FORWARDING_HEADERS REQUIRED_HEADERS kdb_HEADERS ORIGINAL CAMELCASE RELATIVE interfaces HEADER_NAMES KDbPreparedStatementInterface ) ecm_generate_headers(kdb_FORWARDING_HEADERS REQUIRED_HEADERS kdb_HEADERS ORIGINAL CAMELCASE RELATIVE parser HEADER_NAMES KDbParser ) ecm_generate_headers(kdb_FORWARDING_HEADERS REQUIRED_HEADERS kdb_HEADERS ORIGINAL CAMELCASE RELATIVE parser/generated HEADER_NAMES KDbToken ) ecm_generate_headers(kdb_FORWARDING_HEADERS REQUIRED_HEADERS kdb_HEADERS ORIGINAL CAMELCASE RELATIVE sql HEADER_NAMES KDbSqlField KDbSqlRecord KDbSqlResult KDbSqlString ) ecm_generate_headers(kdb_FORWARDING_HEADERS REQUIRED_HEADERS kdb_HEADERS ORIGINAL CAMELCASE RELATIVE views HEADER_NAMES KDbTableViewData KDbTableViewColumn ) ecm_generate_headers(kdb_FORWARDING_HEADERS REQUIRED_HEADERS kdb_HEADERS ORIGINAL CAMELCASE RELATIVE tools HEADER_NAMES KDbValidator KDbUtils KDbTristate #todo KDbSimpleCommandLineApp KDbLongLongValidator KDbIdentifierValidator KDbFieldValidator KDbObjectNameValidator ) #message(STATUS "%% ${kdb_GENERATED_SHARED_DATA_CLASS_BASENAMES}") ecm_generate_headers(kdb_FORWARDING_HEADERS_FROM_BUILDDIR REQUIRED_HEADERS kdb_HEADERS_FROM_BUILDDIR ORIGINAL CAMELCASE SOURCE_DIR ${PROJECT_BINARY_DIR}/src HEADER_NAMES ${kdb_GENERATED_SHARED_DATA_CLASS_BASENAMES} ) #message(STATUS "%%kdb_HEADERS_FROM_BUILDDIR ${kdb_HEADERS_FROM_BUILDDIR}") install( FILES ${kdb_HEADERS} ${kdb_HEADERS_FROM_BUILDDIR} DESTINATION ${KDB_INCLUDE_INSTALL_DIR} COMPONENT Devel ) install( FILES ${kdb_FORWARDING_HEADERS} ${kdb_FORWARDING_HEADERS_FROM_BUILDDIR} ${PROJECT_BINARY_DIR}/src/kdb_export.h ${PROJECT_BINARY_DIR}/src/config-kdb.h DESTINATION ${KDB_INCLUDE_INSTALL_DIR} COMPONENT Devel ) # KDb/Private includes # install( FILES # Connection_p.h # Driver_p.h # DESTINATION ${KDB_INCLUDE_INSTALL_DIR}/Private COMPONENT Devel # ) # KDb/Interfaces includes # install( FILES # Interfaces/KDbPreparedStatementInterface.h includes/KDb/Interfaces/KDbPreparedStatementInterface # DESTINATION ${KDB_INCLUDE_INSTALL_DIR}/Interfaces COMPONENT Devel # ) if(BUILD_QCH) kdb_add_qch( KDb_QCH NAME KDb BASE_NAME ${KDB_BASE_NAME} VERSION ${PROJECT_VERSION} NAMESPACE org.kde.${KDB_BASE_NAME} SOURCES Mainpage.dox ${kdb_HEADERS} ${kdb_HEADERS_FROM_BUILDDIR} LINK_QCHS Qt5Core_QCH Qt5Gui_QCH Qt5Widgets_QCH KF5CoreAddons_QCH BLANK_MACROS KDB_EXPORT KDB_DEPRECATED TAGFILE_INSTALL_DESTINATION ${KDB_QTQCH_FULL_INSTALL_DIR} QCH_INSTALL_DESTINATION ${KDB_QTQCH_FULL_INSTALL_DIR} ) set(kdb_qch_targets KDb_QCH) endif() kdb_install_qch_export( TARGETS ${kdb_qch_targets} FILE KDbQCHTargets.cmake ​ DESTINATION "${CMAKECONFIG_INSTALL_DIR}" ​ COMPONENT Devel ​) add_subdirectory(drivers) enable_testing() configure_file(config-kdb.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kdb.h) diff --git a/src/drivers/sqlite/icu/CMakeLists.txt b/src/drivers/sqlite/icu/CMakeLists.txt index bf5bc06d..378c1e2b 100644 --- a/src/drivers/sqlite/icu/CMakeLists.txt +++ b/src/drivers/sqlite/icu/CMakeLists.txt @@ -1,21 +1,20 @@ add_library(kdb_sqlite_icu MODULE icu.cpp sqliteicu.h README.txt) generate_export_header(kdb_sqlite_icu) -include_directories(${ICU_INCLUDE_DIRS}) - target_link_libraries(kdb_sqlite_icu - ${SQLITE_LIBRARIES} - ${ICU_LIBRARIES} - ${ICU_I18N_LIBRARIES} + PRIVATE + ${SQLITE_LIBRARIES} + ICU::i18n + ICU::uc ) set_target_properties(kdb_sqlite_icu PROPERTIES PREFIX "" # nonstandard path for sqlite3 extensions, they would work too if we placed them # in ${PROJECT_BINARY_DIR}/plugins/kdb/sqlite3 but we want to test the "extraSqliteExtensionPaths" # connection option in ConnectionTest::testCreateDb(): LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/plugins/${KDB_BASE_NAME_LOWER}/sqlite3" DEFINE_SYMBOL kdb_sqlite_icu_EXPORTS) install(TARGETS kdb_sqlite_icu DESTINATION ${KDB_PLUGIN_INSTALL_DIR}/sqlite3) # Use a subdir for clarity