summaryrefslogtreecommitdiff
path: root/solenv
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@centrum.cz>2021-11-13 16:20:46 +0000
committerLuboš Luňák <l.lunak@collabora.com>2021-11-17 15:21:44 +0100
commitc48a5f2653f7e76421c140cbd6018deffefccaf9 (patch)
treeb3415eecc9205f5787e749d8307c40792eedca77 /solenv
parent938fbac669bc59cf0b388bd0d21a2f14c4399757 (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.mk2
-rw-r--r--solenv/gbuild/gbuild.mk18
-rw-r--r--solenv/gbuild/platform/com_GCC_class.mk6
-rw-r--r--solenv/gbuild/platform/com_GCC_defs.mk14
-rw-r--r--solenv/gbuild/platform/com_MSC_class.mk18
-rw-r--r--solenv/gbuild/platform/com_MSC_defs.mk13
-rw-r--r--solenv/gcc-wrappers/wrapper.cxx50
-rw-r--r--solenv/gcc-wrappers/wrapper.hxx3
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);