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)
