Repository.mk                           |    1 
 config_host.mk.in                       |    3 +
 configure.ac                            |   56 ++++++++++++++++++++++++++++++++
 solenv/gbuild/CppunitTest.mk            |    2 +
 solenv/gbuild/Executable.mk             |    2 +
 solenv/gbuild/Library.mk                |    2 +
 solenv/gbuild/LinkTarget.mk             |   52 +++++++++++++++++++++++++----
 solenv/gbuild/PrecompiledHeaders.mk     |    4 +-
 solenv/gbuild/StaticLibrary.mk          |    2 +
 solenv/gbuild/platform/com_GCC_class.mk |   20 +++++++++--
 solenv/gbuild/platform/com_MSC_class.mk |   14 ++++----
 solenv/qa/python/gbuildtojson.py        |    1 
 12 files changed, 139 insertions(+), 20 deletions(-)

New commits:
commit 003065327cf032942f69d857921a7b42c1bd30b7
Author:     Luboš Luňák <[email protected]>
AuthorDate: Fri Apr 17 11:34:25 2020 +0200
Commit:     Michael Stahl <[email protected]>
CommitDate: Fri Nov 14 14:11:58 2025 +0100

    prefer building Skia with Clang if possible (tdf#131697)
    
    I.e. try to find and use Clang even if the default compiler is
    something else. Skia is optimized to be built with Clang(-cl)
    and in CPU-based raster mode some operations are several times
    slower if built with something else (e.g. fmax/fmin do not get
    optimized to inline assembly).
    It is enough to select Clang to be installed in the MSVS installer.
    At this point it unclear how to handle release binaries, if it
    should work this way and enforced, or maybe Clang could be used
    for building everything, or maybe some other way.
    
    Conflicts:
            configure.ac
            fpicker/fix-sse.patch.1
            solenv/gbuild/LinkTarget.mk
    
    Change-Id: I6b95a0f2d5cbf176942d9e01136990b14be6dba8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92415
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <[email protected]>
    (cherry picked from commit 647499ef8151d9383983f89230a970edcb44b5bb)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193975
    Tested-by: allotropia jenkins <[email protected]>
    Reviewed-by: Michael Stahl <[email protected]>

diff --git a/config_host.mk.in b/config_host.mk.in
index 8d8f444ba861..edbe271480a1 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -64,6 +64,8 @@ export CCACHE_DEPEND_MODE=@CCACHE_DEPEND_MODE@
 export CDR_CFLAGS=$(gb_SPACE)@CDR_CFLAGS@
 export CDR_LIBS=$(gb_SPACE)@CDR_LIBS@
 @x_CFLAGS@ export CFLAGS=@CFLAGS@
+export CLANG_C=@CLANG_C@
+export CLANG_CXX=@CLANG_CXX@
 export CLANGDIR=@CLANGDIR@
 export CLANGLIBDIR=@CLANGLIBDIR@
 export CLANGSYSINCLUDE=@CLANGSYSINCLUDE@
diff --git a/configure.ac b/configure.ac
index 4cf041af2e51..e149b8efd232 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10935,6 +10935,47 @@ AC_SUBST(SYSTEM_POPPLER)
 AC_SUBST(POPPLER_CFLAGS)
 AC_SUBST(POPPLER_LIBS)
 
+if test "$ENABLE_PDFIUM" = TRUE -a "$COM_IS_CLANG" != TRUE; then
+    if test -n "$CLANG_C" -a -n "$CLANG_CXX"; then
+        AC_MSG_CHECKING([for Clang])
+        AC_MSG_RESULT([$CLANG_C / $CLANG_CXX])
+    else
+        if test "$_os" = "WINNT"; then
+            AC_MSG_CHECKING([for clang-cl])
+            if test -x "$VC_PRODUCT_DIR/Tools/Llvm/bin/clang-cl.exe"; then
+                CLANG_C=`win_short_path_for_make 
"$VC_PRODUCT_DIR/Tools/Llvm/bin/clang-cl.exe"`
+                if test "$BITNESS_OVERRIDE" = ""; then
+                    dnl match our MSVC default
+                    CLANG_C="$CLANG_C -arch:SSE"
+                fi
+                CLANG_CXX="$CLANG_C"
+                AC_MSG_RESULT([$CLANG_C])
+            else
+                AC_MSG_RESULT([no])
+            fi
+        else
+            AC_CHECK_PROG(CLANG_C,clang,clang,[])
+            AC_CHECK_PROG(CLANG_CXX,clang++,clang++,[])
+        fi
+    fi
+    if test -n "$CLANG_C" -a -n "$CLANG_CXX"; then
+        clang2_version=`echo 
__clang_major__.__clang_minor__.__clang_patchlevel__ | $CLANG_C -E - | tail -1 
| sed 's/ //g'`
+        clang2_ver=`echo "$clang2_version" | $AWK -F. '{ print 
\$1*10000+(\$2<100?\$2:99)*100+(\$3<100?\$3:99) }'`
+        if test "$clang2_ver" -lt 50002; then
+            AC_MSG_WARN(["$clang2_version" is too old or unrecognized, must be 
at least Clang 5.0.2])
+            CLANG_C=
+            CLANG_CXX=
+        fi
+    fi
+    if test -z "$CLANG_C" -o -z "$CLANG_CXX"; then
+        # So far do not require this, but release builds with Skia should 
possibly
+        # do so.
+        AC_MSG_WARN([Clang compiler not found.])
+    fi
+fi
+AC_SUBST(CLANG_C)
+AC_SUBST(CLANG_CXX)
+
 SYSTEM_GPGMEPP=
 
 if test "$build_for_ios" = "YES"; then
diff --git a/solenv/gbuild/CppunitTest.mk b/solenv/gbuild/CppunitTest.mk
index f2a267e3e04b..2c034f62df92 100644
--- a/solenv/gbuild/CppunitTest.mk
+++ b/solenv/gbuild/CppunitTest.mk
@@ -475,5 +475,7 @@ gb_CppunitTest_set_warnings_not_errors = $(call 
gb_CppunitTest__forward_to_Linkt
 gb_CppunitTest_set_warnings_disabled = $(call 
gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 gb_CppunitTest_set_external_code = $(call 
gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 gb_CppunitTest_set_generated_cxx_suffix = $(call 
gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_clang = $(call 
gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_clang_precompiled_header = $(call 
gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 
 # vim: set noet sw=4:
diff --git a/solenv/gbuild/Executable.mk b/solenv/gbuild/Executable.mk
index 74b011a311b6..c5ffa1a9a07c 100644
--- a/solenv/gbuild/Executable.mk
+++ b/solenv/gbuild/Executable.mk
@@ -150,6 +150,8 @@ gb_Executable_set_warnings_not_errors = $(call 
gb_Executable__forward_to_Linktar
 gb_Executable_set_warnings_disabled = $(call 
gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 gb_Executable_set_external_code = $(call 
gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 gb_Executable_set_generated_cxx_suffix = $(call 
gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_clang = $(call 
gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_set_clang_precompiled_header = $(call 
gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 
 # Run-time use
 
diff --git a/solenv/gbuild/Library.mk b/solenv/gbuild/Library.mk
index 9680a7b75de3..9fdade01f510 100644
--- a/solenv/gbuild/Library.mk
+++ b/solenv/gbuild/Library.mk
@@ -236,5 +236,7 @@ gb_Library_set_warnings_not_errors = $(call 
gb_Library__forward_to_Linktarget,$(
 gb_Library_set_warnings_disabled = $(call 
gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 gb_Library_set_external_code = $(call 
gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 gb_Library_set_generated_cxx_suffix = $(call 
gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_clang = $(call 
gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_clang_precompiled_header = $(call 
gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 
 # vim: set noet sw=4:
diff --git a/solenv/gbuild/LinkTarget.mk b/solenv/gbuild/LinkTarget.mk
index f964a26f2266..1160349e4830 100644
--- a/solenv/gbuild/LinkTarget.mk
+++ b/solenv/gbuild/LinkTarget.mk
@@ -237,7 +237,7 @@ $(call gb_CObject_get_target,%) : $(call 
gb_CObject_get_source,$(SRCDIR),%) $(gb
 else
 $(call gb_CObject_get_target,%) : $(call gb_CObject_get_source,$(SRCDIR),%)
        $(call gb_Output_announce,$*.c,$(true),$(if $(COMPILER_TEST),C? ,C  ),3)
-       $(call gb_CObject__command_pattern,$@,$(T_CFLAGS) 
$(T_CFLAGS_APPEND),$<,$(call 
gb_CObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_SYMBOLS))
+       $(call gb_CObject__command_pattern,$@,$(T_CFLAGS) 
$(T_CFLAGS_APPEND),$<,$(call 
gb_CObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_SYMBOLS),$(T_C))
 endif
 
 # Note: if the *Object_dep_target does not exist it will be created by
@@ -295,7 +295,7 @@ else
 $(call gb_CxxObject_get_target,%) : $(call gb_CxxObject_get_source,$(SRCDIR),%)
        $(call gb_Output_announce,$*.cxx,$(true),$(if 
$(COMPILER_TEST),CPT,CXX),3)
        $(eval $(gb_CxxObject__set_pchflags))
-       $(call gb_CObject__command_pattern,$@,$(T_CXXFLAGS) 
$(T_CXXFLAGS_APPEND) $(if $(COMPILER_TEST),$(gb_COMPILER_TEST_FLAGS)),$<,$(call 
gb_CxxObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_SYMBOLS))
+       $(call gb_CObject__command_pattern,$@,$(T_CXXFLAGS) 
$(T_CXXFLAGS_APPEND) $(if $(COMPILER_TEST),$(gb_COMPILER_TEST_FLAGS)),$<,$(call 
gb_CxxObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_SYMBOLS),$(T_CXX))
 endif
 
 ifeq ($(gb_FULLDEPS),$(true))
@@ -318,7 +318,7 @@ gb_GenCObject_get_source = $(WORKDIR)/$(1).c
 $(call gb_GenCObject_get_target,%) : $(gb_FORCE_COMPILE_ALL_TARGET)
        $(call gb_Output_announce,$*.c,$(true),C  ,3)
        test -f $(call gb_GenCObject_get_source,$*) || (echo "Missing generated 
source file $(call gb_GenCObject_get_source,$*)" && false)
-       $(call gb_CObject__command_pattern,$@,$(T_CFLAGS) 
$(T_CFLAGS_APPEND),$(call gb_GenCObject_get_source,$*),$(call 
gb_GenCObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_SYMBOLS))
+       $(call gb_CObject__command_pattern,$@,$(T_CFLAGS) 
$(T_CFLAGS_APPEND),$(call gb_GenCObject_get_source,$*),$(call 
gb_GenCObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_SYMBOLS),$(T_C))
 
 ifeq ($(gb_FULLDEPS),$(true))
 $(dir $(call gb_GenCObject_get_dep_target,%)).dir :
@@ -341,7 +341,7 @@ $(call gb_GenCxxObject_get_target,%) : 
$(gb_FORCE_COMPILE_ALL_TARGET)
        $(call gb_Output_announce,$(subst 
$(BUILDDIR)/,,$(GEN_CXX_SOURCE)),$(true),CXX,3)
        test -f $(GEN_CXX_SOURCE) || (echo "Missing generated source file 
$(GEN_CXX_SOURCE)" && false)
        $(eval $(gb_CxxObject__set_pchflags))
-       $(call gb_CObject__command_pattern,$@,$(T_CXXFLAGS) 
$(T_CXXFLAGS_APPEND),$(GEN_CXX_SOURCE),$(call 
gb_GenCxxObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_SYMBOLS))
+       $(call gb_CObject__command_pattern,$@,$(T_CXXFLAGS) 
$(T_CXXFLAGS_APPEND),$(GEN_CXX_SOURCE),$(call 
gb_GenCxxObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_SYMBOLS),$(T_CXX))
 
 ifeq ($(gb_FULLDEPS),$(true))
 $(dir $(call gb_GenCxxObject_get_dep_target,%)).dir :
@@ -804,6 +804,8 @@ $(call gb_LinkTarget_get_target,$(1)) : EXTERNAL_CODE :=
 $(call gb_LinkTarget_get_target,$(1)) : SOVERSIONSCRIPT :=
 $(call gb_LinkTarget_get_target,$(1)) : COMPILER_TEST :=
 $(call gb_LinkTarget_get_target,$(1)) : T_SYMBOLS := $(if $(call 
gb_LinkTarget__symbols_enabled,$(2)),$(true),$(false))
+$(call gb_LinkTarget_get_target,$(1)) : T_C :=
+$(call gb_LinkTarget_get_target,$(1)) : T_CXX :=
 
 ifeq ($(gb_FULLDEPS),$(true))
 ifeq (depcache:,$(filter depcache,$(.FEATURES)):$(gb_PARTIAL_BUILD))
@@ -1570,15 +1572,24 @@ endif
 
 endef
 
-# call 
gb_LinkTarget_set_precompiled_header,linktarget,pchcxxfile,,linktargetmakefilename
+# 'compiler' set comes only from gb_LinkTarget_set_clang_precompiled_header
+# call 
gb_LinkTarget_set_precompiled_header,linktarget,pchcxxfile,,linktargetmakefilename,compiler
 define gb_LinkTarget_set_precompiled_header
 ifneq ($(gb_ENABLE_PCH),)
 $(call gb_LinkTarget__set_precompiled_header_impl,$(1),$(2),$(notdir 
$(2)),$(4))
-$(call gb_PrecompiledHeader_generate_rules,$(notdir $(2)),$(1),$(4),$(2))
+$(call gb_PrecompiledHeader_generate_rules,$(notdir $(2)),$(1),$(4),$(2),$(5))
 endif
 
 endef
 
+# It seems complicated to forward the clang setting to the PCH rules, so use 
an extra
+# function to set it manually. This variant should be used if 
gb_LinkTarget_use_clang is used.
+# call 
gb_LinkTarget_set_clang_precompiled_header,linktarget,pchcxxfile,,linktargetmakefilename
+define gb_LinkTarget_set_clang_precompiled_header
+$(call gb_LinkTarget_set_precompiled_header,$(1),$(2),$(3),$(4),$(CLANG_CXX))
+
+endef
+
 # call 
gb_LinkTarget__reuse_precompiled_header_impl,linktarget,pchcxxfile,pchtarget,linktargetmakefilename
 # Use the PCH as if it was LinkTarget's own, but do nothing with the PCH 
itself, just depend on it.
 define gb_LinkTarget__reuse_precompiled_header_impl
@@ -1723,4 +1734,13 @@ gb_LinkTarget_CXX_SUFFIX_$(call 
gb_LinkTarget__get_workdir_linktargetname,$(1))
 
 endef
 
+# C/C++ files will be build with Clang (if possible) instead of the default 
compiler.
+# call gb_LinkTarget_use_clang,linktarget,,linktargetmakefilename
+define gb_LinkTarget_use_clang
+$(call gb_LinkTarget_get_target,$(1)) : T_C := $(CLANG_C)
+$(call gb_LinkTarget_get_target,$(1)) : T_CXX := $(CLANG_CXX)
+
+endef
+
+
 # vim: set noet sw=4:
diff --git a/solenv/gbuild/PrecompiledHeaders.mk 
b/solenv/gbuild/PrecompiledHeaders.mk
index 86e016ccaa61..52941cd56185 100644
--- a/solenv/gbuild/PrecompiledHeaders.mk
+++ b/solenv/gbuild/PrecompiledHeaders.mk
@@ -29,7 +29,7 @@ gb_PrecompiledHeader__get_debugdir = $(if $(call 
gb_LinkTarget__symbols_enabled,
 # for $(1)'s and things that are constant.
 # The defines are needed to get the right version of 
gb_PrecompiledHeader__get_debugdir.
 
-# $(call 
gb_PrecompiledHeader_generate_rules,pchtarget,linktarget,linktargetmakefilename,pchcxxfile)
+# $(call 
gb_PrecompiledHeader_generate_rules,pchtarget,linktarget,linktargetmakefilename,pchcxxfile,compiler)
 define gb_PrecompiledHeader_generate_rules
 
 $(call gb_PrecompiledHeader_get_dep_target,$(1),$(3)) :
@@ -43,7 +43,7 @@ $(call gb_PrecompiledHeader_get_target,$(1),$(3)) :
        test "$$(PCH_LINKTARGETMAKEFILENAME)" = "$(3)" \
                 || ( echo "Error, PCH $(1) built by 
$$(PCH_LINKTARGETMAKEFILENAME) instead of $(3)" >&2; exit 1)
        rm -f $$@
-       $$(call 
gb_PrecompiledHeader__command,$$@,$(1),$$<,$$(PCH_DEFS),$$(PCH_CXXFLAGS) 
$$(gb_PrecompiledHeader_EXCEPTIONFLAGS),$$(INCLUDE),$(3))
+       $$(call 
gb_PrecompiledHeader__command,$$@,$(1),$$<,$$(PCH_DEFS),$$(PCH_CXXFLAGS) 
$$(gb_PrecompiledHeader_EXCEPTIONFLAGS),$$(INCLUDE),$(3),$(5))
        $$(call 
gb_PrecompiledHeader__sum_command,$$@,$(1),$$<,$$(PCH_DEFS),$$(PCH_CXXFLAGS) 
$$(gb_PrecompiledHeader_EXCEPTIONFLAGS),$$(INCLUDE),$(3))
        echo $$(sort $$(PCH_DEFS) $$(PCH_CXXFLAGS) 
$$(gb_PrecompiledHeader_EXCEPTIONFLAGS)) > $$(call 
gb_PrecompiledHeader_get_target,$(1),$(3)).flags
 ifeq ($(gb_FULLDEPS),$(true))
diff --git a/solenv/gbuild/StaticLibrary.mk b/solenv/gbuild/StaticLibrary.mk
index b69b9595e976..ec1c06282788 100644
--- a/solenv/gbuild/StaticLibrary.mk
+++ b/solenv/gbuild/StaticLibrary.mk
@@ -120,5 +120,7 @@ gb_StaticLibrary_set_warnings_not_errors = $(call 
gb_StaticLibrary__forward_to_L
 gb_StaticLibrary_set_warnings_disabled = $(call 
gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 gb_StaticLibrary_set_external_code = $(call 
gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 gb_StaticLibrary_set_generated_cxx_suffix = $(call 
gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_clang = $(call 
gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_set_clang_precompiled_header = $(call 
gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
 
 # vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/com_GCC_class.mk 
b/solenv/gbuild/platform/com_GCC_class.mk
index 8d70ce894b32..616dcb8baf8d 100644
--- a/solenv/gbuild/platform/com_GCC_class.mk
+++ b/solenv/gbuild/platform/com_GCC_class.mk
@@ -52,13 +52,20 @@ endef
 
 # CObject class
 
-# $(call 
gb_CObject__command_pattern,object,flags,source,dep-file,compiler-plugins,symbols)
+# $(call gb_CObject__compiler,source,compiler)
+define gb_CObject__compiler
+       $(if $(filter %.c %.m,$(1)), \
+               $(if $(2), $(2), $(gb_CC)), \
+               $(if $(2), $(2), $(gb_CXX)))
+endef
+
+# $(call 
gb_CObject__command_pattern,object,flags,source,dep-file,compiler-plugins,symbols,compiler)
 define gb_CObject__command_pattern
 $(call gb_Helper_abbreviate_dirs,\
        mkdir -p $(dir $(1)) $(dir $(4)) && cd $(SRCDIR) && \
        $(gb_COMPILER_SETUP) \
        $(if $(5),$(gb_COMPILER_PLUGINS_SETUP)) \
-       $(if $(filter %.c %.m,$(3)), $(gb_CC), $(gb_CXX)) \
+       $(call gb_CObject__compiler,$(3),$(7)) \
                $(DEFS) \
                $(gb_LTOFLAGS) \
                $(if $(VISIBILITY),,$(gb_VISIBILITY_FLAGS)) \
@@ -101,7 +108,7 @@ $(call gb_Helper_abbreviate_dirs,\
        mkdir -p $(dir $(1)) $(dir $(call 
gb_PrecompiledHeader_get_dep_target,$(2),$(7))) && \
        cd $(BUILDDIR)/ && \
        CCACHE_DISABLE=1 $(gb_COMPILER_SETUP) \
-       $(gb_CXX) \
+       $(if $(8),$(8),$(gb_CXX)) \
                -x c++-header \
                $(4) $(5) \
                $(if $(WARNINGS_DISABLED),$(gb_CXXFLAGS_DISABLE_WARNINGS)) \
diff --git a/solenv/gbuild/platform/com_MSC_class.mk 
b/solenv/gbuild/platform/com_MSC_class.mk
index cdb1711f9172..c9c5ca033619 100644
--- a/solenv/gbuild/platform/com_MSC_class.mk
+++ b/solenv/gbuild/platform/com_MSC_class.mk
@@ -34,13 +34,15 @@ endef
 
 # CObject class
 
-# $(call gb_CObject__compiler,flags,source)
+# $(call gb_CObject__compiler,flags,source,compiler)
 define gb_CObject__compiler
        $(if $(filter YES,$(LIBRARY_X64)), $(CXX_X64_BINARY), \
                $(if $(filter YES,$(PE_X86)), $(CXX_X86_BINARY), \
-                       $(if $(filter %.c,$(2)), $(gb_CC), \
+                       $(if $(filter %.c,$(2)), \
+                               $(if $(3), $(3), $(gb_CC)), \
                                $(if $(filter -clr,$(1)), \
-                                       $(MSVC_CXX) 
-I$(SRCDIR)/solenv/clang-cl,$(gb_CXX)))))
+                                       $(MSVC_CXX) -I$(SRCDIR)/solenv/clang-cl,
+                                               $(if $(3), $(3), $(gb_CXX))))))
 endef
 
 # Avoid annoying warning D9025 about overriding command-line arguments.
@@ -50,12 +52,12 @@ gb_Helper_remove_overridden_flags = \
     $(lastword $(filter -Od -O2,$(1))) \
     $(lastword $(filter -arch:SSE -arch:SSE2 -arch:AVX -arch:AVX2,$(1)))
 
-# $(call 
gb_CObject__command_pattern,object,flags,source,dep-file,compiler-plugins,symbols)
+# $(call 
gb_CObject__command_pattern,object,flags,source,dep-file,compiler-plugins,symbols,compiler)
 define gb_CObject__command_pattern
 $(call gb_Helper_abbreviate_dirs,\
        mkdir -p $(dir $(1)) $(dir $(4)) && \
        unset INCLUDE && \
-       $(filter-out -arch:SSE,$(call gb_CObject__compiler,$(2),$(3))) \
+       $(filter-out -arch:SSE,$(call gb_CObject__compiler,$(2),$(3),$(7))) \
                $(DEFS) \
                $(gb_LTOFLAGS) \
                $(call gb_Helper_remove_overridden_flags,$(filter 
-arch:SSE,$(call gb_CObject__compiler,$(2),$(3))) \
@@ -94,7 +96,7 @@ $(call gb_Output_announce,$(2),$(true),PCH,1)
 $(call gb_Helper_abbreviate_dirs,\
        mkdir -p $(dir $(1)) $(dir $(call 
gb_PrecompiledHeader_get_dep_target,$(2),$(7))) && \
        unset INCLUDE && \
-       $(filter-out -arch:SSE,$(call gb_CObject__compiler,$(4) $(5),$(3))) \
+       $(filter-out -arch:SSE,$(call gb_CObject__compiler,$(4) 
$(5),$(3),$(8))) \
                $(call gb_Helper_remove_overridden_flags,$(filter 
-arch:SSE,$(call gb_CObject__compiler,$(4) $(5),$(3))) \
                        $(4) $(5) $(if 
$(WARNINGS_DISABLED),$(gb_CXXFLAGS_DISABLE_WARNINGS))) \
                -Fd$(PDBFILE) \
commit 5de9aea610af3895847f3719b9e08dd0e138473b
Author:     Luboš Luňák <[email protected]>
AuthorDate: Sat Jun 22 15:09:39 2019 +0200
Commit:     Michael Stahl <[email protected]>
CommitDate: Fri Nov 14 14:11:49 2025 +0100

    add support for Clang's -building-pch-with-obj
    
    This marks the PCH as having an accompanying object file, and
    this object file needs to be also built, but this allows the compiler
    to skip generating stuff that'd be shared by all the objects using
    the PCH. Currently it doesn't make much of a difference, few symbols
    if any, but template instantiations could be shared this way, as
    soon as Clang gets the necessary support (my WIP patch).
    
    Change-Id: Ib1b86338d85a47b48979558435253dc2672a0da8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87009
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <[email protected]>
    (cherry picked from commit 7162d047941c721577b8719323fce7f3be5212fc)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193974
    Tested-by: allotropia jenkins <[email protected]>
    Reviewed-by: Michael Stahl <[email protected]>

diff --git a/Repository.mk b/Repository.mk
index 8175a7ceb8f5..294cd1d30b6c 100644
--- a/Repository.mk
+++ b/Repository.mk
@@ -543,6 +543,7 @@ $(eval $(call gb_Helper_register_libraries,PLAINLIBS_NONE, \
        scqahelper \
        unowinreg \
        wpftqahelper \
+       precompiled_system \
        $(if $(filter MSC,$(COM)),cli_cppuhelper) \
        $(if $(filter $(OS),ANDROID),lo-bootstrap) \
        $(if $(filter $(OS),MACOSX),OOoSpotlightImporter) \
diff --git a/config_host.mk.in b/config_host.mk.in
index 4ebff11ed165..8d8f444ba861 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -54,6 +54,7 @@ export BUILD_UNOWINREG=@BUILD_UNOWINREG@
 export BUILD_VER_STRING=@BUILD_VER_STRING@
 export BUILD_X64=@BUILD_X64@
 export BUILD_X86=@BUILD_X86@
+export BUILDING_PCH_WITH_OBJ=@BUILDING_PCH_WITH_OBJ@
 export BZIP2_CFLAGS=$(gb_SPACE)@BZIP2_CFLAGS@
 export BZIP2_LIBS=$(gb_SPACE)@BZIP2_LIBS@
 export CAIRO_CFLAGS=$(gb_SPACE)@CAIRO_CFLAGS@
diff --git a/configure.ac b/configure.ac
index f7774320d5a5..4cf041af2e51 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5173,6 +5173,21 @@ if test -n "$ENABLE_PCH" -a -n "$CCACHE_DEPEND_MODE" -a 
"$GCC" = "yes" -a "$COM_
     fi
 fi
 
+BUILDING_PCH_WITH_OBJ=
+if test -n "$ENABLE_PCH"; then
+    AC_MSG_CHECKING([whether $CC supports -Xclang -building-pch-with-obj])
+    save_CFLAGS=$CFLAGS
+    CFLAGS="$CFLAGS -Werror -Xclang -building-pch-with-obj"
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ return 0; ]])],[ 
BUILDING_PCH_WITH_OBJ="-Xclang -building-pch-with-obj" ],[])
+    CFLAGS=$save_CFLAGS
+    if test -n "$BUILDING_PCH_WITH_OBJ"; then
+        AC_MSG_RESULT(yes)
+    else
+        AC_MSG_RESULT(no)
+    fi
+fi
+AC_SUBST(BUILDING_PCH_WITH_OBJ)
+
 TAB=`printf '  '`
 
 AC_MSG_CHECKING([the GNU Make version])
diff --git a/solenv/gbuild/LinkTarget.mk b/solenv/gbuild/LinkTarget.mk
index 695becffd076..f964a26f2266 100644
--- a/solenv/gbuild/LinkTarget.mk
+++ b/solenv/gbuild/LinkTarget.mk
@@ -268,12 +268,14 @@ gb_CxxObject_get_source = $(1)/$(2).cxx
 # compiled with different flags and link that in rather than mixing different
 # flags in one linktarget. If OBJECT_HAS_EXTRA_CXXFLAGS is set, the object
 # has explicitly set additional CXXFLAGS, so in that case avoid using the PCH.
+# T_PCH_EXTRA_CXXFLAGS is used when some object requires extra flags when using
+# the PCH, but they are intended (gb_PrecompiledHeader_pch_with_obj).
 define gb_CxxObject__set_pchflags
 ifneq ($(gb_ENABLE_PCH),)
 ifneq ($(strip $$(PCH_NAME)),)
 ifeq ($(OBJECT_HAS_EXTRA_CXXFLAGS),)
 ifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS)),$$(sort $$(T_CXXFLAGS) 
$$(T_CXXFLAGS_APPEND) $$(DEFS)))
-$$@ : PCHFLAGS := $$(call 
gb_PrecompiledHeader_get_enableflags,$$(PCH_NAME),$$(PCH_LINKTARGETMAKEFILENAME))
+$$@ : PCHFLAGS := $$(call 
gb_PrecompiledHeader_get_enableflags,$$(PCH_NAME),$$(PCH_LINKTARGETMAKEFILENAME))
 $$(T_PCH_EXTRA_CXXFLAGS)
 else
 $$(warning No precompiled header available for $$*.cxx .)
 $$(info precompiled header flags : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS)))
@@ -788,6 +790,7 @@ $(call gb_LinkTarget_get_target,$(1)) : 
PCH_LINKTARGETMAKEFILENAME :=
 $(call gb_LinkTarget_get_target,$(1)) : PCHOBJS :=
 $(call gb_LinkTarget_get_target,$(1)) : PCHOBJEX :=
 $(call gb_LinkTarget_get_target,$(1)) : PCHOBJNOEX :=
+$(call gb_LinkTarget_get_target,$(1)) : T_PCH_EXTRA_CXXFLAGS :=
 $(call gb_LinkTarget_get_target,$(1)) : PE_X86 :=
 $(call gb_LinkTarget_get_target,$(1)) : PDBFILE :=
 $(call gb_LinkTarget_get_target,$(1)) : TARGETGUI :=
@@ -1134,10 +1137,12 @@ $(call gb_CxxObject_get_target,$(2)) : | $(call 
gb_LinkTarget_get_headers_target
 $(call gb_CxxObject_get_target,$(2)) : T_CXXFLAGS += $(call 
gb_LinkTarget__get_cxxflags,$(4)) $(3) $(5)
 $(call gb_CxxObject_get_target,$(2)) : OBJECT_HAS_EXTRA_CXXFLAGS := $(if 
$(strip $(3)),1)
 $(call gb_CxxObject_get_target,$(2)) : \
-       OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+       OBJECTOWNER := $(if $(6),,$(call gb_Object__owner,$(2),$(1)))
 ifneq ($(gb_ENABLE_PCH),)
+ifeq ($(6),)
 $(call gb_CxxObject_get_target,$(2)) : $(call 
gb_LinkTarget_get_pch_timestamp,$(4))
 endif
+endif
 
 ifeq ($(gb_FULLDEPS),$(true))
 $(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS += $(2)
@@ -1554,6 +1559,11 @@ $(call gb_LinkTarget_get_pch_timestamp,$(4)) : $(call 
gb_PrecompiledHeader_get_t
 
 $(call gb_LinkTarget__set_precompiled_header_variables,$(1),$(2),$(3),$(4))
 
+ifneq ($(BUILDING_PCH_WITH_OBJ),)
+$(call gb_LinkTarget_add_exception_object,$(1),$(2),,$(4))
+$(call gb_CxxObject_get_target,$(2)) : T_PCH_EXTRA_CXXFLAGS += 
$(gb_PrecompiledHeader_pch_with_obj)
+endif
+
 ifeq ($(gb_FULLDEPS),$(true))
 -include $(call gb_PrecompiledHeader_get_dep_target,$(3),$(4))
 endif
@@ -1564,7 +1574,7 @@ endef
 define gb_LinkTarget_set_precompiled_header
 ifneq ($(gb_ENABLE_PCH),)
 $(call gb_LinkTarget__set_precompiled_header_impl,$(1),$(2),$(notdir 
$(2)),$(4))
-$(call gb_PrecompiledHeader_generate_rules,$(notdir $(2)),$(1),$(4))
+$(call gb_PrecompiledHeader_generate_rules,$(notdir $(2)),$(1),$(4),$(2))
 endif
 
 endef
@@ -1584,6 +1594,12 @@ $(call gb_LinkTarget_get_pch_reuse_timestamp,$(4)) : 
$(call gb_PrecompiledHeader
        $$(call gb_PrecompiledHeader__copy_reuse_files,$(1),$(3),$(4))
        mkdir -p $$(dir $$@) && touch $$@
 
+ifneq ($(BUILDING_PCH_WITH_OBJ),)
+# We need to link in also the PCH's object file. Again, rely on a special 
for_reuse target for dependencies.
+$(if $(wildcard $(call gb_CxxObject_get_source,$(SRCDIR),$(2))),,$(eval $(call 
gb_Output_error,No such source file $(call 
gb_CxxObject_get_source,$(SRCDIR),$(2)))))
+$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS += $(2)
+endif
+
 endef
 
 
diff --git a/solenv/gbuild/PrecompiledHeaders.mk 
b/solenv/gbuild/PrecompiledHeaders.mk
index 1da101b31a4b..86e016ccaa61 100644
--- a/solenv/gbuild/PrecompiledHeaders.mk
+++ b/solenv/gbuild/PrecompiledHeaders.mk
@@ -29,7 +29,7 @@ gb_PrecompiledHeader__get_debugdir = $(if $(call 
gb_LinkTarget__symbols_enabled,
 # for $(1)'s and things that are constant.
 # The defines are needed to get the right version of 
gb_PrecompiledHeader__get_debugdir.
 
-# $(call 
gb_PrecompiledHeader_generate_rules,pchtarget,linktarget,linktargetmakefilename)
+# $(call 
gb_PrecompiledHeader_generate_rules,pchtarget,linktarget,linktargetmakefilename,pchcxxfile)
 define gb_PrecompiledHeader_generate_rules
 
 $(call gb_PrecompiledHeader_get_dep_target,$(1),$(3)) :
diff --git a/solenv/gbuild/platform/com_GCC_class.mk 
b/solenv/gbuild/platform/com_GCC_class.mk
index d5dcb8e345c1..8d70ce894b32 100644
--- a/solenv/gbuild/platform/com_GCC_class.mk
+++ b/solenv/gbuild/platform/com_GCC_class.mk
@@ -88,7 +88,11 @@ gb_PrecompiledHeader_get_enableflags = \
 gb_PrecompiledHeader_EXT := .gch
 endif
 
-# Clang and gcc do not need any extra .o file for PCH
+# Clang supports building extra object file where it puts code that would be 
shared by all users of the PCH.
+# Unlike with MSVC it is built as a separate step.
+gb_PrecompiledHeader_pch_with_obj = $(BUILDING_PCH_WITH_OBJ)
+
+# This is for MSVC's object file built directly as a side-effect of building 
the PCH.
 gb_PrecompiledHeader_get_objectfile =
 
 define gb_PrecompiledHeader__command
@@ -105,6 +109,7 @@ $(call gb_Helper_abbreviate_dirs,\
                $(if $(VISIBILITY),,$(gb_VISIBILITY_FLAGS)) \
                $(if 
$(EXTERNAL_CODE),$(gb_CXXFLAGS_Wundef),$(gb_DEFS_INTERNAL)) \
                $(gb_NO_PCH_TIMESTAMP) \
+               $(gb_PrecompiledHeader_pch_with_obj) \
                $(6) \
                $(call gb_cxx_dep_generation_options,$(1),$(call 
gb_PrecompiledHeader_get_dep_target_tmp,$(2),$(7))) \
                -c $(patsubst %.cxx,%.hxx,$(3)) \
diff --git a/solenv/qa/python/gbuildtojson.py b/solenv/qa/python/gbuildtojson.py
index 8852dea3162f..00256c283d09 100644
--- a/solenv/qa/python/gbuildtojson.py
+++ b/solenv/qa/python/gbuildtojson.py
@@ -118,6 +118,7 @@ class CheckGbuildToJsonModules(unittest.TestCase):
         shutil.copyfile(os.path.join(self.srcdirnative, 'RepositoryFixes.mk'), 
os.path.join(self.tempsrc, 'RepositoryFixes.mk'))
         #print('copytree from _%s_ to _%s_' % (os.path.join(self.srcdirnative, 
'solenv').replace('\', '#').replace('/', '!'), os.path.join(self.tempsrc, 
'solenv').replace('\', '#').replace('/', '!')))
         shutil.copytree(os.path.join(self.srcdirnative, 'solenv'),  
os.path.join(self.tempsrc, 'solenv'))
+        shutil.copytree(os.path.join(self.srcdirnative, 'pch'),  
os.path.join(self.tempsrc, 'pch'))
 
     def tearDown(self):
         shutil.rmtree(self.tempsrc)

Reply via email to