summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.krazy2
-rw-r--r--CMakeLists.txt24
-rw-r--r--README.md (renamed from ReadMe.txt)4
l---------ReadMe.md1
-rw-r--r--ReleaseNotes.txt6
-rw-r--r--cmake/modules/FindBerkeleyDB.cmake182
-rw-r--r--config.h.cmake2
-rw-r--r--src/libicalss/icalbdbset.c4
-rw-r--r--src/test/regression-component.c2
9 files changed, 219 insertions, 8 deletions
diff --git a/.krazy b/.krazy
index 4cae2a34..a07b908c 100644
--- a/.krazy
+++ b/.krazy
@@ -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
diff --git a/ReadMe.txt b/README.md
index bcbc1654..698a027e 100644
--- a/ReadMe.txt
+++ b/README.md
@@ -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