diff options
-rw-r--r-- | .krazy | 2 | ||||
-rw-r--r-- | CMakeLists.txt | 24 | ||||
-rw-r--r-- | README.md (renamed from ReadMe.txt) | 4 | ||||
l--------- | ReadMe.md | 1 | ||||
-rw-r--r-- | ReleaseNotes.txt | 6 | ||||
-rw-r--r-- | cmake/modules/FindBerkeleyDB.cmake | 182 | ||||
-rw-r--r-- | config.h.cmake | 2 | ||||
-rw-r--r-- | src/libicalss/icalbdbset.c | 4 | ||||
-rw-r--r-- | src/test/regression-component.c | 2 |
9 files changed, 219 insertions, 8 deletions
@@ -32,7 +32,7 @@ SKIP /src/libical/caldate\.c SKIP /cmake/Kitware/ SKIP /cmake/modules/GObjectIntrospectionMacros\.cmake|/cmake/modules/FindGObjectIntrospection\.cmake SKIP /doc/Doxyfile\.cmake -SKIP /cmake/Toolchain-iOS.cmake|/cmake/Toolchain-QNX65.cmake|/cmake/Toolchain-QNX66.cmake|/cmake/Toolchain-android.cmake +SKIP /cmake/Toolchain-iOS.cmake|/cmake/Toolchain-QNX65.cmake|/cmake/Toolchain-QNX66.cmake|/cmake/Toolchain-android.cmake|/cmake/modules/FindBerkeleyDB.cmake #Skip zoneinfo SKIP /zoneinfo/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 5fba305e..5b087a86 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -214,6 +214,12 @@ if(DEFINED ICU_BASE) #to make --warn-uninitialized happy set(ICU_ROOT $ENV{ICU_BASE}) endif() endif() +if(NOT "$ENV{ICU_ROOT}") + #Use the homebrew version. MacOS provided ICU doesn't provide development files + if(APPLE) + set(ICU_ROOT "/usr/local/opt/icu4c") + endif() +endif() find_package(ICU COMPONENTS uc i18n) set_package_properties(ICU PROPERTIES TYPE RECOMMENDED @@ -250,19 +256,29 @@ if(ICU_FOUND) endif() # compile in Berkeley DB support -find_package(BDB) -set_package_properties(BDB PROPERTIES +if(NOT "$ENV{BerkeleyDB_ROOT_DIR}") + if(APPLE) + #Use the homebrew version. Xcode's version doesn't work for us. + set(BerkeleyDB_ROOT_DIR "/usr/local/opt/berkeley-db") + endif() +endif() +find_package(BerkeleyDB) +set_package_properties(BerkeleyDB PROPERTIES TYPE OPTIONAL PURPOSE "For Berkeley DB storage support" ) add_feature_info( "Berkeley DB storage support" - BDB_FOUND + BerkeleyDB_FOUND "build in support for Berkeley DB storage" ) -if(BDB_FOUND) +if(BerkeleyDB_FOUND) set(HAVE_BDB True) add_definitions(-DDB_DBM_HSEARCH=0) #set to 1 if hsearch support is needed + #for compatibility to our old FindBDB + set(BDB_FOUND True) + set(BDB_INCLUDE_DIR ${BerkeleyDB_INCLUDE_DIRS}) + set(BDB_LIBRARY ${BerkeleyDB_LIBRARIES}) endif() # MSVC specific definitions @@ -1,4 +1,6 @@ -# <a name="title"></a> Libical [![Travis Build Status](https://travis-ci.org/libical/libical.svg?branch=master)](https://travis-ci.org/libical/libical) [![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/libical/libical?branch=master?svg=true)](https://ci.appveyor.com/api/projects/status/github/libical/libical) [![Coverity Scan Build Status](https://scan.coverity.com/projects/2367/badge.svg)](https://scan.coverity.com/projects/2367) [![Packaging status](https://repology.org/badge/tiny-repos/libical.svg)](https://repology.org/metapackage/libical) +# Libical + +[![Appveyor status](https://ci.appveyor.com/api/projects/status/github/libical/libical?branch=master?svg=true)](https://ci.appveyor.com/api/projects/status/github/libical/libical) [![Packaging status](https://repology.org/badge/tiny-repos/libical.svg)](https://repology.org/metapackage/libical) ## Introduction diff --git a/ReadMe.md b/ReadMe.md deleted file mode 120000 index 3cefeef2..00000000 --- a/ReadMe.md +++ /dev/null @@ -1 +0,0 @@ -ReadMe.txt
\ No newline at end of file diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index ba1b9982..cd7b9be7 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -42,8 +42,14 @@ Version 3.1.0 (NOT RELEASED YET): Version 3.0.13 (UNRELEASED): ---------------------------- + * + +Version 3.0.13 (17 January 2022): +--------------------------------- * icalcomponent_get_dtend() return icaltime_null_time(), unless called on VEVENT, VAVAILABILITY or VFREEBUSY * icalcomponent_get_duration() for VTODO calculate with DUE instead of DTEND + * Replace CMake FindBDB with FindBerleyDB (https://github.com/sum01/FindBerkeleyDB) + * Fix finding ICU and BerkeleyDB on Mac (look for homebrew installs first) Version 3.0.12 (08 December 2021): ---------------------------------- diff --git a/cmake/modules/FindBerkeleyDB.cmake b/cmake/modules/FindBerkeleyDB.cmake new file mode 100644 index 00000000..401a36c4 --- /dev/null +++ b/cmake/modules/FindBerkeleyDB.cmake @@ -0,0 +1,182 @@ +# Author: sum01 <sum01@protonmail.com> +# Git: https://github.com/sum01/FindBerkeleyDB + +# +# This is free and unencumbered software released into the public domain. +# +# Anyone is free to copy, modify, publish, use, compile, sell, or distribute +# this software, either in source code form or as a compiled binary, for any +# purpose, commercial or non-commercial, and by any means. +# +# In jurisdictions that recognize copyright laws, the author or authors of this +# software dedicate any and all copyright interest in the software to the public +# domain. We make this dedication for the benefit of the public at large and to +# the detriment of our heirs and successors. We intend this dedication to be an +# overt act of relinquishment in perpetuity of all present and future rights to +# this software under copyright law. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# For more information, please refer to <http://unlicense.org> +# + +# NOTE: If Berkeley DB ever gets a Pkg-config ".pc" file, add pkg_check_modules() here + +# Checks if environment paths are empty, set them if they aren't +if(NOT "$ENV{BERKELEYDB_ROOT}" STREQUAL "") + set(_BERKELEYDB_PATHS "$ENV{BERKELEYDB_ROOT}") +elseif(NOT "$ENV{Berkeleydb_ROOT}" STREQUAL "") + set(_BERKELEYDB_PATHS "$ENV{Berkeleydb_ROOT}") +elseif(NOT "$ENV{BERKELEYDBROOT}" STREQUAL "") + set(_BERKELEYDB_PATHS "$ENV{BERKELEYDBROOT}") +else() + # Set just in case, as it's used regardless if it's empty or not + set(_BERKELEYDB_PATHS "") +endif() + +# Allow user to pass a path instead of guessing +if(BerkeleyDB_ROOT_DIR) + set(_BERKELEYDB_PATHS "${BerkeleyDB_ROOT_DIR}") +elseif(CMAKE_SYSTEM_NAME MATCHES ".*[wW]indows.*") + # MATCHES is used to work on any devies with windows in the name + # Shameless copy-paste from FindOpenSSL.cmake v3.8 + file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles) + list(APPEND _BERKELEYDB_PATHS "${_programfiles}") + + # There's actually production release and version numbers in the file path. + # For example, if they're on v6.2.32: C:/Program Files/Oracle/Berkeley DB 12cR1 6.2.32/ + # But this still works to find it, so I'm guessing it can accept partial path matches. + + foreach(_TARGET_BERKELEYDB_PATH "Oracle/Berkeley DB" "Berkeley DB") + list(APPEND _BERKELEYDB_PATHS + "${_programfiles}/${_TARGET_BERKELEYDB_PATH}" + "C:/Program Files (x86)/${_TARGET_BERKELEYDB_PATH}" + "C:/Program Files/${_TARGET_BERKELEYDB_PATH}" + "C:/${_TARGET_BERKELEYDB_PATH}" + ) + endforeach() +else() + # Paths for anything other than Windows + # Cellar/berkeley-db is for macOS from homebrew installation + list(APPEND _BERKELEYDB_PATHS + "/usr" + "/usr/local" + "/usr/local/Cellar/berkeley-db" + "/opt" + "/opt/local" + ) +endif() + +# Find includes path +find_path(BerkeleyDB_INCLUDE_DIRS + NAMES "db.h" + HINTS ${_BERKELEYDB_PATHS} + PATH_SUFFIXES "include" "includes" +) + +# Checks if the version file exists, save the version file to a var, and fail if there's no version file +if(BerkeleyDB_INCLUDE_DIRS) + # Read the version file db.h into a variable + file(READ "${BerkeleyDB_INCLUDE_DIRS}/db.h" _BERKELEYDB_DB_HEADER) + # Parse the DB version into variables to be used in the lib names + string(REGEX REPLACE ".*DB_VERSION_MAJOR ([0-9]+).*" "\\1" BerkeleyDB_VERSION_MAJOR "${_BERKELEYDB_DB_HEADER}") + string(REGEX REPLACE ".*DB_VERSION_MINOR ([0-9]+).*" "\\1" BerkeleyDB_VERSION_MINOR "${_BERKELEYDB_DB_HEADER}") + # Patch version example on non-crypto installs: x.x.xNC + string(REGEX REPLACE ".*DB_VERSION_PATCH ([0-9]+(NC)?).*" "\\1" BerkeleyDB_VERSION_PATCH "${_BERKELEYDB_DB_HEADER}") +else() + if(BerkeleyDB_FIND_REQUIRED) + # If the find_package(BerkeleyDB REQUIRED) was used, fail since we couldn't find the header + message(FATAL_ERROR "Failed to find Berkeley DB's header file \"db.h\"! Try setting \"BerkeleyDB_ROOT_DIR\" when initiating Cmake.") + elseif(NOT BerkeleyDB_FIND_QUIETLY) + message(WARNING "Failed to find Berkeley DB's header file \"db.h\"! Try setting \"BerkeleyDB_ROOT_DIR\" when initiating Cmake.") + endif() + # Set some garbage values to the versions since we didn't find a file to read + set(BerkeleyDB_VERSION_MAJOR "0") + set(BerkeleyDB_VERSION_MINOR "0") + set(BerkeleyDB_VERSION_PATCH "0") +endif() + +# The actual returned/output version variable (the others can be used if needed) +set(BerkeleyDB_VERSION "${BerkeleyDB_VERSION_MAJOR}.${BerkeleyDB_VERSION_MINOR}.${BerkeleyDB_VERSION_PATCH}") + +# Finds the target library for berkeley db, since they all follow the same naming conventions +macro(findpackage_berkeleydb_get_lib _BERKELEYDB_OUTPUT_VARNAME _TARGET_BERKELEYDB_LIB) + # Different systems sometimes have a version in the lib name... + # and some have a dash or underscore before the versions. + # CMake recommends to put unversioned names before versioned names + find_library(${_BERKELEYDB_OUTPUT_VARNAME} + NAMES + "${_TARGET_BERKELEYDB_LIB}" + "lib${_TARGET_BERKELEYDB_LIB}" + "lib${_TARGET_BERKELEYDB_LIB}${BerkeleyDB_VERSION_MAJOR}.${BerkeleyDB_VERSION_MINOR}" + "lib${_TARGET_BERKELEYDB_LIB}-${BerkeleyDB_VERSION_MAJOR}.${BerkeleyDB_VERSION_MINOR}" + "lib${_TARGET_BERKELEYDB_LIB}_${BerkeleyDB_VERSION_MAJOR}.${BerkeleyDB_VERSION_MINOR}" + "lib${_TARGET_BERKELEYDB_LIB}${BerkeleyDB_VERSION_MAJOR}${BerkeleyDB_VERSION_MINOR}" + "lib${_TARGET_BERKELEYDB_LIB}-${BerkeleyDB_VERSION_MAJOR}${BerkeleyDB_VERSION_MINOR}" + "lib${_TARGET_BERKELEYDB_LIB}_${BerkeleyDB_VERSION_MAJOR}${BerkeleyDB_VERSION_MINOR}" + "lib${_TARGET_BERKELEYDB_LIB}${BerkeleyDB_VERSION_MAJOR}" + "lib${_TARGET_BERKELEYDB_LIB}-${BerkeleyDB_VERSION_MAJOR}" + "lib${_TARGET_BERKELEYDB_LIB}_${BerkeleyDB_VERSION_MAJOR}" + HINTS ${_BERKELEYDB_PATHS} + PATH_SUFFIXES "lib" "lib64" "libs" "libs64" + ) + # If the library was found, add it to our list of libraries + if(${_BERKELEYDB_OUTPUT_VARNAME}) + # If found, append to our libraries variable + # The ${{}} is because the first expands to target the real variable, the second expands the variable's contents... + # and the real variable's contents is the path to the lib. Thus, it appends the path of the lib to BerkeleyDB_LIBRARIES. + list(APPEND BerkeleyDB_LIBRARIES "${${_BERKELEYDB_OUTPUT_VARNAME}}") + endif() +endmacro() + +# Find and set the paths of the specific library to the variable +findpackage_berkeleydb_get_lib(BerkeleyDB_LIBRARY "db") +# NOTE: Windows doesn't have a db_cxx lib, but instead compiles the cxx code into the "db" lib +findpackage_berkeleydb_get_lib(BerkeleyDB_Cxx_LIBRARY "db_cxx") +# NOTE: I don't think Linux/Unix gets an SQL lib +findpackage_berkeleydb_get_lib(BerkeleyDB_Sql_LIBRARY "db_sql") +findpackage_berkeleydb_get_lib(BerkeleyDB_Stl_LIBRARY "db_stl") + +# Needed for find_package_handle_standard_args() +include(FindPackageHandleStandardArgs) +# Fails if required vars aren't found, or if the version doesn't meet specifications. +find_package_handle_standard_args(BerkeleyDB + FOUND_VAR BerkeleyDB_FOUND + REQUIRED_VARS + BerkeleyDB_INCLUDE_DIRS + BerkeleyDB_LIBRARY + VERSION_VAR BerkeleyDB_VERSION +) + +# Create an imported lib for easy linking by external projects +if(BerkeleyDB_FOUND AND BerkeleyDB_LIBRARIES AND NOT TARGET Oracle::BerkeleyDB) + add_library(Oracle::BerkeleyDB UNKNOWN IMPORTED) + set_target_properties(Oracle::BerkeleyDB PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${BerkeleyDB_INCLUDE_DIRS}" + IMPORTED_LOCATION "${BerkeleyDB_LIBRARY}" + INTERFACE_LINK_LIBRARIES "${BerkeleyDB_LIBRARIES}" + ) +endif() + +# Only show the includes path and libraries in the GUI if they click "advanced". +# Does nothing when using the CLI +mark_as_advanced(FORCE + BerkeleyDB_INCLUDE_DIRS + BerkeleyDB_LIBRARIES + BerkeleyDB_LIBRARY + BerkeleyDB_Cxx_LIBRARY + BerkeleyDB_Sql_LIBRARY + BerkeleyDB_Stl_LIBRARY +) + +include(FindPackageMessage) +# A message that tells the user what includes/libs were found, and obeys the QUIET command. +find_package_message(BerkeleyDB + "Found BerkeleyDB libraries: ${BerkeleyDB_LIBRARIES}" + "[${BerkeleyDB_LIBRARIES}[${BerkeleyDB_INCLUDE_DIRS}]]" +) diff --git a/config.h.cmake b/config.h.cmake index b7e1d5c9..43767758 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -211,8 +211,10 @@ typedef unsigned long size_t; /* Typedef ssize_t if needed */ #cmakedefine HAVE_SIZEOF_SSIZE_T #if !defined(HAVE_SIZEOF_SSIZE_T) +#if !defined(HAVE_BDB) && !defined(_WIN32) typedef long ssize_t; #endif +#endif /* Typedef pid_t if needed */ #cmakedefine HAVE_SIZEOF_PID_T 1 diff --git a/src/libicalss/icalbdbset.c b/src/libicalss/icalbdbset.c index 81c6e21f..773c20b5 100644 --- a/src/libicalss/icalbdbset.c +++ b/src/libicalss/icalbdbset.c @@ -83,7 +83,11 @@ int icalbdbset_init_dbenv(char *db_env_dir, flags = (u_int32_t) (DB_INIT_LOCK | DB_INIT_TXN | DB_CREATE | DB_THREAD | DB_RECOVER | DB_INIT_LOG | DB_INIT_MPOOL); +#if defined(_WIN32) //krazy:exclude=cpp + ret = ICAL_DB_ENV->open(ICAL_DB_ENV, db_env_dir, flags, 0 /*ignored on Windows*/); +#else ret = ICAL_DB_ENV->open(ICAL_DB_ENV, db_env_dir, flags, S_IRUSR | S_IWUSR); +#endif if (ret) { /*char *foo = db_strerror(ret); */ diff --git a/src/test/regression-component.c b/src/test/regression-component.c index 311cf1f8..caed9af4 100644 --- a/src/test/regression-component.c +++ b/src/test/regression-component.c @@ -448,7 +448,7 @@ void test_icalcomponent_get_span() if (VERBOSE) print_span(tnum++, span); - int_is("start == end", (int)span.start, span.end); + int_is("start == end", (int)span.start, (int)span.end); icalcomponent_free(c); /** test 7 |