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>
This commit is contained in:
Luboš Luňák
2021-11-17 15:21:44 +01:00
committed by Luboš Luňák
parent 938fbac669
commit c48a5f2653
16 changed files with 234 additions and 61 deletions
+1
View File
@@ -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@
+86 -26
View File
@@ -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])
+1
View File
@@ -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 \
+1
View File
@@ -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),)
+20
View File
@@ -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
+1
View File
@@ -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)
+1
View File
@@ -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:
+34
View File
@@ -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",
+1 -1
View File
@@ -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))) && \
+18
View File
@@ -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:
+3 -3
View File
@@ -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)) \
-14
View File
@@ -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:
+16 -2
View File
@@ -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
+13
View File
@@ -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:
+36 -14
View File
@@ -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;
}
+2 -1
View File
@@ -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);