summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config_host.mk.in1
-rw-r--r--configure.ac23
-rw-r--r--solenv/gbuild/CppunitTest.mk1
-rw-r--r--solenv/gbuild/Executable.mk1
-rw-r--r--solenv/gbuild/Library.mk1
-rw-r--r--solenv/gbuild/LinkTarget.mk86
-rw-r--r--solenv/gbuild/PrecompiledHeaders.mk78
-rw-r--r--solenv/gbuild/StaticLibrary.mk1
-rw-r--r--solenv/gbuild/TargetLocations.mk6
-rw-r--r--solenv/gbuild/gbuild.help.txt2
-rw-r--r--solenv/gbuild/gbuild.mk7
-rw-r--r--solenv/gbuild/platform/com_MSC_class.mk41
-rw-r--r--solenv/gbuild/platform/com_MSC_defs.mk4
-rw-r--r--solenv/gbuild/templates/Library.mk4
14 files changed, 251 insertions, 5 deletions
diff --git a/config_host.mk.in b/config_host.mk.in
index b1a08498889c..ffda4d7a162f 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -151,6 +151,7 @@ export ENABLE_NPAPI_FROM_BROWSER=@ENABLE_NPAPI_FROM_BROWSER@
export ENABLE_NPAPI_INTO_BROWSER=@ENABLE_NPAPI_INTO_BROWSER@
export ENABLE_ONLINE_UPDATE=@ENABLE_ONLINE_UPDATE@
export ENABLE_OPENGL=@ENABLE_OPENGL@
+export ENABLE_PCH=@ENABLE_PCH@
export ENABLE_PDFIMPORT=@ENABLE_PDFIMPORT@
export ENABLE_QUICKSTART_LIBPNG=@ENABLE_QUICKSTART_LIBPNG@
export ENABLE_RANDR=@ENABLE_RANDR@
diff --git a/configure.ac b/configure.ac
index 648da1a55cac..96f517e9c48c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -677,6 +677,11 @@ AC_ARG_ENABLE(vba,
[Disables the vba compatibility feature.])
)
+AC_ARG_ENABLE(pch,
+ AS_HELP_STRING([--enable-pch],
+ [Enables precompiled header support for C++.])
+)
+
AC_ARG_ENABLE(win-mozab-driver,
AS_HELP_STRING([--enable-win-mozab-driver],
[LibreOffice includes a driver to connect to Mozilla
@@ -4474,7 +4479,23 @@ dnl ===================================================================
dnl ENABLE_PCH i now a no-op
dnl ===================================================================
AC_MSG_CHECKING([whether to enable pch feature])
-AC_MSG_RESULT([no, obsolete])
+if test -n "$enable_pch" && test "$enable_pch" != "no"; then
+ if test "$_os" = "WINNT" -a "$WITH_MINGW" != "yes"; then
+ ENABLE_PCH="TRUE"
+ AC_MSG_RESULT([yes])
+dnl There is no PCH support in GCC versions prior to this
+ elif test "$GCC" = "yes"; then
+ ENABLE_PCH="TRUE"
+ AC_MSG_RESULT([yes])
+ else
+ ENABLE_PCH=""
+ AC_MSG_WARN([Precompiled header not yet supported for your platform/compiler])
+ fi
+else
+ ENABLE_PCH=""
+ AC_MSG_RESULT([no])
+fi
+AC_SUBST(ENABLE_PCH)
dnl ===================================================================
dnl Search all the common names for GNU make
diff --git a/solenv/gbuild/CppunitTest.mk b/solenv/gbuild/CppunitTest.mk
index 682ae3069f5d..f3efee4cc6aa 100644
--- a/solenv/gbuild/CppunitTest.mk
+++ b/solenv/gbuild/CppunitTest.mk
@@ -353,6 +353,7 @@ $(eval $(foreach method,\
add_package_headers \
use_package \
use_packages \
+ add_precompiled_header \
add_sdi_headers \
add_cflags \
set_cflags \
diff --git a/solenv/gbuild/Executable.mk b/solenv/gbuild/Executable.mk
index fab3be92e39d..a9c7d8e3a101 100644
--- a/solenv/gbuild/Executable.mk
+++ b/solenv/gbuild/Executable.mk
@@ -138,6 +138,7 @@ $(eval $(foreach method,\
use_packages \
use_unpacked \
add_sdi_headers \
+ add_precompiled_header \
add_nativeres \
set_warnings_not_errors \
set_generated_cxx_suffix \
diff --git a/solenv/gbuild/Library.mk b/solenv/gbuild/Library.mk
index bb799114901c..0218f36122b0 100644
--- a/solenv/gbuild/Library.mk
+++ b/solenv/gbuild/Library.mk
@@ -223,6 +223,7 @@ $(eval $(foreach method,\
use_unpacked \
add_package_headers \
add_sdi_headers \
+ add_precompiled_header \
export_objects_list \
add_nativeres \
set_visibility_default \
diff --git a/solenv/gbuild/LinkTarget.mk b/solenv/gbuild/LinkTarget.mk
index f2a5cfa67603..3c827612f1ac 100644
--- a/solenv/gbuild/LinkTarget.mk
+++ b/solenv/gbuild/LinkTarget.mk
@@ -68,8 +68,9 @@ gb_LinkTarget__get_ldflags=$(if $(LDFLAGS),$(LDFLAGS),$(call gb_LinkTarget__get_
# LinkTarget/headers
# LinkTarget/dep joined dep file AsmObject/dep CObject/dep CxxObject/dep GenCObject/dep GenCxxObject/dep ObjCObject/dep ObjCxxObject/dep
# | LinkTarget/headers
-# LinkTarget/headers all headers available LinkTarget/external_headers
+# LinkTarget/headers all headers available LinkTarget/external_headers PCH
# including own generated own generated headers
+# PCH precompiled headers (win) LinkTarget/external_headers
# LinkTarget/external_headers all external headers avail. header files of linked libs
#
# CObject plain c compile | LinkTarget/headers
@@ -153,17 +154,47 @@ gb_CxxObject_get_source = $(1)/$(2).cxx
# defined by platform
# gb_CxxObject__command
+# Only enable PCH if the PCH_CXXFLAGS and the PCH_DEFS (from the linktarget)
+# are the same as the T_CXXFLAGS and DEFS we want to use for this object. This
+# should usually be the case. The DEFS/T_CXXFLAGS would have to be manually
+# overridden for one object file for them to differ. PCH_CXXFLAGS/PCH_DEFS
+# should never be overridden on an object -- they should be the same as for the
+# whole linktarget. In general it should be cleaner to use a static library
+# compiled with different flags and link that in rather than mixing different
+# flags in one linktarget.
+define gb_CxxObject__set_pchflags
+ifeq ($(gb_ENABLE_PCH),$(true))
+ifneq ($(strip $$(PCH_NAME)),)
+ifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS)),$$(sort $$(T_CXXFLAGS) $$(DEFS)))
+$$@ : PCHFLAGS := $$(call gb_PrecompiledHeader_get_enableflags,$$(PCH_NAME))
+else
+ifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_NOEXCEPTIONFLAGS)),$$(sort $$(T_CXXFLAGS) $$(DEFS)))
+$$@ : PCHFLAGS := $$(call gb_NoexPrecompiledHeader_get_enableflags,$$(PCH_NAME))
+else
+$$(info No precompiled header available for $$*.cxx .)
+$$(info precompiled header flags ( ex) : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS)))
+$$(info precompiled header flags (noex) : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_NOEXCEPTIONFLAGS)))
+$$(info . object flags : $$(sort $$(T_CXXFLAGS) $$(DEFS)))
+$$@ : PCHFLAGS :=
+endif
+endif
+endif
+endif
+endef
+
ifneq ($(COMPILER_PLUGIN_TOOL),)
$(call gb_CxxObject_get_target,%) : $(call gb_CxxObject_get_source,$(SRCDIR),%) force_compiler_tool_run
$(call gb_CxxObject__tool_command,$*,$<)
else
$(call gb_CxxObject_get_target,%) : $(call gb_CxxObject_get_source,$(SRCDIR),%)
+ $(eval $(gb_CxxObject__set_pchflags))
$(call gb_CxxObject__command,$@,$*,$<,$(call gb_CxxObject_get_dep_target,$*))
endif
ifeq ($(gb_FULLDEPS),$(true))
$(call gb_CxxObject_get_dep_target,%) :
$(if $(wildcard $@),touch $@,\
+ $(eval $(gb_CxxObject__set_pchflags))\
$(call gb_Object__command_dep,$@,$(call gb_CxxObject_get_target,$*)))
endif
@@ -463,6 +494,9 @@ $(call gb_LinkTarget_get_headers_target,%) : $(call gb_LinkTarget_get_external_h
# Explanation of some of the variables:
# - AUXTARGETS are the additionally generated files that need to be cleaned out
# on clean.
+# - PCH_CXXFLAGS and PCH_DEFS are the flags that the precompiled headers will
+# be compiled with. They should never be overridden in a single object
+# files.
# - TARGETTYPE is the type of linktarget as some platforms need very different
# command to link different targettypes.
# - LIBRARY_X64 is only relevent for building a x64 library on windows.
@@ -506,11 +540,15 @@ $(call gb_LinkTarget_get_headers_target,$(1)) \
$(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS := $$(gb_LinkTarget_CFLAGS)
$(call gb_LinkTarget_get_headers_target,$(1)) \
$(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS)
+$(call gb_LinkTarget_get_headers_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) $(CXXFLAGS)
$(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS)
$(call gb_LinkTarget_get_target,$(1)) : T_OBJCFLAGS := $$(gb_LinkTarget_OBJCFLAGS)
$(call gb_LinkTarget_get_headers_target,$(1)) \
$(call gb_LinkTarget_get_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $$(call gb_LinkTarget_rtl_defs,$(1)) $(CPPFLAGS)
$(call gb_LinkTarget_get_headers_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
+$(call gb_LinkTarget_get_headers_target,$(1)) \
$(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE)
$(call gb_LinkTarget_get_headers_target,$(1)) \
$(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS := $$(gb_LinkTarget_LDFLAGS) $(call gb_LinkTarget__get_ldflags,$(2))
@@ -520,6 +558,9 @@ $(call gb_LinkTarget_get_target,$(1)) : LIBS :=
$(call gb_LinkTarget_get_target,$(1)) : TARGETTYPE :=
$(call gb_LinkTarget_get_target,$(1)) : LIBRARY_X64 :=
$(call gb_LinkTarget_get_headers_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME :=
+$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS :=
+$(call gb_LinkTarget_get_headers_target,$(1)) \
$(call gb_LinkTarget_get_target,$(1)) : PDBFILE :=
$(call gb_LinkTarget_get_target,$(1)) : EXTRAOBJECTLISTS :=
$(call gb_LinkTarget_get_target,$(1)) : NATIVERES :=
@@ -540,13 +581,15 @@ $(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS :=
$(call gb_LinkTarget_get_dep_target,$(1)) : YACCOBJECTS :=
$(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS := $$(gb_LinkTarget_CFLAGS)
$(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS)
+$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) $(CXXFLAGS)
$(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS)
$(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCFLAGS := $$(gb_LinkTarget_OBJCFLAGS)
$(call gb_LinkTarget_get_dep_target,$(1)) : T_YACCFLAGS := $$(gb_LinkTarget_YYACFLAGS) $(YACCFLAGS)
-$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $$(call gb_LinkTarget_rtl_defs,$(1)) $(CPPFLAGS)
+$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE)
$(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE :=
$(call gb_LinkTarget_get_dep_target,$(1)) : LIBRARY_X64 :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_NAME :=
$(call gb_LinkTarget_get_dep_target,$(1)) : EXTRAOBJECTLISTS :=
$(call gb_LinkTarget_get_dep_target,$(1)) : VISIBILITY :=
$(call gb_LinkTarget_get_dep_target,$(1)) : WARNINGS_NOT_ERRORS :=
@@ -568,8 +611,11 @@ endef
define gb_LinkTarget_add_defs
$(call gb_LinkTarget_get_headers_target,$(1)) \
$(call gb_LinkTarget_get_target,$(1)) : DEFS += $(2)
+$(call gb_LinkTarget_get_headers_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS += $(2)
ifeq ($(gb_FULLDEPS),$(true))
$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS += $(2)
endif
endef
@@ -598,8 +644,11 @@ endef
define gb_LinkTarget_add_cxxflags
$(call gb_LinkTarget_get_headers_target,$(1)) \
$(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS += $(2)
+$(call gb_LinkTarget_get_headers_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS += $(2)
ifeq ($(gb_FULLDEPS),$(true))
$(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS += $(2)
endif
endef
@@ -1136,6 +1185,39 @@ $(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach sdi,$(2),$(call gb_SdiTa
endef
+define gb_LinkTarget__add_precompiled_header_impl
+$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_PrecompiledHeader_get_target,$(3)))
+$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_PrecompiledHeader_get_clean_target,$(3))
+$(call gb_PrecompiledHeader_get_target,$(3)) : $(2).cxx
+
+$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_NoexPrecompiledHeader_get_target,$(3)))
+$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_NoexPrecompiledHeader_get_clean_target,$(3))
+$(call gb_NoexPrecompiledHeader_get_target,$(3)) : $(2).cxx
+
+$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME := $(3)
+$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS = $(call gb_PrecompiledHeader_get_target,$(3)).obj $(call gb_NoexPrecompiledHeader_get_target,$(3)).obj
+
+$(call gb_LinkTarget_get_headers_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : DEFS := $$(DEFS) -DPRECOMPILED_HEADERS
+$(call gb_LinkTarget_get_headers_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS = $$(DEFS)
+ifeq ($(gb_FULLDEPS),$(true))
+-include \
+ $(call gb_PrecompiledHeader_get_dep_target,$(3)) \
+ $(call gb_NoexPrecompiledHeader_get_dep_target,$(3))
+$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $$(DEFS) -DPRECOMPILED_HEADERS
+$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS = $$(DEFS)
+endif
+
+endef
+
+define gb_LinkTarget_add_precompiled_header
+ifeq ($(gb_ENABLE_PCH),$(true))
+$(call gb_LinkTarget__add_precompiled_header_impl,$(1),$(2),$(notdir $(2)))
+endif
+
+endef
+
define gb_LinkTarget_add_external_headers
$$(call gb_Output_error,\
gb_LinkTarget_add_external_headers: use gb_LinkTarget_use_package instead.)
diff --git a/solenv/gbuild/PrecompiledHeaders.mk b/solenv/gbuild/PrecompiledHeaders.mk
new file mode 100644
index 000000000000..6fbceb36195d
--- /dev/null
+++ b/solenv/gbuild/PrecompiledHeaders.mk
@@ -0,0 +1,78 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+
+# PrecompiledHeader class
+
+ifeq ($(gb_ENABLE_PCH),$(true))
+
+# gb_PrecompiledHeader_get_enableflags defined by platform
+ifeq ($(gb_DEBUGLEVEL),2)
+gb_PrecompiledHeader_DEBUGDIR := debug
+gb_NoexPrecompiledHeader_DEBUGDIR := debug
+else
+gb_PrecompiledHeader_DEBUGDIR := nodebug
+gb_NoexPrecompiledHeader_DEBUGDIR := nodebug
+endif
+
+$(call gb_PrecompiledHeader_get_dep_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ echo '$(call gb_PrecompiledHeader_get_target,$*) : $$(gb_Helper_PHONY)' > $@)
+
+$(call gb_NoexPrecompiledHeader_get_dep_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ echo '$(call gb_NoexPrecompiledHeader_get_target,$*) : $$(gb_Helper_PHONY)' > $@)
+
+$(call gb_PrecompiledHeader_get_target,%) :
+ $(call gb_PrecompiledHeader__command,$@,$*,$<,$(PCH_DEFS),$(PCH_CXXFLAGS) $(gb_PrecompiledHeader_EXCEPTIONFLAGS),$(INCLUDE_STL) $(INCLUDE))
+
+$(call gb_NoexPrecompiledHeader_get_target,%) :
+ $(call gb_NoexPrecompiledHeader__command,$@,$*,$<,$(PCH_DEFS),$(PCH_CXXFLAGS) $(gb_NoexPrecompiledHeader_NOEXCEPTIONFLAGS),$(INCLUDE_STL) $(INCLUDE))
+
+.PHONY : $(call gb_PrecompiledHeader_get_clean_target,%) $(call gb_NoExPrecompiledHeader_get_clean_target,%)
+$(call gb_PrecompiledHeader_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),PCH,1)
+ -$(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_PrecompiledHeader_get_target,$*) \
+ $(call gb_PrecompiledHeader_get_target,$*).obj \
+ $(call gb_PrecompiledHeader_get_target,$*).pdb \
+ $(call gb_PrecompiledHeader_get_dep_target,$*))
+
+
+$(call gb_NoexPrecompiledHeader_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),PCH,1)
+ -$(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_NoexPrecompiledHeader_get_target,$*) \
+ $(call gb_NoexPrecompiledHeader_get_target,$*).obj \
+ $(call gb_NoexPrecompiledHeader_get_target,$*).pdb \
+ $(call gb_NoexPrecompiledHeader_get_dep_target,$*))
+endif
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/StaticLibrary.mk b/solenv/gbuild/StaticLibrary.mk
index 4c68af6e82e5..ad7cc829d36d 100644
--- a/solenv/gbuild/StaticLibrary.mk
+++ b/solenv/gbuild/StaticLibrary.mk
@@ -118,6 +118,7 @@ $(eval $(foreach method,\
use_external_project \
use_static_libraries \
add_sdi_headers \
+ add_precompiled_header \
set_warnings_not_errors \
set_generated_cxx_suffix \
,\
diff --git a/solenv/gbuild/TargetLocations.mk b/solenv/gbuild/TargetLocations.mk
index 32887bee7956..bf826054cba3 100644
--- a/solenv/gbuild/TargetLocations.mk
+++ b/solenv/gbuild/TargetLocations.mk
@@ -133,10 +133,14 @@ gb_Module_get_check_target = $(WORKDIR)/Module/check/$(1)
gb_Module_get_slowcheck_target = $(WORKDIR)/Module/slowcheck/$(1)
gb_Module_get_subsequentcheck_target = $(WORKDIR)/Module/subsequentcheck/$(1)
gb_Module_get_target = $(WORKDIR)/Module/$(1)
+gb_NoexPrecompiledHeader_get_dep_target = $(WORKDIR)/Dep/NoexPrecompiledHeader/$(gb_NoexPrecompiledHeader_DEBUGDIR)/$(1).hxx.pch.d
+gb_NoexPrecompiledHeader_get_target = $(WORKDIR)/NoexPrecompiledHeader/$(gb_NoexPrecompiledHeader_DEBUGDIR)/$(1).hxx.pch
gb_ObjCxxObject_get_target = $(WORKDIR)/ObjCxxObject/$(1).o
gb_ObjCObject_get_target = $(WORKDIR)/ObjCObject/$(1).o
gb_Package_get_preparation_target = $(WORKDIR)/Package/prepared/$(1)
gb_Package_get_target = $(WORKDIR)/Package/$(1)
+gb_PrecompiledHeader_get_dep_target = $(WORKDIR)/Dep/PrecompiledHeader/$(gb_PrecompiledHeader_DEBUGDIR)/$(1).hxx.pch.d
+gb_PrecompiledHeader_get_target = $(WORKDIR)/PrecompiledHeader/$(gb_PrecompiledHeader_DEBUGDIR)/$(1).hxx.pch
gb_Pagein_get_target = $(WORKDIR)/Pagein/$(1)
gb_Pyuno_get_target = $(WORKDIR)/Pyuno/$(1).zip
gb_Pyuno_get_outdir_target = $(OUTDIR)/bin/$(1).zip
@@ -243,9 +247,11 @@ $(eval $(call gb_Helper_make_clean_targets,\
JunitTest \
LinkTarget \
Module \
+ NoexPrecompiledHeader \
PackagePart \
Package \
Pagein \
+ PrecompiledHeader \
Pyuno \
Rdb \
ResTarget \
diff --git a/solenv/gbuild/gbuild.help.txt b/solenv/gbuild/gbuild.help.txt
index 83b4550d9b93..8c30402f3ef5 100644
--- a/solenv/gbuild/gbuild.help.txt
+++ b/solenv/gbuild/gbuild.help.txt
@@ -66,7 +66,7 @@ INTERACTIVE VARIABLES:
3... = degugging information + no optimizations + extra
debug output (usually extremely verbose). Levels
> 2 are not used very much.
-
+ ENABLE_PCH If not empty, use precompiled headers.
TIMELOG / timelog
If not empty enable the RTL_LOGFILE_* time logging facility.
export RTL_LOGFILE=rtl_logfile.nopid when running office, to
diff --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk
index 83a0e1a62212..9e621cddf714 100644
--- a/solenv/gbuild/gbuild.mk
+++ b/solenv/gbuild/gbuild.mk
@@ -141,6 +141,12 @@ gb_SYMBOL := $(true)
endif
endif
+ifneq ($(strip $(ENABLE_PCH)),)
+gb_ENABLE_PCH := $(true)
+else
+gb_ENABLE_PCH := $(false)
+endif
+
ifneq ($(nodep),)
gb_FULLDEPS := $(false)
else
@@ -303,6 +309,7 @@ include $(foreach class, \
CustomTarget \
ExternalProject \
Pagein \
+ PrecompiledHeaders \
Pyuno \
Rdb \
CppunitTest \
diff --git a/solenv/gbuild/platform/com_MSC_class.mk b/solenv/gbuild/platform/com_MSC_class.mk
index 1102da933939..872ea61531ae 100644
--- a/solenv/gbuild/platform/com_MSC_class.mk
+++ b/solenv/gbuild/platform/com_MSC_class.mk
@@ -78,6 +78,7 @@ $(call gb_Helper_abbreviate_dirs,\
$(T_CXXFLAGS) \
$(if $(WARNINGS_NOT_ERRORS),,$(gb_CXXFLAGS_WERROR)) \
-Fd$(PDBFILE) \
+ $(PCHFLAGS) \
$(gb_COMPILERDEPFLAGS) \
-I$(dir $(3)) \
$(INCLUDE) \
@@ -87,6 +88,44 @@ $(call gb_Helper_abbreviate_dirs,\
endef
+# PrecompiledHeader class
+
+gb_PrecompiledHeader_get_enableflags = -Yu$(1).hxx \
+ -Fp$(call gb_PrecompiledHeader_get_target,$(1))
+
+define gb_PrecompiledHeader__command
+$(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))) && \
+ unset INCLUDE && \
+ $(gb_CXX) \
+ $(4) $(5) -Fd$(PDBFILE) \
+ $(gb_COMPILERDEPFLAGS) \
+ -I$(dir $(3)) \
+ $(6) \
+ -c $(3) \
+ -Yc$(notdir $(patsubst %.cxx,%.hxx,$(3))) -Fp$(1) -Fo$(1).obj) $(call gb_create_deps,$(1),$(call gb_PrecompiledHeader_get_dep_target,$(2)),$(3))
+endef
+
+# NoexPrecompiledHeader class
+
+gb_NoexPrecompiledHeader_get_enableflags = -Yu$(1).hxx \
+ -Fp$(call gb_NoexPrecompiledHeader_get_target,$(1))
+
+define gb_NoexPrecompiledHeader__command
+$(call gb_Output_announce,$(2),$(true),PCH,1)
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) $(dir $(call gb_NoexPrecompiledHeader_get_dep_target,$(2))) && \
+ unset INCLUDE && \
+ $(gb_CXX) \
+ $(4) $(5) -Fd$(PDBFILE) \
+ $(gb_COMPILERDEPFLAGS) \
+ -I$(dir $(3)) \
+ $(6) \
+ -c $(3) \
+ -Yc$(notdir $(patsubst %.cxx,%.hxx,$(3))) -Fp$(1) -Fo$(1).obj) $(call gb_create_deps,$(1),$(call gb_NoexPrecompiledHeader,$(2)),$(3))
+endef
+
# AsmObject class
gb_AsmObject_get_source = $(1)/$(2).asm
@@ -131,7 +170,7 @@ $(call gb_Helper_abbreviate_dirs,\
$(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
$(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
$(foreach extraobjectlist,$(EXTRAOBJECTLISTS),$(shell cat $(extraobjectlist))) \
- $(NATIVERES)) && \
+ $(PCHOBJS) $(NATIVERES)) && \
$(if $(filter $(call gb_Library_get_linktargetname,merged),$(2)),$(call gb_LinkTarget_MergedResponseFile)) \
unset INCLUDE && \
$(if $(filter YES,$(LIBRARY_X64)), $(LINK_X64_BINARY), $(gb_LINK)) \
diff --git a/solenv/gbuild/platform/com_MSC_defs.mk b/solenv/gbuild/platform/com_MSC_defs.mk
index a81b5df9d8f3..b2e6e9e36de8 100644
--- a/solenv/gbuild/platform/com_MSC_defs.mk
+++ b/solenv/gbuild/platform/com_MSC_defs.mk
@@ -240,6 +240,10 @@ gb_LinkTarget_EXCEPTIONFLAGS := \
gb_LinkTarget_NOEXCEPTIONFLAGS := \
-DEXCEPTIONS_OFF \
+gb_PrecompiledHeader_EXCEPTIONFLAGS := $(gb_LinkTarget_EXCEPTIONFLAGS)
+
+gb_NoexPrecompiledHeader_NOEXCEPTIONFLAGS := $(gb_LinkTarget_NOEXCEPTIONFLAGS)
+
gb_LinkTarget_LDFLAGS := \
$(if $(findstring s,$(filter-out --%,$(MAKEFLAGS))),-nologo,) \
-MANIFEST \
diff --git a/solenv/gbuild/templates/Library.mk b/solenv/gbuild/templates/Library.mk
index 6fa404bf38ad..615a82bcfd74 100644
--- a/solenv/gbuild/templates/Library.mk
+++ b/solenv/gbuild/templates/Library.mk
@@ -35,6 +35,10 @@ $(eval $(call gb_Library_Library,LIB))
# learn more about TYPE in the Package.mk template
$(eval $(call gb_Library_use_package,LIB,MODULE_TYPE))
+# for platforms supporting PCH: declare the location of the pch file
+# this is the name of the cxx file (without extension)
+$(eval $(call gb_Library_add_precompiled_header,LIB,$(SRCDIR)/MODULE/PCH_FILE))
+
# in case UNO services are exported: declare location of component file
$(eval $(call gb_Library_set_componentfile,LIB,MODULE/COMPONENT_FILE))