git: 75ac7903573c - main - graphics/darktable: Use GCC as the compiler instead of LLVM

From: Jean-Sébastien Pédron <dumbbell_at_FreeBSD.org>
Date: Fri, 27 Jan 2023 22:45:51 UTC
The branch main has been updated by dumbbell:

URL: https://cgit.FreeBSD.org/ports/commit/?id=75ac7903573cdc224246b8ec9446a97e0e4c099d

commit 75ac7903573cdc224246b8ec9446a97e0e4c099d
Author:     Jean-Sébastien Pédron <dumbbell@FreeBSD.org>
AuthorDate: 2023-01-25 17:54:51 +0000
Commit:     Jean-Sébastien Pédron <dumbbell@FreeBSD.org>
CommitDate: 2023-01-27 22:34:43 +0000

    graphics/darktable: Use GCC as the compiler instead of LLVM
    
    Darktable source code is heavily tuned for GCC and its optimizations. It
    always required some work to make it compile with LLVM. With LLVM 14+,
    new errors around `static inline __attribute__((target-clones))`
    appeared: the compiler failed to link the final executable because there
    was multiple copies of the same ifunc resolver (the code originated from
    a header included in a couple places). Apparently GCC knows how to deal
    with the "static-inline"-ness of the resolver somehow.
    
    Unfortunately, even with GCC, we get several compilation failures
    because the source files enable Graphite optimizations (using `#pragma`)
    but our GCC compiler has Graphite disabled by default. All the patches
    included in this commit simply delete all the corresponding `#pragma`. I
    suppose Darktable will be slightly slower because of this, but I didn't
    measure anything.
    
    In the end, the dependencies of the port change a bit because GCC
    replaces LLVM.
---
 graphics/darktable/Makefile                        | 22 +++++-------------
 .../files/patch-src_common_extra__optimizations.h  | 22 ++++++++++++++++++
 .../darktable/files/patch-src_common_iop__order.c  | 26 +++++++++++++++++++++
 .../files/patch-src_common_iop__profile.c          | 27 ++++++++++++++++++++++
 .../files/patch-src_develop_blends_blendif__lab.c  | 18 +++++++++++++++
 .../files/patch-src_develop_blends_blendif__raw.c  | 18 +++++++++++++++
 .../patch-src_develop_blends_blendif__rgb__hsl.c   | 18 +++++++++++++++
 ...patch-src_develop_blends_blendif__rgb__jzczhz.c | 18 +++++++++++++++
 .../files/patch-src_iop_channelmixerrgb.c          | 26 +++++++++++++++++++++
 graphics/darktable/files/patch-src_iop_filmicrgb.c | 24 +++++++++++++++++++
 .../darktable/files/patch-src_iop_negadoctor.c     | 20 ++++++++++++++++
 11 files changed, 223 insertions(+), 16 deletions(-)

diff --git a/graphics/darktable/Makefile b/graphics/darktable/Makefile
index cae03ceb4345..cc27afcf1618 100644
--- a/graphics/darktable/Makefile
+++ b/graphics/darktable/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	darktable
 PORTVERSION=	4.0.1
-PORTREVISION=	2
+PORTREVISION=	3
 CATEGORIES=	graphics
 MASTER_SITES=	https://github.com/darktable-org/${PORTNAME}/releases/download/release-${PORTVERSION:C/\.rc/rc/}/
 
@@ -33,8 +33,9 @@ LIB_DEPENDS=	libcolord-gtk.so:graphics/colord-gtk \
 		libsoup-2.4.so:devel/libsoup \
 		libtiff.so:graphics/tiff
 
-USES=		cmake compiler:c++14-lang desktop-file-utils gl gnome jpeg \
-		perl5 pkgconfig sdl shebangfix sqlite tar:xz xorg
+USES=		cmake compiler:gcc-c++11-lib desktop-file-utils gl gnome jpeg \
+		llvm:14,build perl5 pkgconfig sdl shebangfix sqlite \
+		tar:xz xorg
 USE_GL=		gl
 USE_GNOME=	cairo gtk30 intltool librsvg2 libxml2
 USE_LDCONFIG=	${PREFIX}/lib/${PORTNAME}
@@ -43,6 +44,8 @@ USE_XORG=	ice sm x11 xext xrandr
 
 SHEBANG_FILES=	tools/*.sh
 
+USE_GCC=	yes
+
 CMAKE_ARGS+=	-DBINARY_PACKAGE_BUILD=1 \
 		-DBUILD_CMSTEST:BOOL=ON \
 		-DUSE_KWALLET:BOOL=ON
@@ -124,19 +127,6 @@ PLIST_SUB+=	NO_OPENCL=""
 
 .include <bsd.port.pre.mk>
 
-.if ${CHOSEN_COMPILER_TYPE} == clang && ${OPSYS} == FreeBSD || ${ARCH} == "i386"
-LLVM_DEFAULT=	13
-BUILD_DEPENDS+=	clang${LLVM_DEFAULT}:devel/llvm${LLVM_DEFAULT}
-CC=		${LOCALBASE}/bin/clang${LLVM_DEFAULT}
-CPP=		${LOCALBASE}/bin/clang-cpp${LLVM_DEFAULT}
-CXX=		${LOCALBASE}/bin/clang++${LLVM_DEFAULT}
-LD=		${LOCALBASE}/bin/ld.lld${LLVM_DEFAULT}
-BINARY_ALIAS+=	ld.lld=${LOCALBASE}/bin/ld.lld${LLVM_DEFAULT}
-BINARY_ALIAS+=	llvm-objcopy=${LOCALBASE}/bin/llvm-objcopy${LLVM_DEFAULT}
-BINARY_ALIAS+=	llvm-ar=${LOCALBASE}/bin/llvm-ar${LLVM_DEFAULT}
-BINARY_ALIAS+=	llvm-ranlib=${LOCALBASE}/bin/llvm-ranlib${LLVM_DEFAULT}
-.endif
-
 # work around CMAKE/CCACHE flaw (cmake stomps over ccache)
 .if "${WITH_CCACHE_BUILD}" == "yes" && !defined(NO_CCACHE)
 CMAKE_ARGS+=	-DCMAKE_C_COMPILER_LAUNCHER=${CCACHE_BIN} \
diff --git a/graphics/darktable/files/patch-src_common_extra__optimizations.h b/graphics/darktable/files/patch-src_common_extra__optimizations.h
new file mode 100644
index 000000000000..8bacc37406e0
--- /dev/null
+++ b/graphics/darktable/files/patch-src_common_extra__optimizations.h
@@ -0,0 +1,22 @@
+--- src/common/extra_optimizations.h.orig	2022-12-14 15:18:18 UTC
++++ src/common/extra_optimizations.h
+@@ -17,19 +17,3 @@
+ */
+ 
+ #pragma once
+-
+-/* Enable extra optimizations on GCC by including this header at the very
+- * beginning of your *.c file (before any other includes). This applies
+- * these optimizations for all of the source file.
+- *
+- * we use finite-math-only because divisions by zero are manually avoided
+- * in the code, the rest is loop reorganization and vectorization optimization
+- **/
+-
+-#if defined(__GNUC__)
+-#pragma GCC optimize ("unroll-loops", "split-loops", \
+-                      "loop-nest-optimize", "tree-loop-im", \
+-                      "tree-loop-ivcanon", "ira-loop-pressure", \
+-                      "variable-expansion-in-unroller", \
+-                      "ivopts", "finite-math-only")
+-#endif
diff --git a/graphics/darktable/files/patch-src_common_iop__order.c b/graphics/darktable/files/patch-src_common_iop__order.c
new file mode 100644
index 000000000000..a9d9238e7156
--- /dev/null
+++ b/graphics/darktable/files/patch-src_common_iop__order.c
@@ -0,0 +1,26 @@
+--- src/common/iop_order.c.orig	2023-01-26 22:08:42 UTC
++++ src/common/iop_order.c
+@@ -36,23 +36,6 @@ static void _ioppr_reset_iop_order(GList *iop_order_li
+ 
+ static void _ioppr_reset_iop_order(GList *iop_order_list);
+ 
+-/** Note :
+- * we do not use finite-math-only and fast-math because divisions by zero are not manually avoided in the code
+- * fp-contract=fast enables hardware-accelerated Fused Multiply-Add
+- * the rest is loop reorganization and vectorization optimization
+- **/
+-#if defined(__GNUC__)
+-#pragma GCC optimize ("unroll-loops", "tree-loop-if-convert", \
+-                      "tree-loop-distribution", "no-strict-aliasing", \
+-                      "loop-interchange", "loop-nest-optimize", "tree-loop-im", \
+-                      "unswitch-loops", "tree-loop-ivcanon", "ira-loop-pressure", \
+-                      "split-ivs-in-unroller", "variable-expansion-in-unroller", \
+-                      "split-loops", "ivopts", "predictive-commoning",\
+-                      "tree-loop-linear", "loop-block", "loop-strip-mine", \
+-                      "fp-contract=fast", \
+-                      "tree-vectorize")
+-#endif
+-
+ const char *iop_order_string[] =
+ {
+   N_("custom"),
diff --git a/graphics/darktable/files/patch-src_common_iop__profile.c b/graphics/darktable/files/patch-src_common_iop__profile.c
new file mode 100644
index 000000000000..86ede0dec073
--- /dev/null
+++ b/graphics/darktable/files/patch-src_common_iop__profile.c
@@ -0,0 +1,27 @@
+--- src/common/iop_profile.c.orig	2023-01-26 22:13:13 UTC
++++ src/common/iop_profile.c
+@@ -32,24 +32,6 @@
+ #include <stdlib.h>
+ #include <string.h>
+ 
+-/** Note :
+- * we do not use finite-math-only and fast-math because divisions by zero are not manually avoided in the code
+- * fp-contract=fast enables hardware-accelerated Fused Multiply-Add
+- * the rest is loop reorganization and vectorization optimization
+- **/
+-#if defined(__GNUC__)
+-#pragma GCC optimize ("unroll-loops", "tree-loop-if-convert", \
+-                      "tree-loop-distribution", "no-strict-aliasing", \
+-                      "loop-interchange", "loop-nest-optimize", "tree-loop-im", \
+-                      "unswitch-loops", "tree-loop-ivcanon", "ira-loop-pressure", \
+-                      "split-ivs-in-unroller", "variable-expansion-in-unroller", \
+-                      "split-loops", "ivopts", "predictive-commoning",\
+-                      "tree-loop-linear", "loop-block", "loop-strip-mine", \
+-                      "fp-contract=fast", \
+-                      "tree-vectorize")
+-#endif
+-
+-
+ static void _mark_as_nonmatrix_profile(dt_iop_order_iccprofile_info_t *const profile_info)
+ {
+   profile_info->matrix_in[0][0] = NAN;
diff --git a/graphics/darktable/files/patch-src_develop_blends_blendif__lab.c b/graphics/darktable/files/patch-src_develop_blends_blendif__lab.c
new file mode 100644
index 000000000000..8b00387f1b6f
--- /dev/null
+++ b/graphics/darktable/files/patch-src_develop_blends_blendif__lab.c
@@ -0,0 +1,18 @@
+--- src/develop/blends/blendif_lab.c.orig	2023-01-26 22:14:31 UTC
++++ src/develop/blends/blendif_lab.c
+@@ -16,15 +16,6 @@
+     along with darktable.  If not, see <http://www.gnu.org/licenses/>.
+ */
+ 
+-#if defined(__GNUC__)
+-#pragma GCC optimize("unroll-loops", "tree-loop-if-convert", "tree-loop-distribution", "no-strict-aliasing",      \
+-                     "loop-interchange", "loop-nest-optimize", "tree-loop-im", "unswitch-loops",                  \
+-                     "tree-loop-ivcanon", "ira-loop-pressure", "split-ivs-in-unroller", "tree-loop-vectorize",    \
+-                     "variable-expansion-in-unroller", "split-loops", "ivopts", "predictive-commoning",           \
+-                     "tree-loop-linear", "loop-block", "loop-strip-mine", "finite-math-only", "fp-contract=fast", \
+-                     "fast-math", "no-math-errno")
+-#endif
+-
+ #include "common/colorspaces_inline_conversions.h"
+ #include "common/imagebuf.h"
+ #include "common/math.h"
diff --git a/graphics/darktable/files/patch-src_develop_blends_blendif__raw.c b/graphics/darktable/files/patch-src_develop_blends_blendif__raw.c
new file mode 100644
index 000000000000..7adff9b17074
--- /dev/null
+++ b/graphics/darktable/files/patch-src_develop_blends_blendif__raw.c
@@ -0,0 +1,18 @@
+--- src/develop/blends/blendif_raw.c.orig	2023-01-26 22:18:41 UTC
++++ src/develop/blends/blendif_raw.c
+@@ -16,15 +16,6 @@
+     along with darktable.  If not, see <http://www.gnu.org/licenses/>.
+ */
+ 
+-#if defined(__GNUC__)
+-#pragma GCC optimize("unroll-loops", "tree-loop-if-convert", "tree-loop-distribution", "no-strict-aliasing",      \
+-                     "loop-interchange", "loop-nest-optimize", "tree-loop-im", "unswitch-loops",                  \
+-                     "tree-loop-ivcanon", "ira-loop-pressure", "split-ivs-in-unroller", "tree-loop-vectorize",    \
+-                     "variable-expansion-in-unroller", "split-loops", "ivopts", "predictive-commoning",           \
+-                     "tree-loop-linear", "loop-block", "loop-strip-mine", "finite-math-only", "fp-contract=fast", \
+-                     "fast-math", "no-math-errno")
+-#endif
+-
+ #include "common/imagebuf.h"
+ #include "common/math.h"
+ #include "develop/blend.h"
diff --git a/graphics/darktable/files/patch-src_develop_blends_blendif__rgb__hsl.c b/graphics/darktable/files/patch-src_develop_blends_blendif__rgb__hsl.c
new file mode 100644
index 000000000000..aa2beea3ffdf
--- /dev/null
+++ b/graphics/darktable/files/patch-src_develop_blends_blendif__rgb__hsl.c
@@ -0,0 +1,18 @@
+--- src/develop/blends/blendif_rgb_hsl.c.orig	2023-01-26 22:19:10 UTC
++++ src/develop/blends/blendif_rgb_hsl.c
+@@ -16,15 +16,6 @@
+     along with darktable.  If not, see <http://www.gnu.org/licenses/>.
+ */
+ 
+-#if defined(__GNUC__)
+-#pragma GCC optimize("unroll-loops", "tree-loop-if-convert", "tree-loop-distribution", "no-strict-aliasing",      \
+-                     "loop-interchange", "loop-nest-optimize", "tree-loop-im", "unswitch-loops",                  \
+-                     "tree-loop-ivcanon", "ira-loop-pressure", "split-ivs-in-unroller", "tree-loop-vectorize",    \
+-                     "variable-expansion-in-unroller", "split-loops", "ivopts", "predictive-commoning",           \
+-                     "tree-loop-linear", "loop-block", "loop-strip-mine", "finite-math-only", "fp-contract=fast", \
+-                     "fast-math", "no-math-errno")
+-#endif
+-
+ #include "common/colorspaces_inline_conversions.h"
+ #include "common/imagebuf.h"
+ #include "common/math.h"
diff --git a/graphics/darktable/files/patch-src_develop_blends_blendif__rgb__jzczhz.c b/graphics/darktable/files/patch-src_develop_blends_blendif__rgb__jzczhz.c
new file mode 100644
index 000000000000..f3198d84e67f
--- /dev/null
+++ b/graphics/darktable/files/patch-src_develop_blends_blendif__rgb__jzczhz.c
@@ -0,0 +1,18 @@
+--- src/develop/blends/blendif_rgb_jzczhz.c.orig	2023-01-26 22:19:33 UTC
++++ src/develop/blends/blendif_rgb_jzczhz.c
+@@ -16,15 +16,6 @@
+     along with darktable.  If not, see <http://www.gnu.org/licenses/>.
+ */
+ 
+-#if defined(__GNUC__)
+-#pragma GCC optimize("unroll-loops", "tree-loop-if-convert", "tree-loop-distribution", "no-strict-aliasing",      \
+-                     "loop-interchange", "loop-nest-optimize", "tree-loop-im", "unswitch-loops",                  \
+-                     "tree-loop-ivcanon", "ira-loop-pressure", "split-ivs-in-unroller", "tree-loop-vectorize",    \
+-                     "variable-expansion-in-unroller", "split-loops", "ivopts", "predictive-commoning",           \
+-                     "tree-loop-linear", "loop-block", "loop-strip-mine", "finite-math-only", "fp-contract=fast", \
+-                     "fast-math", "no-math-errno")
+-#endif
+-
+ #include "common/colorspaces_inline_conversions.h"
+ #include "common/imagebuf.h"
+ #include "develop/blend.h"
diff --git a/graphics/darktable/files/patch-src_iop_channelmixerrgb.c b/graphics/darktable/files/patch-src_iop_channelmixerrgb.c
new file mode 100644
index 000000000000..a16cc77221d5
--- /dev/null
+++ b/graphics/darktable/files/patch-src_iop_channelmixerrgb.c
@@ -0,0 +1,26 @@
+--- src/iop/channelmixerrgb.c.orig	2023-01-27 09:33:55 UTC
++++ src/iop/channelmixerrgb.c
+@@ -49,23 +49,6 @@ DT_MODULE_INTROSPECTION(3, dt_iop_channelmixer_rgb_par
+ 
+ DT_MODULE_INTROSPECTION(3, dt_iop_channelmixer_rgb_params_t)
+ 
+-/** Note :
+- * we use finite-math-only and fast-math because divisions by zero are manually avoided in the code
+- * fp-contract=fast enables hardware-accelerated Fused Multiply-Add
+- * the rest is loop reorganization and vectorization optimization
+- **/
+-#if defined(__GNUC__)
+-#pragma GCC optimize ("unroll-loops", "tree-loop-if-convert", \
+-                      "tree-loop-distribution", "no-strict-aliasing", \
+-                      "loop-interchange", "loop-nest-optimize", "tree-loop-im", \
+-                      "unswitch-loops", "tree-loop-ivcanon", "ira-loop-pressure", \
+-                      "split-ivs-in-unroller", "variable-expansion-in-unroller", \
+-                      "split-loops", "ivopts", "predictive-commoning",\
+-                      "tree-loop-linear", "loop-block", "loop-strip-mine", \
+-                      "finite-math-only", "fp-contract=fast", "fast-math", \
+-                      "tree-vectorize", "no-math-errno")
+-#endif
+-
+ 
+ #define CHANNEL_SIZE 4
+ #define INVERSE_SQRT_3 0.5773502691896258f
diff --git a/graphics/darktable/files/patch-src_iop_filmicrgb.c b/graphics/darktable/files/patch-src_iop_filmicrgb.c
new file mode 100644
index 000000000000..40e16290108b
--- /dev/null
+++ b/graphics/darktable/files/patch-src_iop_filmicrgb.c
@@ -0,0 +1,24 @@
+--- src/iop/filmicrgb.c.orig	2023-01-27 09:19:36 UTC
++++ src/iop/filmicrgb.c
+@@ -94,21 +94,6 @@ DT_MODULE_INTROSPECTION(6, dt_iop_filmicrgb_params_t)
+  * */
+ 
+ 
+-/** Note :
+- * we use finite-math-only and fast-math because divisions by zero are manually avoided in the code
+- * fp-contract=fast enables hardware-accelerated Fused Multiply-Add
+- * the rest is loop reorganization and vectorization optimization
+- **/
+-#if defined(__GNUC__)
+-#pragma GCC optimize("unroll-loops", "tree-loop-if-convert", "tree-loop-distribution", "no-strict-aliasing",      \
+-                     "loop-interchange", "loop-nest-optimize", "tree-loop-im", "unswitch-loops",                  \
+-                     "tree-loop-ivcanon", "ira-loop-pressure", "split-ivs-in-unroller",                           \
+-                     "variable-expansion-in-unroller", "split-loops", "ivopts", "predictive-commoning",           \
+-                     "tree-loop-linear", "loop-block", "loop-strip-mine", "finite-math-only", "fp-contract=fast", \
+-                     "fast-math", "no-math-errno")
+-#endif
+-
+-
+ typedef enum dt_iop_filmicrgb_methods_type_t
+ {
+   DT_FILMIC_METHOD_NONE = 0,              // $DESCRIPTION: "no"
diff --git a/graphics/darktable/files/patch-src_iop_negadoctor.c b/graphics/darktable/files/patch-src_iop_negadoctor.c
new file mode 100644
index 000000000000..6b27db770ffb
--- /dev/null
+++ b/graphics/darktable/files/patch-src_iop_negadoctor.c
@@ -0,0 +1,20 @@
+--- src/iop/negadoctor.c.orig	2023-01-27 09:34:21 UTC
++++ src/iop/negadoctor.c
+@@ -40,17 +40,6 @@
+ #include <math.h>
+ #include <stdlib.h>
+ 
+-#if defined(__GNUC__)
+-#pragma GCC optimize ("unroll-loops", "tree-loop-if-convert", \
+-                      "tree-loop-distribution", "no-strict-aliasing", \
+-                      "loop-interchange", "loop-nest-optimize", "tree-loop-im", \
+-                      "unswitch-loops", "tree-loop-ivcanon", "ira-loop-pressure", \
+-                      "split-ivs-in-unroller", "variable-expansion-in-unroller", \
+-                      "split-loops", "ivopts", "predictive-commoning",\
+-                      "tree-loop-linear", "loop-block", "loop-strip-mine", \
+-                      "finite-math-only", "fp-contract=fast", "fast-math")
+-#endif
+-
+ /** DOCUMENTATION
+  *
+  * This module allows to invert scanned negatives and simulate their print on paper, based on Kodak Cineon