From 6302ba07e3e3b493d0c67957fc343265f9a018d6 Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Sat, 1 Jul 2023 13:55:49 -0400 Subject: [PATCH 1/2] db: fix build with clang 16 The configure scripts frequently use `main` returning an implicit `int`, which causes spurious failures when CC is clang 16+. This is fixed by patching the provided macros and regenerating the scripts with autoreconfHook, though it requires some manual processing (see below). The upstream `configure.ac` is written in such a way that it requires fixups and post-processing. * Fixups are required because the original build process just cats the macros together into one file. When `aclocal` is run, it does not pick up all of them. This is worked around by catting the missing macros to a file that is picked up by autoreconfHook. * Post-processing is required to populate the version information. This is done in a subshell to avoid polluting the environment with the contents of `RELEASE`. Otherwise, the build will fail because the version C macros it expects will not be defined. --- pkgs/development/libraries/db/clang-4.8.patch | 64 +++++++++++ pkgs/development/libraries/db/clang-5.3.patch | 108 ++++++++++++++++++ pkgs/development/libraries/db/db-4.8.nix | 2 +- pkgs/development/libraries/db/db-5.3.nix | 2 +- pkgs/development/libraries/db/db-6.0.nix | 2 +- pkgs/development/libraries/db/db-6.2.nix | 2 +- pkgs/development/libraries/db/generic.nix | 43 ++++++- 7 files changed, 218 insertions(+), 5 deletions(-) diff --git a/pkgs/development/libraries/db/clang-4.8.patch b/pkgs/development/libraries/db/clang-4.8.patch index aa46b8500b5a..0aff87682037 100644 --- a/pkgs/development/libraries/db/clang-4.8.patch +++ b/pkgs/development/libraries/db/clang-4.8.patch @@ -139,3 +139,67 @@ index f3922e0..e40fcdf 100644 } else { DB_ASSERT(env, sharecount > 0); MEMBAR_EXIT(); +diff -ur a/dist/aclocal/clock.m4 b/dist/aclocal/clock.m4 +--- a/dist/aclocal/clock.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/clock.m4 2023-06-05 19:14:02.007080500 -0400 +@@ -21,6 +21,7 @@ + AC_CACHE_CHECK([for clock_gettime monotonic clock], db_cv_clock_monotonic, [ + AC_TRY_RUN([ + #include ++int + main() { + struct timespec t; + return (clock_gettime(CLOCK_MONOTONIC, &t) != 0); +diff -ur a/dist/aclocal/mutex.m4 b/dist/aclocal/mutex.m4 +--- a/dist/aclocal/mutex.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/mutex.m4 2023-06-05 19:14:47.214158196 -0400 +@@ -4,6 +4,7 @@ + AC_DEFUN(AM_PTHREADS_SHARED, [ + AC_TRY_RUN([ + #include ++int + main() { + pthread_cond_t cond; + pthread_mutex_t mutex; +@@ -46,6 +47,7 @@ + AC_DEFUN(AM_PTHREADS_PRIVATE, [ + AC_TRY_RUN([ + #include ++int + main() { + pthread_cond_t cond; + pthread_mutex_t mutex; +diff -ur a/dist/aclocal/sequence.m4 b/dist/aclocal/sequence.m4 +--- a/dist/aclocal/sequence.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/sequence.m4 2023-06-05 19:14:02.007869956 -0400 +@@ -43,6 +43,9 @@ + # test, which won't test for the appropriate printf format strings. + if test "$db_cv_build_sequence" = "yes"; then + AC_TRY_RUN([ ++ #include ++ #include ++ int + main() { + $db_cv_seq_type l; + unsigned $db_cv_seq_type u; +@@ -59,7 +62,9 @@ + return (1); + return (0); + }],, [db_cv_build_sequence="no"], +- AC_TRY_LINK(,[ ++ AC_TRY_LINK([ ++ #include ++ #include ],[ + $db_cv_seq_type l; + unsigned $db_cv_seq_type u; + char buf@<:@100@:>@; +diff -ur a/dist/RELEASE b/dist/RELEASE +--- a/dist/RELEASE 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/RELEASE 2023-07-02 17:32:34.703953049 -0400 +@@ -7,5 +7,5 @@ + + DB_VERSION_UNIQUE_NAME=`printf "_%d%03d" $DB_VERSION_MAJOR $DB_VERSION_MINOR` + +-DB_RELEASE_DATE=`date "+%B %e, %Y"` ++DB_RELEASE_DATE="April 9, 2010" + DB_VERSION_STRING="Berkeley DB $DB_VERSION: ($DB_RELEASE_DATE)" diff --git a/pkgs/development/libraries/db/clang-5.3.patch b/pkgs/development/libraries/db/clang-5.3.patch index caf19ffeb92b..823a71d6532f 100644 --- a/pkgs/development/libraries/db/clang-5.3.patch +++ b/pkgs/development/libraries/db/clang-5.3.patch @@ -139,3 +139,111 @@ index 106b161..fc4de9d 100644 } else { DB_ASSERT(env, sharecount > 0); MEMBAR_EXIT(); +diff -ur a/dist/aclocal/clock.m4 b/dist/aclocal/clock.m4 +--- a/dist/aclocal/clock.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/clock.m4 2023-06-05 19:14:02.007080500 -0400 +@@ -21,6 +21,7 @@ + AC_CACHE_CHECK([for clock_gettime monotonic clock], db_cv_clock_monotonic, [ + AC_TRY_RUN([ + #include ++int + main() { + struct timespec t; + return (clock_gettime(CLOCK_MONOTONIC, &t) != 0); +diff -ur a/dist/aclocal/mmap.m4 b/dist/aclocal/mmap.m4 +--- a/dist/aclocal/mmap.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/mmap.m4 2023-06-05 19:14:02.007323624 -0400 +@@ -29,6 +29,8 @@ + * system to system. + */ + #include ++ #include ++ #include + #include + #include + #include +@@ -42,12 +44,13 @@ + #define MAP_FAILED (-1) + #endif + +- int catch_sig(sig) ++ void catch_sig(sig) + int sig; + { + exit(1); + } + ++ int + main() { + const char *underlying; + unsigned gapsize; +@@ -88,8 +91,8 @@ + return (4); + } + +- (void) signal(SIGSEGV, catch_sig); +- (void) signal(SIGBUS, catch_sig); ++ (void) signal(SIGSEGV, &catch_sig); ++ (void) signal(SIGBUS, &catch_sig); + + for (i = sizeof(buf); i < total_size; i += gapsize) + base[i] = 'A'; +diff -ur a/dist/aclocal/mutex.m4 b/dist/aclocal/mutex.m4 +--- a/dist/aclocal/mutex.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/mutex.m4 2023-06-05 19:14:47.214158196 -0400 +@@ -5,6 +5,7 @@ + AC_TRY_RUN([ + #include + #include ++int + main() { + pthread_cond_t cond; + pthread_mutex_t mutex; +@@ -49,6 +50,7 @@ + AC_TRY_RUN([ + #include + #include ++int + main() { + pthread_cond_t cond; + pthread_mutex_t mutex; +@@ -89,6 +91,7 @@ + AC_TRY_RUN([ + #include + #include ++int + main() { + pthread_cond_t cond; + pthread_condattr_t condattr; +@@ -110,6 +113,7 @@ + AC_TRY_RUN([ + #include + #include ++int + main() { + pthread_rwlock_t rwlock; + pthread_rwlockattr_t rwlockattr; +diff -ur a/dist/aclocal/sequence.m4 b/dist/aclocal/sequence.m4 +--- a/dist/aclocal/sequence.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/sequence.m4 2023-06-05 19:14:02.007869956 -0400 +@@ -43,6 +43,9 @@ + # test, which won't test for the appropriate printf format strings. + if test "$db_cv_build_sequence" = "yes"; then + AC_TRY_RUN([ ++ #include ++ #include ++ int + main() { + $db_cv_seq_type l; + unsigned $db_cv_seq_type u; +@@ -59,7 +62,9 @@ + return (1); + return (0); + }],, [db_cv_build_sequence="no"], +- AC_TRY_LINK(,[ ++ AC_TRY_LINK([ ++ #include ++ #include ],[ + $db_cv_seq_type l; + unsigned $db_cv_seq_type u; + char buf@<:@100@:>@; diff --git a/pkgs/development/libraries/db/db-4.8.nix b/pkgs/development/libraries/db/db-4.8.nix index 5cf9200a9ab9..7747751d5596 100644 --- a/pkgs/development/libraries/db/db-4.8.nix +++ b/pkgs/development/libraries/db/db-4.8.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, fetchurl, ... } @ args: +{ lib, stdenv, fetchurl, autoreconfHook, ... } @ args: import ./generic.nix (args // { version = "4.8.30"; diff --git a/pkgs/development/libraries/db/db-5.3.nix b/pkgs/development/libraries/db/db-5.3.nix index 0bb5c4cd6a4a..805f7907d6ef 100644 --- a/pkgs/development/libraries/db/db-5.3.nix +++ b/pkgs/development/libraries/db/db-5.3.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, fetchurl, ... } @ args: +{ lib, stdenv, fetchurl, autoreconfHook, ... } @ args: import ./generic.nix (args // { version = "5.3.28"; diff --git a/pkgs/development/libraries/db/db-6.0.nix b/pkgs/development/libraries/db/db-6.0.nix index 49935dd2399b..31091d670900 100644 --- a/pkgs/development/libraries/db/db-6.0.nix +++ b/pkgs/development/libraries/db/db-6.0.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, fetchurl, ... } @ args: +{ lib, stdenv, fetchurl, autoreconfHook, ... } @ args: import ./generic.nix (args // { version = "6.0.20"; diff --git a/pkgs/development/libraries/db/db-6.2.nix b/pkgs/development/libraries/db/db-6.2.nix index b2c0fd7ac8fc..b8c202b96376 100644 --- a/pkgs/development/libraries/db/db-6.2.nix +++ b/pkgs/development/libraries/db/db-6.2.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, fetchurl, ... } @ args: +{ lib, stdenv, fetchurl, autoreconfHook, ... } @ args: import ./generic.nix (args // { version = "6.2.23"; diff --git a/pkgs/development/libraries/db/generic.nix b/pkgs/development/libraries/db/generic.nix index 59df0e8469cb..5bd5ed44b343 100644 --- a/pkgs/development/libraries/db/generic.nix +++ b/pkgs/development/libraries/db/generic.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, fetchurl +{ lib, stdenv, fetchurl, autoreconfHook , cxxSupport ? true , compat185 ? true , dbmSupport ? false @@ -10,6 +10,9 @@ , drvArgs ? {} }: +let + shouldReconfigure = stdenv.cc.isClang; +in stdenv.mkDerivation (rec { pname = "db"; inherit version; @@ -19,10 +22,48 @@ stdenv.mkDerivation (rec { sha256 = sha256; }; + # The provided configure script features `main` returning implicit `int`, which causes + # configure checks to work incorrectly with clang 16. + nativeBuildInputs = lib.optionals stdenv.cc.isClang [ autoreconfHook ]; + patches = extraPatches; outputs = [ "bin" "out" "dev" ]; + # Required when regenerated the configure script to make sure the vendored macros are found. + autoreconfFlags = lib.optionalString shouldReconfigure [ "-fi" "-Iaclocal" "-Iaclocal_java" ]; + + preAutoreconf = lib.optionalString shouldReconfigure '' + pushd dist + # Upstream’s `dist/s_config` cats everything into `aclocal.m4`, but that doesn’t work with + # autoreconfHook, so cat `config.m4` to another file. Otherwise, it won’t be found by `aclocal`. + cat aclocal/config.m4 >> aclocal/options.m4 + ''; + + # This isn’t pretty. The version information is kept separate from the configure script. + # After the configure script is regenerated, the version information has to be replaced with the + # contents of `dist/RELEASE`. + postAutoreconf = lib.optionalString shouldReconfigure '' + ( + declare -a vars=( + "DB_VERSION_FAMILY" + "DB_VERSION_RELEASE" + "DB_VERSION_MAJOR" + "DB_VERSION_MINOR" + "DB_VERSION_PATCH" + "DB_VERSION_STRING" + "DB_VERSION_FULL_STRING" + "DB_VERSION_UNIQUE_NAME" + "DB_VERSION" + ) + source RELEASE + for var in "''${vars[@]}"; do + sed -e "s/__EDIT_''${var}__/''${!var}/g" -i configure + done + ) + popd + ''; + configureFlags = [ (if cxxSupport then "--enable-cxx" else "--disable-cxx") From 38018514e88f9e724bc709554e56bfe84acb46ac Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Sat, 1 Jul 2023 13:56:34 -0400 Subject: [PATCH 2/2] db: fix build with clang 16 on Darwin Both `_spin_lock_try` and `_spin_unlock` are private and deprecated APIs, which are not exported by any headers in the SDK. The build fails because the configure script does not define the functions before calling them, which is treated as error by clang 16. This patch replaces use of those APIs with `os_unfair_lock`, which is the recommended replacement per the deprecation messages. --- .../libraries/db/darwin-mutexes-4.8.patch | 55 +++++++++++++++++++ .../libraries/db/darwin-mutexes.patch | 42 ++++++++++++++ pkgs/development/libraries/db/db-4.8.nix | 3 +- pkgs/development/libraries/db/db-5.3.nix | 3 +- pkgs/development/libraries/db/db-6.0.nix | 3 +- pkgs/development/libraries/db/db-6.2.nix | 3 +- 6 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 pkgs/development/libraries/db/darwin-mutexes-4.8.patch create mode 100644 pkgs/development/libraries/db/darwin-mutexes.patch diff --git a/pkgs/development/libraries/db/darwin-mutexes-4.8.patch b/pkgs/development/libraries/db/darwin-mutexes-4.8.patch new file mode 100644 index 000000000000..09d5b814f161 --- /dev/null +++ b/pkgs/development/libraries/db/darwin-mutexes-4.8.patch @@ -0,0 +1,55 @@ +diff -ur a/dist/aclocal/mutex.m4 b/dist/aclocal/mutex.m4 +--- a/dist/aclocal/mutex.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/mutex.m4 2023-06-05 19:14:47.214158196 -0400 +@@ -372,10 +376,11 @@ + + # _spin_lock_try/_spin_unlock: Apple/Darwin + if test "$db_cv_mutex" = no; then +-AC_TRY_LINK(,[ +- int x; +- _spin_lock_try(&x); +- _spin_unlock(&x); ++AC_TRY_LINK([ ++#include ],[ ++ os_unfair_lock x = OS_UNFAIR_LOCK_INIT; ++ bool _ = os_unfair_lock_trylock(&x); ++ os_unfair_lock_unlock(&x); + ], [db_cv_mutex=Darwin/_spin_lock_try]) + fi + +diff -ur a/dbinc/mutex_int.h b/dbinc/mutex_int.h +--- a/dbinc/mutex_int.h 1969-12-31 19:00:01.000000000 -0500 ++++ b/dbinc/mutex_int.h 2023-06-05 19:15:37.510514745 -0400 +@@ -154,14 +154,13 @@ + * Apple/Darwin library functions. + *********************************************************************/ + #ifdef HAVE_MUTEX_DARWIN_SPIN_LOCK_TRY +-typedef u_int32_t tsl_t; ++#include ++typedef os_unfair_lock tsl_t; + + #ifdef LOAD_ACTUAL_MUTEX_CODE +-extern int _spin_lock_try(tsl_t *); +-extern void _spin_unlock(tsl_t *); +-#define MUTEX_SET(tsl) _spin_lock_try(tsl) +-#define MUTEX_UNSET(tsl) _spin_unlock(tsl) +-#define MUTEX_INIT(tsl) (MUTEX_UNSET(tsl), 0) ++#define MUTEX_SET(tsl) os_unfair_lock_trylock(tsl) ++#define MUTEX_UNSET(tsl) os_unfair_lock_unlock(tsl) ++#define MUTEX_INIT(tsl) ({ *(tsl) = OS_UNFAIR_LOCK_INIT; tsl; }) + #endif + #endif + +diff -ur a/dbinc/mutex_int.h b/dbinc/mutex_int.h +--- a/dbinc_auto/mutex_ext.h 1969-12-31 19:00:01.000000000 -0500 ++++ b/dbinc_auto/mutex_ext.h 2023-07-01 22:38:20.749201366 -0400 +@@ -34,6 +34,9 @@ + #if !defined(HAVE_ATOMIC_SUPPORT) && defined(HAVE_MUTEX_SUPPORT) + atomic_value_t __atomic_dec __P((ENV *, db_atomic_t *)); + #endif ++#if !defined(HAVE_ATOMIC_SUPPORT) && defined(HAVE_MUTEX_SUPPORT) ++int atomic_compare_exchange __P((ENV *, db_atomic_t *, atomic_value_t, atomic_value_t)); ++#endif + int __db_pthread_mutex_init __P((ENV *, db_mutex_t, u_int32_t)); + int __db_pthread_mutex_lock __P((ENV *, db_mutex_t)); + #if defined(HAVE_SHARED_LATCHES) diff --git a/pkgs/development/libraries/db/darwin-mutexes.patch b/pkgs/development/libraries/db/darwin-mutexes.patch new file mode 100644 index 000000000000..c0616fda7f7f --- /dev/null +++ b/pkgs/development/libraries/db/darwin-mutexes.patch @@ -0,0 +1,42 @@ +diff -ur a/dist/aclocal/mutex.m4 b/dist/aclocal/mutex.m4 +--- a/dist/aclocal/mutex.m4 1969-12-31 19:00:01.000000000 -0500 ++++ b/dist/aclocal/mutex.m4 2023-06-05 19:14:47.214158196 -0400 +@@ -441,10 +445,11 @@ + + # _spin_lock_try/_spin_unlock: Apple/Darwin + if test "$db_cv_mutex" = no; then +-AC_TRY_LINK(,[ +- int x; +- _spin_lock_try(&x); +- _spin_unlock(&x); ++AC_TRY_LINK([ ++#include ],[ ++ os_unfair_lock x = OS_UNFAIR_LOCK_INIT; ++ bool _ = os_unfair_lock_trylock(&x); ++ os_unfair_lock_unlock(&x); + ], [db_cv_mutex=Darwin/_spin_lock_try]) + fi + +diff -ur a/src/dbinc/mutex_int.h b/src/dbinc/mutex_int.h +--- a/src/dbinc/mutex_int.h 1969-12-31 19:00:01.000000000 -0500 ++++ b/src/dbinc/mutex_int.h 2023-06-05 19:15:37.510514745 -0400 +@@ -154,14 +154,13 @@ + * Apple/Darwin library functions. + *********************************************************************/ + #ifdef HAVE_MUTEX_DARWIN_SPIN_LOCK_TRY +-typedef u_int32_t tsl_t; ++#include ++typedef os_unfair_lock tsl_t; + + #ifdef LOAD_ACTUAL_MUTEX_CODE +-extern int _spin_lock_try(tsl_t *); +-extern void _spin_unlock(tsl_t *); +-#define MUTEX_SET(tsl) _spin_lock_try(tsl) +-#define MUTEX_UNSET(tsl) _spin_unlock(tsl) +-#define MUTEX_INIT(tsl) (MUTEX_UNSET(tsl), 0) ++#define MUTEX_SET(tsl) os_unfair_lock_trylock(tsl) ++#define MUTEX_UNSET(tsl) os_unfair_lock_unlock(tsl) ++#define MUTEX_INIT(tsl) ({ *(tsl) = OS_UNFAIR_LOCK_INIT; tsl; }) + #endif + #endif + diff --git a/pkgs/development/libraries/db/db-4.8.nix b/pkgs/development/libraries/db/db-4.8.nix index 7747751d5596..9f2a916317e4 100644 --- a/pkgs/development/libraries/db/db-4.8.nix +++ b/pkgs/development/libraries/db/db-4.8.nix @@ -3,7 +3,8 @@ import ./generic.nix (args // { version = "4.8.30"; sha256 = "0ampbl2f0hb1nix195kz1syrqqxpmvnvnfvphambj7xjrl3iljg0"; - extraPatches = [ ./clang-4.8.patch ./CVE-2017-10140-4.8-cwd-db_config.patch ]; + extraPatches = [ ./clang-4.8.patch ./CVE-2017-10140-4.8-cwd-db_config.patch ] + ++ lib.optionals stdenv.isDarwin [ ./darwin-mutexes-4.8.patch ]; drvArgs.hardeningDisable = [ "format" ]; drvArgs.doCheck = false; diff --git a/pkgs/development/libraries/db/db-5.3.nix b/pkgs/development/libraries/db/db-5.3.nix index 805f7907d6ef..3fd08c510c27 100644 --- a/pkgs/development/libraries/db/db-5.3.nix +++ b/pkgs/development/libraries/db/db-5.3.nix @@ -3,5 +3,6 @@ import ./generic.nix (args // { version = "5.3.28"; sha256 = "0a1n5hbl7027fbz5lm0vp0zzfp1hmxnz14wx3zl9563h83br5ag0"; - extraPatches = [ ./clang-5.3.patch ./CVE-2017-10140-cwd-db_config.patch ]; + extraPatches = [ ./clang-5.3.patch ./CVE-2017-10140-cwd-db_config.patch ] + ++ lib.optionals stdenv.isDarwin [ ./darwin-mutexes.patch ]; }) diff --git a/pkgs/development/libraries/db/db-6.0.nix b/pkgs/development/libraries/db/db-6.0.nix index 31091d670900..a9b748e34905 100644 --- a/pkgs/development/libraries/db/db-6.0.nix +++ b/pkgs/development/libraries/db/db-6.0.nix @@ -4,5 +4,6 @@ import ./generic.nix (args // { version = "6.0.20"; sha256 = "00r2aaglq625y8r9xd5vw2y070plp88f1mb2gbq3kqsl7128lsl0"; license = lib.licenses.agpl3; - extraPatches = [ ./clang-6.0.patch ./CVE-2017-10140-cwd-db_config.patch ]; + extraPatches = [ ./clang-6.0.patch ./CVE-2017-10140-cwd-db_config.patch ] + ++ lib.optionals stdenv.isDarwin [ ./darwin-mutexes.patch ]; }) diff --git a/pkgs/development/libraries/db/db-6.2.nix b/pkgs/development/libraries/db/db-6.2.nix index b8c202b96376..4b3a3c6129a7 100644 --- a/pkgs/development/libraries/db/db-6.2.nix +++ b/pkgs/development/libraries/db/db-6.2.nix @@ -4,5 +4,6 @@ import ./generic.nix (args // { version = "6.2.23"; sha256 = "1isxx4jfmnh913jzhp8hhfngbk6dsg46f4kjpvvc56maj64jqqa7"; license = lib.licenses.agpl3; - extraPatches = [ ./clang-6.0.patch ./CVE-2017-10140-cwd-db_config.patch ]; + extraPatches = [ ./clang-6.0.patch ./CVE-2017-10140-cwd-db_config.patch ] + ++ lib.optionals stdenv.isDarwin [ ./darwin-mutexes.patch ]; })