diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2019-09-21 17:41:25 +0200 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2019-10-04 08:58:39 +0200 |
commit | fd90ad734a931ddfdff4df9bfcf10f12a87b0286 (patch) | |
tree | 1b64d51b4ad94ada2c519a58f346f419e96cd9f9 | |
parent | 87608490f205b2fbc2b453ad8ded33050ac29b90 (diff) |
add gb_LinkTarget_reuse_precompiled_header
Similar to gb_LinkTarget_set_precompiled_header, but uses PCH
created by another linktarget. This allows using a PCH even for linktargets
that are small and creating their own dedicated PCHs is not worth it.
The ultimate goal is having some default PCH that will be used if no
explicit PCH is set.
Change-Id: I4d72acdba7181bb5c7c1cdead776f548be36ba33
Reviewed-on: https://gerrit.libreoffice.org/79362
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
-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 | 41 | ||||
-rw-r--r-- | solenv/gbuild/PrecompiledHeaders.mk | 21 | ||||
-rw-r--r-- | solenv/gbuild/StaticLibrary.mk | 1 | ||||
-rw-r--r-- | solenv/gbuild/TargetLocations.mk | 1 |
7 files changed, 60 insertions, 7 deletions
diff --git a/solenv/gbuild/CppunitTest.mk b/solenv/gbuild/CppunitTest.mk index 0d40bd6cdb5d..c44528131b81 100644 --- a/solenv/gbuild/CppunitTest.mk +++ b/solenv/gbuild/CppunitTest.mk @@ -445,6 +445,7 @@ gb_CppunitTest_add_asmobjects = $(call gb_CppunitTest__forward_to_Linktarget,$(0 gb_CppunitTest_use_package = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_CppunitTest_use_packages = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_CppunitTest_set_precompiled_header = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) +gb_CppunitTest_reuse_precompiled_header = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_CppunitTest_add_sdi_headers = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_CppunitTest_add_cflags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_CppunitTest_set_cflags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) diff --git a/solenv/gbuild/Executable.mk b/solenv/gbuild/Executable.mk index c43b33d02b24..7cc0b72d437c 100644 --- a/solenv/gbuild/Executable.mk +++ b/solenv/gbuild/Executable.mk @@ -143,6 +143,7 @@ gb_Executable_use_packages = $(call gb_Executable__forward_to_Linktarget,$(0),$( gb_Executable_use_unpacked = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Executable_add_sdi_headers = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Executable_set_precompiled_header = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) +gb_Executable_reuse_precompiled_header = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Executable_add_nativeres = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Executable_set_warnings_not_errors = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Executable_set_warnings_disabled = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) diff --git a/solenv/gbuild/Library.mk b/solenv/gbuild/Library.mk index a37787a7a7b4..9fec8ad45c13 100644 --- a/solenv/gbuild/Library.mk +++ b/solenv/gbuild/Library.mk @@ -226,6 +226,7 @@ gb_Library_use_packages = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2 gb_Library_use_unpacked = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Library_add_sdi_headers = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Library_set_precompiled_header = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) +gb_Library_reuse_precompiled_header = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Library_export_objects_list = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Library_add_nativeres = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Library_set_nativeres = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) diff --git a/solenv/gbuild/LinkTarget.mk b/solenv/gbuild/LinkTarget.mk index 2d9f35900d22..4fc16df1f3a8 100644 --- a/solenv/gbuild/LinkTarget.mk +++ b/solenv/gbuild/LinkTarget.mk @@ -1525,13 +1525,8 @@ $(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach sdi,$(2),$(call gb_SdiTa endef -# call gb_LinkTarget__set_precompiled_header_impl,linktarget,pchcxxfile,pchtarget,linktargetmakefilename -define gb_LinkTarget__set_precompiled_header_impl -$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_PrecompiledHeader_get_clean_target,$(3)) -$(call gb_PrecompiledHeader_get_target,$(3),$(4)) : $(call gb_CxxObject_get_source,$(SRCDIR),$(2)) - -$(call gb_PrecompiledHeader_get_target,$(3),$(4)) : $(call gb_LinkTarget_get_headers_target,$(1)) - +# call gb_LinkTarget__set_precompiled_header_variables,linktarget,pchcxxfile,pchtarget,linktargetmakefilename +define gb_LinkTarget__set_precompiled_header_variables $(call gb_LinkTarget_get_target,$(1)) : PCH_NAME := $(3) $(call gb_LinkTarget_get_target,$(1)) : PCH_LINKTARGETMAKEFILENAME := $(4) $(call gb_LinkTarget_get_target,$(1)) : PCHOBJEX = $(call gb_PrecompiledHeader_get_objectfile, $(call gb_PrecompiledHeader_get_target,$(3),$(4))) @@ -1543,10 +1538,21 @@ $(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $$(T_CXXFLAGS) $(call gb $(call gb_LinkTarget_get_target,$(1)) : DEFS += -DPCH_LEVEL=$(gb_ENABLE_PCH) $(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS += -DPCH_LEVEL=$(gb_ENABLE_PCH) +endef + +# call gb_LinkTarget__set_precompiled_header_impl,linktarget,pchcxxfile,pchtarget,linktargetmakefilename +define gb_LinkTarget__set_precompiled_header_impl +$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_PrecompiledHeader_get_clean_target,$(3)) +$(call gb_PrecompiledHeader_get_target,$(3),$(4)) : $(call gb_CxxObject_get_source,$(SRCDIR),$(2)) + +$(call gb_PrecompiledHeader_get_target,$(3),$(4)) : $(call gb_LinkTarget_get_headers_target,$(1)) + $(call gb_PrecompiledHeader_get_target,$(3),$(4)) : VISIBILITY := $(call gb_LinkTarget_get_pch_timestamp,$(4)) : $(call gb_PrecompiledHeader_get_target,$(3),$(4)) +$(call gb_LinkTarget__set_precompiled_header_variables,$(1),$(2),$(3),$(4)) + ifeq ($(gb_FULLDEPS),$(true)) -include $(call gb_PrecompiledHeader_get_dep_target,$(3),$(4)) endif @@ -1562,6 +1568,27 @@ endif endef +# call gb_LinkTarget__reuse_precompiled_header_impl,linktarget,pchcxxfile,pchtarget,linktargetmakefilename +# Use the PCH as if it was LinkTarget's own, but do nothing with the PCH itself, just depend on it. +define gb_LinkTarget__reuse_precompiled_header_impl +$(call gb_LinkTarget__set_precompiled_header_variables,$(1),$(2),$(3),$(4)) + +$(call gb_LinkTarget_get_pch_timestamp,$(4)) : $(call gb_LinkTarget_get_pch_reuse_timestamp,$(4)) + +$(call gb_LinkTarget_get_pch_reuse_timestamp,$(4)) : $(call gb_PrecompiledHeader_get_target,$(3),$(4)) + $(call gb_PrecompiledHeader_check_flags,$(4),$(2),\ + $(call gb_PrecompiledHeader_get_target,$(3),$(4)),$$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS)) + +endef + +# call gb_LinkTarget_reuse_precompiled_header,linktarget,pchcxxfile,,linktargetmakefilename +define gb_LinkTarget_reuse_precompiled_header +ifneq ($(gb_ENABLE_PCH),) +$(call gb_LinkTarget__reuse_precompiled_header_impl,$(1),$(2),$(notdir $(2)),$(4)) +endif + +endef + # use a header package, possibly from another module # call gb_LinkTarget_use_package,linktarget,package define gb_LinkTarget_use_package diff --git a/solenv/gbuild/PrecompiledHeaders.mk b/solenv/gbuild/PrecompiledHeaders.mk index 6654cf7259a2..8854784c5a41 100644 --- a/solenv/gbuild/PrecompiledHeaders.mk +++ b/solenv/gbuild/PrecompiledHeaders.mk @@ -43,6 +43,7 @@ $(call gb_PrecompiledHeader_get_target,$(1),$(2)) : rm -f $$@ $$(call gb_PrecompiledHeader__command,$$@,$(1),$$<,$$(PCH_DEFS),$$(PCH_CXXFLAGS) $$(gb_PrecompiledHeader_EXCEPTIONFLAGS),$$(INCLUDE),$(2)) $$(call gb_PrecompiledHeader__sum_command,$$@,$(1),$$<,$$(PCH_DEFS),$$(PCH_CXXFLAGS) $$(gb_PrecompiledHeader_EXCEPTIONFLAGS),$$(INCLUDE),$(2)) + echo $$(sort $$(PCH_DEFS) $$(PCH_CXXFLAGS) $$(gb_PrecompiledHeader_EXCEPTIONFLAGS)) > $$(call gb_PrecompiledHeader_get_target,$(1),$(2)).flags ifeq ($(gb_FULLDEPS),$(true)) $$(call gb_Helper_abbreviate_dirs,\ RESPONSEFILE=$$(call var2file,$$(shell $$(gb_MKTEMP)),200,$$(call gb_PrecompiledHeader_get_dep_target_tmp,$(1),$(2))) && \ @@ -59,6 +60,7 @@ $(call gb_PrecompiledHeader_get_clean_target,$(1)) : $$(call gb_PrecompiledHeader_get_target,$(1),$(2)).obj \ $$(call gb_PrecompiledHeader_get_target,$(1),$(2)).pdb \ $$(call gb_PrecompiledHeader_get_target,$(1),$(2)).sum \ + $$(call gb_PrecompiledHeader_get_target,$(1),$(2)).flags \ $$(call gb_PrecompiledHeader_get_dep_target,$(1),$(2))) endef @@ -69,6 +71,25 @@ endif define gb_PrecompiledHeader_generate_timestamp_rule $(call gb_LinkTarget_get_pch_timestamp,$(1)) : mkdir -p $$(dir $$@) && touch $$@ + +endef + +# $(call gb_PrecompiledHeader_check_saved_flags_command_pattern,linktargetmakefilename,pchcxxfile,pchfile,flags) +# When creating a PCH, the PCH's CXXFLAGS are saved to a matching .flags file. When reusing the PCH +# from another linktarget, use the file to check that the linktarget uses the same CXXFLAGS as the PCH. +# This complements the check in gb_CxxObject__set_pchflags. +define gb_PrecompiledHeader_check_flags +$$(call gb_Helper_abbreviate_dirs,\ + grep -q -x -F -- "$$(sort $(4))" $(3).flags || ( \ + echo Error reusing $(2) by $(1). >&2 && \ + echo -n " precompiled header flags : ">&2 && \ + cat $(3).flags >&2 && \ + echo " object flags : "$$(sort $(4)) >&2 && \ + echo Incorrect precompiled header setup or internal gbuild error. >&2 ; \ + exit 1) && \ + mkdir -p $$(dir $$@) && touch $$@ \ +) + endef # vim: set noet sw=4: diff --git a/solenv/gbuild/StaticLibrary.mk b/solenv/gbuild/StaticLibrary.mk index 38f60f2e697a..da916a239d35 100644 --- a/solenv/gbuild/StaticLibrary.mk +++ b/solenv/gbuild/StaticLibrary.mk @@ -114,6 +114,7 @@ gb_StaticLibrary_use_external_project = $(call gb_StaticLibrary__forward_to_Link gb_StaticLibrary_use_static_libraries = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_StaticLibrary_add_sdi_headers = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_StaticLibrary_set_precompiled_header = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3)) +gb_StaticLibrary_reuse_precompiled_header = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_StaticLibrary_set_warnings_not_errors = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_StaticLibrary_set_warnings_disabled = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_StaticLibrary_set_external_code = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3)) diff --git a/solenv/gbuild/TargetLocations.mk b/solenv/gbuild/TargetLocations.mk index 14f738f7ee6f..ddcb753cb12d 100644 --- a/solenv/gbuild/TargetLocations.mk +++ b/solenv/gbuild/TargetLocations.mk @@ -122,6 +122,7 @@ gb_LinkTarget_get_clean_target = \ $(WORKDIR)/Clean/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1)) gb_LinkTarget_get_target = $(lastword $(subst <>, ,$(1))) gb_LinkTarget_get_pch_timestamp = $(WORKDIR)/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(1))/Timestamps/$(1) +gb_LinkTarget_get_pch_reuse_timestamp = $(WORKDIR)/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(1))/Timestamps/$(1)_reuse gb_Module_get_nonl10n_target = $(WORKDIR)/Module/nonl10n/$(1) gb_Module_get_l10n_target = $(WORKDIR)/Module/l10n/$(1) gb_Module_get_check_target = $(WORKDIR)/Module/check/$(1) |