summaryrefslogtreecommitdiffstats
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
parentSCSTR_FILTER_TEXT_COLOR is used in two different contexts (diff)
downloadcore-c48a5f2653f7e76421c140cbd6018deffefccaf9.tar.gz
core-c48a5f2653f7e76421c140cbd6018deffefccaf9.zip
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>
-rw-r--r--config_host.mk.in1
-rw-r--r--configure.ac112
-rw-r--r--external/curl/ExternalProject_curl.mk1
-rw-r--r--external/curl/UnpackedTarball_curl.mk1
-rw-r--r--external/curl/configurable-z-option.patch.020
-rw-r--r--external/openssl/ExternalProject_openssl.mk1
-rw-r--r--external/openssl/UnpackedTarball_openssl.mk1
-rw-r--r--external/openssl/configurable-z-option.patch.034
-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
16 files changed, 234 insertions, 61 deletions
diff --git a/config_host.mk.in b/config_host.mk.in
index ec22f695d782..a03ac19747bc 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -209,6 +209,7 @@ export ENABLE_SYMBOLS_FOR=@ENABLE_SYMBOLS_FOR@
export ENABLE_VALGRIND=@ENABLE_VALGRIND@
export ENABLE_WASM_STRIP=@ENABLE_WASM_STRIP@
export ENABLE_WERROR=@ENABLE_WERROR@
+export ENABLE_Z7_DEBUG=@ENABLE_Z7_DEBUG@
export ENDIANNESS=@ENDIANNESS@
export EPM=@EPM@
export EPM_FLAGS=@EPM_FLAGS@
diff --git a/configure.ac b/configure.ac
index 7ebeeaf6e62f..0ee46bed9c74 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1758,7 +1758,7 @@ libo_FUZZ_ARG_ENABLE(cups,
AC_ARG_ENABLE(ccache,
AS_HELP_STRING([--disable-ccache],
[Do not try to use ccache automatically.
- By default, unless on Windows, we will try to detect if ccache is available; in that case if
+ By default we will try to detect if ccache is available; in that case if
CC/CXX are not yet set, and --enable-icecream is not given, we
attempt to use ccache. --disable-ccache disables ccache completely.
Additionally ccache's depend mode is enabled if possible,
@@ -1766,6 +1766,12 @@ AC_ARG_ENABLE(ccache,
]),
,)
+AC_ARG_ENABLE(z7-debug,
+ AS_HELP_STRING([--enable-z7-debug],
+ [Makes the MSVC compiler use -Z7 for debugging instead of the default -Zi. Using this option takes
+ more disk spaces but allows to use ccache. Final PDB files are created even with this option enabled.
+ Enabled by default if ccache is detected.]))
+
libo_FUZZ_ARG_ENABLE(online-update,
AS_HELP_STRING([--enable-online-update],
[Enable the online update service that will check for new versions of
@@ -3029,26 +3035,6 @@ dnl ===================================================================
CCACHE_DEPEND_MODE=
if test "$enable_ccache" = "no"; then
CCACHE=""
-elif test "$_os" = "WINNT"; then
- # on windows/VC build do not use ccache - but perhaps sccache is around?
- case "%$CC%$CXX%" in
- # If $CC and/or $CXX already contain "sccache" (possibly suffixed with some version number etc),
- # assume that's good then
- *%sccache[[-_' ']]*|*/sccache[[-_' ']]*)
- AC_MSG_NOTICE([sccache seems to be included in a pre-defined CC and/or CXX])
- CCACHE_DEPEND_MODE=1
- ;;
- *)
- # for sharing code below, reuse CCACHE env var
- AC_PATH_PROG([CCACHE],[sccache],[not found])
- if test "$CCACHE" = "not found"; then
- CCACHE=""
- else
- CCACHE=`win_short_path_for_make "$CCACHE"`
- CCACHE_DEPEND_MODE=1
- fi
- ;;
- esac
elif test -n "$enable_ccache" -o \( "$enable_ccache" = "" -a "$enable_icecream" != "yes" \); then
case "%$CC%$CXX%" in
# If $CC and/or $CXX already contain "ccache" (possibly suffixed with some version number etc),
@@ -3058,10 +3044,59 @@ elif test -n "$enable_ccache" -o \( "$enable_ccache" = "" -a "$enable_icecream"
CCACHE_DEPEND_MODE=1
;;
*)
+ # try to use our own ccache if it is available and CCACHE was not already defined
+ if test -z "$CCACHE"; then
+ if test "$_os" = "WINNT"; then
+ ccache_ext=.exe # e.g. openssl build needs ccache.exe, not just ccache
+ fi
+ if test -n "$LODE_HOME" -a -x "$LODE_HOME/opt/bin/ccache$ccache_ext" ; then
+ CCACHE="$LODE_HOME/opt/bin/ccache$ccache_ext"
+ elif test -x "/opt/lo/bin/ccache$ccache_ext"; then
+ CCACHE="/opt/lo/bin/ccache$ccache_ext"
+ fi
+ fi
AC_PATH_PROG([CCACHE],[ccache],[not found])
+ if test "$CCACHE" != "not found" -a "$_os" = "WINNT"; then
+ CCACHE=`win_short_path_for_make "$CCACHE"`
+ fi
+ if test "$CCACHE" != "not found" -a "$COM" = MSC; then
+ # check that it has MSVC support (it should recognize it in CCACHE_COMPILERTYPE)
+ rm -f conftest.txt
+ AC_MSG_CHECKING([whether $CCACHE has MSVC support])
+ CCACHE_COMPILERTYPE=cl CCACHE_LOGFILE=conftest.txt $CCACHE echo >/dev/null 2>/dev/null
+ if grep -q 'Config: (environment) compiler_type = cl' conftest.txt; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ CCACHE="not found"
+ fi
+ rm -f conftest.txt
+ fi
+ if test "$CCACHE" = "not found" -a "$_os" = "WINNT"; then
+ # on windows/VC perhaps sccache is around?
+ case "%$CC%$CXX%" in
+ # If $CC and/or $CXX already contain "sccache" (possibly suffixed with some version number etc),
+ # assume that's good then
+ *%sccache[[-_' ']]*|*/sccache[[-_' ']]*)
+ AC_MSG_NOTICE([sccache seems to be included in a pre-defined CC and/or CXX])
+ CCACHE_DEPEND_MODE=1
+ SCCACHE=1
+ ;;
+ *)
+ # for sharing code below, reuse CCACHE env var
+ AC_PATH_PROG([CCACHE],[sccache],[not found])
+ if test "$CCACHE" != "not found"; then
+ CCACHE=`win_short_path_for_make "$CCACHE"`
+ SCCACHE=1
+ CCACHE_DEPEND_MODE=1
+ fi
+ ;;
+ esac
+ fi
if test "$CCACHE" = "not found"; then
CCACHE=""
- else
+ fi
+ if test -n "$CCACHE" -a -z "$SCCACHE"; then
CCACHE_DEPEND_MODE=1
# Need to check for ccache version: otherwise prevents
# caching of the results (like "-x objective-c++" for Mac)
@@ -3089,8 +3124,8 @@ if test "$enable_ccache" = "nodepend"; then
fi
AC_SUBST(CCACHE_DEPEND_MODE)
-# skip on windows - sccache defaults are good enough
-if test "$CCACHE" != "" -a "$_os" != "WINNT"; then
+# sccache defaults are good enough
+if test "$CCACHE" != "" -a -z "$SCCACHE"; then
# e.g. (/home/rene/.config/ccache/ccache.conf) max_size = 20.0G
# -p works with both 4.2 and 4.4
ccache_size_msg=$([ccache -p | $AWK /max_size/'{ print $4 }' | sed -e 's/\.[0-9]*//'])
@@ -3119,6 +3154,17 @@ if test "$CCACHE" != "" -a "$_os" != "WINNT"; then
fi
fi
+ENABLE_Z7_DEBUG=
+if test "$enable_z7_debug" != no; then
+ if test "$enable_z7_debug" = yes -o -n "$CCACHE"; then
+ ENABLE_Z7_DEBUG=TRUE
+ fi
+else
+ AC_MSG_WARN([ccache will not work with --disable-z7-debug])
+ add_warning "ccache will not work with --disable-z7-debug"
+fi
+AC_SUBST(ENABLE_Z7_DEBUG)
+
dnl ===================================================================
dnl Checks for C compiler,
dnl The check for the C++ compiler is later on.
@@ -4264,10 +4310,17 @@ if test "$CCACHE" != ""; then
AC_LANG_PUSH([C])
save_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS --ccache-skip -O2"
+ # msvc does not fail on unknown options, check stdout
+ if test "$COM" = MSC; then
+ CFLAGS="$CFLAGS -nologo"
+ fi
+ save_ac_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
dnl an empty program will do, we're checking the compiler flags
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
[use_ccache=yes], [use_ccache=no])
CFLAGS=$save_CFLAGS
+ ac_c_werror_flag=$save_ac_c_werror_flag
if test $use_ccache = yes -a "${CCACHE/*sccache*/}" != ""; then
AC_MSG_RESULT([yes])
else
@@ -6752,6 +6805,12 @@ if test "$CCACHE" != ""; then
AC_LANG_PUSH([C++])
save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$CXXFLAGS --ccache-skip -O2"
+ # msvc does not fail on unknown options, check stdout
+ if test "$COM" = MSC; then
+ CXXFLAGS="$CXXFLAGS -nologo"
+ fi
+ save_ac_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
dnl an empty program will do, we're checking the compiler flags
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
[use_ccache=yes], [use_ccache=no])
@@ -6763,6 +6822,7 @@ if test "$CCACHE" != ""; then
AC_MSG_RESULT([no])
fi
CXXFLAGS=$save_CXXFLAGS
+ ac_cxx_werror_flag=$save_ac_cxx_werror_flag
AC_LANG_POP([C++])
fi
@@ -12284,7 +12344,7 @@ if test "$CCACHE" != "" -a -n "$LO_CLANG_CC" -a -n "$LO_CLANG_CXX"; then
save_CC="$CC"
CC="$LO_CLANG_CC"
save_CFLAGS=$CFLAGS
- CFLAGS="$CFLAGS --ccache-skip -O2"
+ CFLAGS="$CFLAGS --ccache-skip -O2 -Werror"
dnl an empty program will do, we're checking the compiler flags
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
[use_ccache=yes], [use_ccache=no])
@@ -12303,7 +12363,7 @@ if test "$CCACHE" != "" -a -n "$LO_CLANG_CC" -a -n "$LO_CLANG_CXX"; then
save_CXX="$CXX"
CXX="$LO_CLANG_CXX"
save_CXXFLAGS=$CXXFLAGS
- CXXFLAGS="$CXXFLAGS --ccache-skip -O2"
+ CXXFLAGS="$CXXFLAGS --ccache-skip -O2 -Werror"
dnl an empty program will do, we're checking the compiler flags
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
[use_ccache=yes], [use_ccache=no])
diff --git a/external/curl/ExternalProject_curl.mk b/external/curl/ExternalProject_curl.mk
index d068f2dc36f2..d7bf396ca9fd 100644
--- a/external/curl/ExternalProject_curl.mk
+++ b/external/curl/ExternalProject_curl.mk
@@ -84,6 +84,7 @@ $(call gb_ExternalProject_get_state_target,curl,build):
VC=12 \
MACHINE=$(gb_MSBUILD_PLATFORM) \
GEN_PDB=$(if $(call gb_Module__symbols_enabled,curl),yes,no) \
+ $(if $(call gb_Module__symbols_enabled,curl),CFLAGS_PDB_VALUE="$(gb_DEBUGINFO_FLAGS)") \
DEBUG=$(if $(MSVC_USE_DEBUG_RUNTIME),yes,no) \
ENABLE_IPV6=yes \
ENABLE_SSPI=yes \
diff --git a/external/curl/UnpackedTarball_curl.mk b/external/curl/UnpackedTarball_curl.mk
index f1244d0fd989..73dca5ed219c 100644
--- a/external/curl/UnpackedTarball_curl.mk
+++ b/external/curl/UnpackedTarball_curl.mk
@@ -26,6 +26,7 @@ $(eval $(call gb_UnpackedTarball_add_patches,curl,\
external/curl/curl-7.26.0_win-proxy.patch \
external/curl/zlib.patch.0 \
external/curl/curl-debug.patch.1 \
+ external/curl/configurable-z-option.patch.0 \
))
ifeq ($(SYSTEM_NSS),)
diff --git a/external/curl/configurable-z-option.patch.0 b/external/curl/configurable-z-option.patch.0
new file mode 100644
index 000000000000..160577c76533
--- /dev/null
+++ b/external/curl/configurable-z-option.patch.0
@@ -0,0 +1,20 @@
+--- winbuild/MakefileBuild.vc.sav 2021-11-13 11:43:40.756226600 +0000
++++ winbuild/MakefileBuild.vc 2021-11-13 11:52:08.921692300 +0000
+@@ -45,7 +45,7 @@
+
+ !IF "$(VC)"=="6"
+ CC_NODEBUG = $(CC) /O2 /DNDEBUG
+-CC_DEBUG = $(CC) /Od /Gm /Zi /D_DEBUG /GZ
++CC_DEBUG = $(CC) /Od /Gm $(DEBUG_FLAGS_VALUE) /D_DEBUG /GZ
+ CFLAGS = /I. /I../lib /I../include /nologo /W4 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL
+ !ELSE
+ CC_NODEBUG = $(CC) /O2 /DNDEBUG
+@@ -62,7 +62,7 @@
+ # Instead of id: just create an archive, that contains all objects
+ LNKLIB = lib.exe
+
+-CFLAGS_PDB = /Zi
++CFLAGS_PDB = $(DEBUG_FLAGS_VALUE)
+ LFLAGS_PDB = /incremental:no /opt:ref,icf /DEBUG
+
+ CFLAGS_LIBCURL_STATIC = /DCURL_STATICLIB
diff --git a/external/openssl/ExternalProject_openssl.mk b/external/openssl/ExternalProject_openssl.mk
index 4c5d630721c8..e44ccf5f3436 100644
--- a/external/openssl/ExternalProject_openssl.mk
+++ b/external/openssl/ExternalProject_openssl.mk
@@ -66,6 +66,7 @@ $(call gb_ExternalProject_get_state_target,openssl,build):
CONFIGURE_INSIST=1 $(PERL) Configure $(OPENSSL_PLATFORM) no-tests no-multilib \
&& export PERL="$(shell cygpath -w $(PERL))" \
&& nmake -f makefile \
+ $(if $(call gb_Module__symbols_enabled,openssl),DEBUG_FLAGS_VALUE="$(gb_DEBUGINFO_FLAGS)") \
)
$(call gb_Trace_EndRange,openssl,EXTERNAL)
diff --git a/external/openssl/UnpackedTarball_openssl.mk b/external/openssl/UnpackedTarball_openssl.mk
index 6f00cf7f7e44..c52b427a866e 100644
--- a/external/openssl/UnpackedTarball_openssl.mk
+++ b/external/openssl/UnpackedTarball_openssl.mk
@@ -13,6 +13,7 @@ $(eval $(call gb_UnpackedTarball_set_tarball,openssl,$(OPENSSL_TARBALL),,openssl
$(eval $(call gb_UnpackedTarball_add_patches,openssl,\
external/openssl/openssl-no-multilib.patch.0 \
+ external/openssl/configurable-z-option.patch.0 \
))
# vim: set noet sw=4 ts=4:
diff --git a/external/openssl/configurable-z-option.patch.0 b/external/openssl/configurable-z-option.patch.0
new file mode 100644
index 000000000000..3dcf49dc81a6
--- /dev/null
+++ b/external/openssl/configurable-z-option.patch.0
@@ -0,0 +1,34 @@
+--- Configurations/10-main.conf.sav 2021-08-24 13:38:47.000000000 +0000
++++ Configurations/10-main.conf 2021-11-02 22:20:44.377653700 +0000
+@@ -13,7 +13,7 @@
+ } elsif ($disabled{asm}) {
+ # assembler is still used to compile uplink shim
+ $vc_win64a_info = { AS => "ml64",
+- ASFLAGS => "/nologo /Zi",
++ ASFLAGS => "/nologo $$(DEBUG_FLAGS_VALUE)",
+ asflags => "/c /Cp /Cx",
+ asoutflag => "/Fo" };
+ } else {
+@@ -41,7 +41,7 @@
+ } elsif ($disabled{asm}) {
+ # not actually used, uplink shim is inlined into C code
+ $vc_win32_info = { AS => "ml",
+- ASFLAGS => "/nologo /Zi",
++ ASFLAGS => "/nologo $$(DEBUG_FLAGS_VALUE)",
+ asflags => "/Cp /coff /c /Cx",
+ asoutflag => "/Fo",
+ perlasm_scheme => "win32" };
+@@ -1231,10 +1231,10 @@
+ "UNICODE", "_UNICODE",
+ "_CRT_SECURE_NO_DEPRECATE",
+ "_WINSOCK_DEPRECATED_NO_WARNINGS"),
+- lib_cflags => add("/Zi /Fdossl_static.pdb"),
++ lib_cflags => add("\$(DEBUG_FLAGS_VALUE)"),
+ lib_defines => add("L_ENDIAN"),
+- dso_cflags => "/Zi /Fddso.pdb",
+- bin_cflags => "/Zi /Fdapp.pdb",
++ dso_cflags => "\$(DEBUG_FLAGS_VALUE)",
++ bin_cflags => "\$(DEBUG_FLAGS_VALUE)",
+ shared_ldflag => "/dll",
+ shared_target => "win-shared", # meaningless except it gives Configure a hint
+ thread_scheme => "winthreads",
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);