diff options
-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) |