diff options
author | Luboš Luňák <l.lunak@centrum.cz> | 2021-11-13 16:20:46 +0000 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2021-11-17 15:21:44 +0100 |
commit | c48a5f2653f7e76421c140cbd6018deffefccaf9 (patch) | |
tree | b3415eecc9205f5787e749d8307c40792eedca77 /solenv | |
parent | 938fbac669bc59cf0b388bd0d21a2f14c4399757 (diff) |
support ccache for MSVC too
There's no official MSVC support in ccache yet, but there are patches
in progress of getting upstreamed. So right now it's necessary
to get a patched ccache.
Ccache cannot work with -Zi option, since sharing debuginfo in a .PDB
cannot be cached. Added --enable-z7-symbols that gets enabled
by default if ccache is detected.
It works even with PCHs enabled, and externals seem to work too.
I get almost 100% hit rate on a rebuild, although such a rebuild
is slower than on Linux.
Change-Id: I1d230ee1fccc441b9d9bec794cc2e1ec13161999
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125179
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'solenv')
-rw-r--r-- | solenv/gbuild/PrecompiledHeaders.mk | 2 | ||||
-rw-r--r-- | solenv/gbuild/gbuild.mk | 18 | ||||
-rw-r--r-- | solenv/gbuild/platform/com_GCC_class.mk | 6 | ||||
-rw-r--r-- | solenv/gbuild/platform/com_GCC_defs.mk | 14 | ||||
-rw-r--r-- | solenv/gbuild/platform/com_MSC_class.mk | 18 | ||||
-rw-r--r-- | solenv/gbuild/platform/com_MSC_defs.mk | 13 | ||||
-rw-r--r-- | solenv/gcc-wrappers/wrapper.cxx | 50 | ||||
-rw-r--r-- | solenv/gcc-wrappers/wrapper.hxx | 3 |
8 files changed, 89 insertions, 35 deletions
diff --git a/solenv/gbuild/PrecompiledHeaders.mk b/solenv/gbuild/PrecompiledHeaders.mk index 9a8763657d2d..3b81cc77f365 100644 --- a/solenv/gbuild/PrecompiledHeaders.mk +++ b/solenv/gbuild/PrecompiledHeaders.mk @@ -67,7 +67,7 @@ $(call gb_PrecompiledHeader_get_target,$(1),$(3)) : || ( echo "Error, PCH $(1) built by $$(PCH_LINKTARGETMAKEFILENAME) instead of $(3)" >&2; exit 1) rm -f $$@ $$(call gb_PrecompiledHeader__command,$$@,$(1),$$<,$(gb_PrecompiledHeader_cxxflags_includes),$$(INCLUDE),$(3),$(5)) - $$(call gb_PrecompiledHeader__sum_command,$$@,$(1),$$<,$(gb_PrecompiledHeader_cxxflags_includes),$$(INCLUDE),$(3)) + $$(call gb_PrecompiledHeader__sum_command,$$@,$(1),$$<,$(gb_PrecompiledHeader_cxxflags_includes),$$(INCLUDE),$(3),$(5)) ifeq ($(gb_FULLDEPS),$(true)) $$(call gb_Helper_abbreviate_dirs,\ RESPONSEFILE=$$(call gb_var2file,$$(shell $$(gb_MKTEMP)),200,$$(call gb_PrecompiledHeader_get_dep_target_tmp,$(1),$(3))) && \ diff --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk index 08c82f5e8d1f..6d074400748d 100644 --- a/solenv/gbuild/gbuild.mk +++ b/solenv/gbuild/gbuild.mk @@ -377,4 +377,22 @@ endif endef +# Setup for ccache. +ifneq ($(gb_ENABLE_PCH),) +# CCACHE_SLOPPINESS should contain pch_defines,time_macros for PCHs. +gb_CCACHE_SLOPPINESS := +ifeq ($(shell test -z "$$CCACHE_SLOPPINESS" && echo 1),1) +gb_CCACHE_SLOPPINESS := CCACHE_SLOPPINESS=pch_defines,time_macros +else +ifeq ($(shell echo "$$CCACHE_SLOPPINESS" | grep -q pch_defines | grep -q time_macros && echo 1),1) +gb_CCACHE_SLOPPINESS := CCACHE_SLOPPINESS=$CCACHE_SLOPPINESS:pch_defines,time_macros +endif +endif +gb_COMPILER_SETUP += $(gb_CCACHE_SLOPPINESS) +endif + +ifneq ($(CCACHE_DEPEND_MODE),) +gb_COMPILER_SETUP += CCACHE_DEPEND=1 +endif + # vim: set noet sw=4: diff --git a/solenv/gbuild/platform/com_GCC_class.mk b/solenv/gbuild/platform/com_GCC_class.mk index ba12572f4341..74f744658e15 100644 --- a/solenv/gbuild/platform/com_GCC_class.mk +++ b/solenv/gbuild/platform/com_GCC_class.mk @@ -157,17 +157,17 @@ endef ifeq ($(COM_IS_CLANG),TRUE) # Clang has -fno-pch-timestamp, just checksum the file for CCACHE_PCH_EXTSUM -# $(call gb_PrecompiledHeader__sum_command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename) +# $(call gb_PrecompiledHeader__sum_command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename,compiler) define gb_PrecompiledHeader__sum_command $(SHA256SUM) $(1) >$(1).sum endef else # GCC does not generate the same .gch for the same input, so checksum the (preprocessed) input -# $(call gb_PrecompiledHeader__sum_command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename) +# $(call gb_PrecompiledHeader__sum_command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename,compiler) define gb_PrecompiledHeader__sum_command $(call gb_Helper_abbreviate_dirs,\ CCACHE_DISABLE=1 $(gb_COMPILER_SETUP) \ - $(gb_CXX) \ + $(if $(7),$(7),$(gb_CXX)) \ -x c++-header \ $(4) \ $(if $(WARNINGS_DISABLED),$(gb_CXXFLAGS_DISABLE_WARNINGS)) \ diff --git a/solenv/gbuild/platform/com_GCC_defs.mk b/solenv/gbuild/platform/com_GCC_defs.mk index c8f81ff15dc7..589c9eedc823 100644 --- a/solenv/gbuild/platform/com_GCC_defs.mk +++ b/solenv/gbuild/platform/com_GCC_defs.mk @@ -326,20 +326,6 @@ gb_Helper_get_rcfile = $(1)rc ifneq ($(gb_ENABLE_PCH),) # Enable use of .sum files for PCHs. gb_COMPILER_SETUP += CCACHE_PCH_EXTSUM=1 -# CCACHE_SLOPPINESS should contain pch_defines,time_macros for PCHs. -gb_CCACHE_SLOPPINESS := -ifeq ($(shell test -z "$$CCACHE_SLOPPINESS" && echo 1),1) -gb_CCACHE_SLOPPINESS := CCACHE_SLOPPINESS=pch_defines,time_macros -else -ifeq ($(shell echo "$$CCACHE_SLOPPINESS" | grep -q pch_defines | grep -q time_macros && echo 1),1) -gb_CCACHE_SLOPPINESS := CCACHE_SLOPPINESS=$CCACHE_SLOPPINESS:pch_defines,time_macros -endif -endif -gb_COMPILER_SETUP += $(gb_CCACHE_SLOPPINESS) -endif - -ifneq ($(CCACHE_DEPEND_MODE),) -gb_COMPILER_SETUP += CCACHE_DEPEND=1 endif # vim: set noet sw=4: diff --git a/solenv/gbuild/platform/com_MSC_class.mk b/solenv/gbuild/platform/com_MSC_class.mk index da5b682d6b8c..16eb6c2ee4d3 100644 --- a/solenv/gbuild/platform/com_MSC_class.mk +++ b/solenv/gbuild/platform/com_MSC_class.mk @@ -65,6 +65,7 @@ define gb_CObject__command_pattern $(call gb_Helper_abbreviate_dirs,\ mkdir -p $(dir $(1)) $(dir $(4)) && \ unset INCLUDE && \ + $(gb_COMPILER_SETUP) \ $(call gb_CObject__compiler,$(2),$(3),$(6)) \ $(call gb_Helper_remove_overridden_flags, \ $(DEFS) \ @@ -107,6 +108,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),$(6))) && \ unset INCLUDE && \ + CCACHE_DISABLE=1 $(gb_COMPILER_SETUP) \ $(call gb_CObject__compiler,$(4),$(3),$(7)) \ $(call gb_Helper_remove_overridden_flags, \ $(4) $(if $(WARNINGS_DISABLED),$(gb_CXXFLAGS_DISABLE_WARNINGS))) \ @@ -120,9 +122,21 @@ $(call gb_Helper_abbreviate_dirs,\ $(call gb_Trace_EndRange,$(2),PCH) endef -# No ccache with MSVC, no need to create a checksum for it. -# $(call gb_PrecompiledHeader__sum_command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename) +# MSVC does not generate the same .pch for the same input, so checksum the (preprocessed) input +# $(call gb_PrecompiledHeader__sum_command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename,compiler) define gb_PrecompiledHeader__sum_command +$(call gb_Helper_abbreviate_dirs,\ + unset INCLUDE && \ + CCACHE_DISABLE=1 $(gb_COMPILER_SETUP) \ + $(call gb_CObject__compiler,$(4),$(3),$(7)) \ + $(call gb_Helper_remove_overridden_flags, \ + $(4)$(if $(WARNINGS_DISABLED),$(gb_CXXFLAGS_DISABLE_WARNINGS))) \ + $(if $(EXTERNAL_CODE),$(if $(COM_IS_CLANG),-Wno-undef),$(gb_DEFS_INTERNAL)) \ + $(gb_LTOFLAGS) \ + $(5) \ + -E $(3) \ + 2>&1 | $(SHA256SUM) >$(1).sum \ + ) endef # When building a PCH, MSVC also creates a .pdb file with debug info. So for reuse diff --git a/solenv/gbuild/platform/com_MSC_defs.mk b/solenv/gbuild/platform/com_MSC_defs.mk index 39c284a6a16b..7760cefcab8a 100644 --- a/solenv/gbuild/platform/com_MSC_defs.mk +++ b/solenv/gbuild/platform/com_MSC_defs.mk @@ -214,10 +214,18 @@ gb_LinkTarget_LDFLAGS += \ /ignore:4217 /ignore:4049 +ifeq ($(ENABLE_Z7_DEBUG),) gb_DEBUGINFO_FLAGS := \ -FS \ -Zi \ +else +# ccache does not work with -Zi +gb_DEBUGINFO_FLAGS := \ + -Z7 \ + +endif + # See gb_Windows_PE_TARGETTYPEFLAGS_DEBUGINFO gb_LINKER_DEBUGINFO_FLAGS := @@ -322,4 +330,9 @@ gb_WIN_GPG_cross_setup_exports = export REAL_BUILD_CC="$(filter-out -%,$(CC_FOR_ && export CC_FOR_BUILD="$(call gb_Executable_get_target_for_build,gcc-wrapper) --wrapper-env-prefix=REAL_BUILD_ $(SOLARINC) -L$(subst ;, -L,$(ILIB_FOR_BUILD))" \ && export RC='windres -O COFF --target=$(gb_WIN_GPG_WINDRES_target) --preprocessor=$(call gb_Executable_get_target_for_build,cpp) --preprocessor-arg=-+ -DRC_INVOKED -DWINAPI_FAMILY=0 $(SOLARINC)' +ifneq ($(gb_ENABLE_PCH),) +# Enable use of .sum files for PCHs. +gb_COMPILER_SETUP += CCACHE_PCH_EXTSUM=1 +endif + # vim: set noet sw=4: diff --git a/solenv/gcc-wrappers/wrapper.cxx b/solenv/gcc-wrappers/wrapper.cxx index 3504d3d8c5ab..fbf3f5378ae5 100644 --- a/solenv/gcc-wrappers/wrapper.cxx +++ b/solenv/gcc-wrappers/wrapper.cxx @@ -82,7 +82,7 @@ void setupccenv() { } } -std::string processccargs(std::vector<std::string> rawargs, std::string &env_prefix, bool &verbose) +std::string processccargs(const std::vector<std::string>& rawargs, std::string &env_prefix, bool &verbose) { // default env var prefix env_prefix = "REAL_"; @@ -101,16 +101,16 @@ std::string processccargs(std::vector<std::string> rawargs, std::string &env_pre args.append(" -Gy"); args.append(" -Ob1 -Oxs -Oy-"); - // apparently these must be at the end - // otherwise configure tests may fail - // note: always use -debug so a PDB file is created - std::string linkargs(" -link -debug"); + std::string linkargs; + bool block_linkargs = false; // instead of using synced PDB access (-FS), use individual PDB files based on output const char *const pEnvIndividualPDBs(getenv("MSVC_USE_INDIVIDUAL_PDBS")); const bool bIndividualPDBs = (pEnvIndividualPDBs && !strcmp(pEnvIndividualPDBs, "TRUE")); + const char *const pEnvEnableZ7Debug(getenv("ENABLE_Z7_DEBUG")); + const bool bEnableZ7Debug = (pEnvEnableZ7Debug && !strcmp(pEnvEnableZ7Debug, "TRUE")); - for(std::vector<std::string>::iterator i = rawargs.begin(); i != rawargs.end(); ++i) { + for(std::vector<std::string>::const_iterator i = rawargs.begin(); i != rawargs.end(); ++i) { if (env_prefix_next_arg) { env_prefix = *i; @@ -150,7 +150,7 @@ std::string processccargs(std::vector<std::string> rawargs, std::string &env_pre exit(1); } - if (bIndividualPDBs) + if (bIndividualPDBs && !bEnableZ7Debug) { if (dot == std::string::npos) args.append(" -Fd" + *i + ".pdb"); @@ -159,17 +159,26 @@ std::string processccargs(std::vector<std::string> rawargs, std::string &env_pre } } else if(*i == "-g" || !(*i).compare(0,5,"-ggdb")) { - args.append("-Zi"); - if (!bIndividualPDBs) - args.append(" -FS"); + if(!bEnableZ7Debug) + { + args.append("-Zi"); + if (!bIndividualPDBs) + args.append(" -FS"); + } + else + { + // ccache doesn't work with -Zi, the -link -debug for linking will create a final PDB + args.append("-Z7"); + } } else if(!(*i).compare(0,2,"-D")) { // need to re-escape strings for preprocessor - for(size_t pos=(*i).find("\""); pos!=std::string::npos; pos=(*i).find("\"",pos)) { - (*i).replace(pos,0,"\\"); + std::string str = *i; + for(size_t pos=str.find("\""); pos!=std::string::npos; pos=str.find("\"",pos)) { + str.replace(pos,0,"\\"); pos+=2; } - args.append(*i); + args.append(str); } else if(!(*i).compare(0,2,"-L")) { linkargs.append(" -LIBPATH:"+(*i).substr(2)); @@ -188,6 +197,12 @@ std::string processccargs(std::vector<std::string> rawargs, std::string &env_pre else if(!(*i).compare(0,4,"-Wl,")) { //TODO: drop other gcc-specific options } + else if(*i == "-c") { + args.append("-c"); + // If -c is specified, there will be no linking anyway, + // and passing -link with -c stops ccache from caching. + block_linkargs = true; + } else if(*i == "-Werror") args.append("-WX"); else if (*i == "--wrapper-print-cmdline") @@ -219,7 +234,14 @@ std::string processccargs(std::vector<std::string> rawargs, std::string &env_pre exit(1); } - args.append(linkargs); + if(!block_linkargs) { + // apparently these must be at the end + // otherwise configure tests may fail + // note: always use -debug so a PDB file is created + args.append(" -link -debug "); + args.append(linkargs); + } + return args; } diff --git a/solenv/gcc-wrappers/wrapper.hxx b/solenv/gcc-wrappers/wrapper.hxx index e4a4bb3bbeb5..d68ab90c9504 100644 --- a/solenv/gcc-wrappers/wrapper.hxx +++ b/solenv/gcc-wrappers/wrapper.hxx @@ -18,7 +18,8 @@ std::string getexe(std::string exename, bool maybeempty = false); void setupccenv(); -std::string processccargs(std::vector<std::string> rawargs, std::string& env_prefix, bool& verbose); +std::string processccargs(const std::vector<std::string>& rawargs, std::string& env_prefix, + bool& verbose); int startprocess(std::string command, std::string args, bool verbose); |