From 6d8aa8582f5c312cd5aab396f90904df1ddc0567 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= <rverschelde@gmail.com>
Date: Mon, 15 Sep 2025 23:43:13 +0200
Subject: [PATCH] Linux: Allow unbundling libjpeg-turbo to use system package

---
 modules/jpg/SCsub           | 182 ++++++++++++++++++------------------
 platform/linuxbsd/detect.py |   3 +
 2 files changed, 93 insertions(+), 92 deletions(-)

diff --git a/modules/jpg/SCsub b/modules/jpg/SCsub
index e5b1bc19c0b9..a45b5eff33f1 100644
--- a/modules/jpg/SCsub
+++ b/modules/jpg/SCsub
@@ -8,98 +8,96 @@ env_jpg = env_modules.Clone()
 
 thirdparty_obj = []
 
-thirdparty_dir = "#thirdparty/libjpeg-turbo"
-
-thirdparty_sources_common = [
-    "jaricom.c",
-    "jcapimin.c",
-    "jcarith.c",
-    "jchuff.c",
-    "jcicc.c",
-    "jcinit.c",
-    "jcmarker.c",
-    "jcmaster.c",
-    "jcomapi.c",
-    "jcparam.c",
-    "jcphuff.c",
-    "jctrans.c",
-    "jdapimin.c",
-    "jdarith.c",
-    "jdatadst.c",
-    "jdatadst-tj.c",
-    "jdatasrc.c",
-    "jdatasrc-tj.c",
-    "jdhuff.c",
-    "jdicc.c",
-    "jdinput.c",
-    "jdmarker.c",
-    "jdmaster.c",
-    "jdphuff.c",
-    "jdtrans.c",
-    "jerror.c",
-    "jfdctflt.c",
-    "jmemmgr.c",
-    "jmemnobs.c",
-    "jpeg_nbits.c",
-    "transupp.c",
-    "turbojpeg.c",
-]
-
-thirdparty_sources_bit_dependent = [
-    "jcapistd.c",
-    "jccoefct.c",
-    "jccolor.c",
-    "jcdctmgr.c",
-    "jcmainct.c",
-    "jcprepct.c",
-    "jcsample.c",
-    "jdcoefct.c",
-    "jdcolor.c",
-    "jdapistd.c",
-    "jddctmgr.c",
-    "jdmainct.c",
-    "jdmerge.c",
-    "jdpostct.c",
-    "jdsample.c",
-    "jfdctfst.c",
-    "jfdctint.c",
-    "jidctflt.c",
-    "jidctfst.c",
-    "jidctint.c",
-    "jidctred.c",
-    "jutils.c",
-    "jquant1.c",
-    "jquant2.c",
-]
-
-thirdparty_sources_by_bits = {
-    8: list(thirdparty_sources_bit_dependent),
-    12: list(thirdparty_sources_bit_dependent),
-}
-
-
-def source_paths(files):
-    return [thirdparty_dir + "/src/" + f for f in files]
-
-
-env_jpg.Prepend(CPPEXTPATH=[thirdparty_dir + "/src"])
-
-
-def add_bit_depth(bit_depth: int):
-    env_bit_depth = env_jpg.Clone()
-    env_bit_depth.disable_warnings()
-    env_bit_depth["OBJSUFFIX"] = f"_{bit_depth}{env_bit_depth['OBJSUFFIX']}"
-    env_bit_depth.Append(CPPDEFINES=[f"BITS_IN_JSAMPLE={bit_depth}"])
-    env_bit_depth.add_source_files(thirdparty_obj, source_paths(thirdparty_sources_by_bits[bit_depth]))
-
-
-add_bit_depth(8)
-add_bit_depth(12)
-
-env_thirdparty = env_jpg.Clone()
-env_thirdparty.disable_warnings()
-env_thirdparty.add_source_files(thirdparty_obj, source_paths(thirdparty_sources_common))
-env.modules_sources += thirdparty_obj
+if env["builtin_libjpeg_turbo"]:
+    thirdparty_dir = "#thirdparty/libjpeg-turbo"
+
+    thirdparty_sources_common = [
+        "jaricom.c",
+        "jcapimin.c",
+        "jcarith.c",
+        "jchuff.c",
+        "jcicc.c",
+        "jcinit.c",
+        "jcmarker.c",
+        "jcmaster.c",
+        "jcomapi.c",
+        "jcparam.c",
+        "jcphuff.c",
+        "jctrans.c",
+        "jdapimin.c",
+        "jdarith.c",
+        "jdatadst.c",
+        "jdatadst-tj.c",
+        "jdatasrc.c",
+        "jdatasrc-tj.c",
+        "jdhuff.c",
+        "jdicc.c",
+        "jdinput.c",
+        "jdmarker.c",
+        "jdmaster.c",
+        "jdphuff.c",
+        "jdtrans.c",
+        "jerror.c",
+        "jfdctflt.c",
+        "jmemmgr.c",
+        "jmemnobs.c",
+        "jpeg_nbits.c",
+        "transupp.c",
+        "turbojpeg.c",
+    ]
+
+    thirdparty_sources_bit_dependent = [
+        "jcapistd.c",
+        "jccoefct.c",
+        "jccolor.c",
+        "jcdctmgr.c",
+        "jcmainct.c",
+        "jcprepct.c",
+        "jcsample.c",
+        "jdcoefct.c",
+        "jdcolor.c",
+        "jdapistd.c",
+        "jddctmgr.c",
+        "jdmainct.c",
+        "jdmerge.c",
+        "jdpostct.c",
+        "jdsample.c",
+        "jfdctfst.c",
+        "jfdctint.c",
+        "jidctflt.c",
+        "jidctfst.c",
+        "jidctint.c",
+        "jidctred.c",
+        "jutils.c",
+        "jquant1.c",
+        "jquant2.c",
+    ]
+
+    thirdparty_sources_by_bits = {
+        8: list(thirdparty_sources_bit_dependent),
+        12: list(thirdparty_sources_bit_dependent),
+    }
+
+    def source_paths(files):
+        return [thirdparty_dir + "/src/" + f for f in files]
+
+    env_jpg.Prepend(CPPEXTPATH=[thirdparty_dir + "/src"])
+
+    def add_bit_depth(bit_depth: int):
+        env_bit_depth = env_jpg.Clone()
+        env_bit_depth.disable_warnings()
+        env_bit_depth["OBJSUFFIX"] = f"_{bit_depth}{env_bit_depth['OBJSUFFIX']}"
+        env_bit_depth.Append(CPPDEFINES=[f"BITS_IN_JSAMPLE={bit_depth}"])
+        env_bit_depth.add_source_files(thirdparty_obj, source_paths(thirdparty_sources_by_bits[bit_depth]))
+
+    add_bit_depth(8)
+    add_bit_depth(12)
+
+    env_thirdparty = env_jpg.Clone()
+    env_thirdparty.disable_warnings()
+    env_thirdparty.add_source_files(thirdparty_obj, source_paths(thirdparty_sources_common))
+    env.modules_sources += thirdparty_obj
+
 
 # Godot source files
 
diff --git a/platform/linuxbsd/detect.py b/platform/linuxbsd/detect.py
index df4dbddedd36..fbb3cdf1f13c 100644
--- a/platform/linuxbsd/detect.py
+++ b/platform/linuxbsd/detect.py
@@ -278,6 +278,9 @@ def configure(env: "SConsEnvironment"):
     if not env["builtin_libwebp"]:
         env.ParseConfig("pkg-config libwebp --cflags --libs")
 
+    if not env["builtin_libjpeg_turbo"]:
+        env.ParseConfig("pkg-config libturbojpeg --cflags --libs")
+
     if not env["builtin_mbedtls"]:
         # mbedTLS only provides a pkgconfig file since 3.6.0, but we still support 2.28.x,
         # so fallback to manually specifying LIBS if it fails.
