diff options
author | Luboš Luňák <l.lunak@suse.cz> | 2012-06-22 19:12:04 +0200 |
---|---|---|
committer | Luboš Luňák <l.lunak@suse.cz> | 2012-12-10 14:46:44 +0100 |
commit | d29a5b367c20c979ec9349dda85a4b947742cb2a (patch) | |
tree | 6266aa516c057ed3f14b5441fc0bbe6ae908bdff | |
parent | d85029d38034a392079316daeca2ca6a82f65349 (diff) |
bring back precompiled headers support
This is mostly a revert of 992757cc5ebfb1df42636b8d3269cdbc10fc4148
and bc78ac68c2492e63a680f68b524c4a51179ea83e, with tweaks to apply.
Also only MSVC support for now.
Change-Id: Ia926b3c28125b52012156ccfd47932837b09d20a
-rw-r--r-- | config_host.mk.in | 1 | ||||
-rw-r--r-- | configure.ac | 23 | ||||
-rw-r--r-- | solenv/gbuild/CppunitTest.mk | 1 | ||||
-rw-r--r-- | solenv/gbuild/Executable.mk | 1 | ||||
-rw-r--r-- | solenv/gbuild/Library.mk | 1 | ||||
-rw-r--r-- | solenv/gbuild/LinkTarget.mk | 86 | ||||
-rw-r--r-- | solenv/gbuild/PrecompiledHeaders.mk | 78 | ||||
-rw-r--r-- | solenv/gbuild/StaticLibrary.mk | 1 | ||||
-rw-r--r-- | solenv/gbuild/TargetLocations.mk | 6 | ||||
-rw-r--r-- | solenv/gbuild/gbuild.help.txt | 2 | ||||
-rw-r--r-- | solenv/gbuild/gbuild.mk | 7 | ||||
-rw-r--r-- | solenv/gbuild/platform/com_MSC_class.mk | 41 | ||||
-rw-r--r-- | solenv/gbuild/platform/com_MSC_defs.mk | 4 | ||||
-rw-r--r-- | solenv/gbuild/templates/Library.mk | 4 |
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)) |