From 4035c1ad059d5cab76b8322aed55e79b02c0cebf Mon Sep 17 00:00:00 2001 From: benaryorg Date: Thu, 7 Nov 2024 03:46:23 +0000 Subject: [PATCH] phash: compilation fixes This includes a patch already sent upstream that fixes compilation with Werror due to a lacking return, as well as adding a linker flag to include a threaded version of a library. The fftw3_threads part stems from cimg requiring this apparently when linking the examples: > test_texthash.cpp:(.text.startup+0x1c1): undefined reference to `fftw_init_threads' I wouldn't know how to patch this upstream, however other packages in nixpkgs seem to provide the LDFLAGS too. Signed-off-by: benaryorg --- .../0001-proper-pthread-return-value.patch | 40 +++++++++++++++++++ pkgs/by-name/ph/phash/package.nix | 9 ++++- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 pkgs/by-name/ph/phash/0001-proper-pthread-return-value.patch diff --git a/pkgs/by-name/ph/phash/0001-proper-pthread-return-value.patch b/pkgs/by-name/ph/phash/0001-proper-pthread-return-value.patch new file mode 100644 index 000000000000..52e929e57951 --- /dev/null +++ b/pkgs/by-name/ph/phash/0001-proper-pthread-return-value.patch @@ -0,0 +1,40 @@ +From 6ac2f207e8d8e1d16ee73198abccc64d20c5f608 Mon Sep 17 00:00:00 2001 +From: benaryorg +Date: Thu, 7 Nov 2024 03:27:52 +0000 +Subject: [PATCH 1/2] proper pthread return value + +*pthread_create(3)* states that the ways for a pthread to exit includes: + +> It returns from start_routine(). This is equivalent to calling pthread_exit(3) with the value supplied in the return statement. + +This "retval" is a void pointer which can be anything. +In this case, since all threads are always joined with a parameter of NULL for the `void**` to store the retval this isn't really relevant for providing a meaningful return value. +However a `void*` function must return a `void*`, otherwise compilers will complain: + +> pHash.cpp:416:1: warning: no return statement in function returning non-void [8;;https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wreturn-type-Wreturn-type8;;] + +Therefore returning NULL seems reasonable. +As for the choice of NULL vs. nullptr or any other value, NULL is already widely used in the file. + +Long story short: this fixes a compiler warning/error. + +Signed-off-by: benaryorg +--- + src/pHash.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/pHash.cpp b/src/pHash.cpp +index 07b03ad..23bbbf3 100644 +--- a/src/pHash.cpp ++++ b/src/pHash.cpp +@@ -417,6 +417,7 @@ void *ph_image_thread(void *p) + memcpy(dp->hash, &hash, sizeof(hash)); + dp->hash_length = 1; + } ++ return NULL; + } + + DP** ph_dct_image_hashes(char *files[], int count, int threads) +-- +2.44.1 + diff --git a/pkgs/by-name/ph/phash/package.nix b/pkgs/by-name/ph/phash/package.nix index 73097db5ccc6..8f40cd0d9a71 100644 --- a/pkgs/by-name/ph/phash/package.nix +++ b/pkgs/by-name/ph/phash/package.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, fetchFromGitHub, pkg-config, cimg, imagemagick }: +{ lib, stdenv, fetchFromGitHub, fetchpatch, pkg-config, cimg, imagemagick }: stdenv.mkDerivation rec { pname = "pHash"; @@ -24,6 +24,13 @@ stdenv.mkDerivation rec { sha256 = "sha256-frISiZ89ei7XfI5F2nJJehfQZsk0Mlb4n91q/AiZ2vA="; }; + NIX_LDFLAGS = "-lfftw3_threads"; + + patches = [ + # proper pthread return value (https://github.com/clearscene/pHash/pull/20) + ./0001-proper-pthread-return-value.patch + ]; + meta = with lib; { description = "Compute the perceptual hash of an image"; license = licenses.gpl3;