summaryrefslogtreecommitdiff
path: root/solenv
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2021-11-12 11:34:41 +0100
committerLuboš Luňák <l.lunak@collabora.com>2021-11-12 13:21:19 +0100
commit5e7421b3895aa69ea874fc2ccf0f615b1163fbda (patch)
tree1544a0dcba517b38847fd868e9120211145fb686 /solenv
parent7a65f43709b2945cca935158c72c28dc77ba65b2 (diff)
rebuild a PCH when the flags it was built with change
We already store the flags in a .flags file for another use, so just handle the file as another make rule before the PCH rule and if the file changes then the PCH rule will depend on something that has changed. Change-Id: Ic43068273a40c0337b77221660f370780a21340c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125094 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'solenv')
-rw-r--r--solenv/gbuild/LinkTarget.mk5
-rw-r--r--solenv/gbuild/PrecompiledHeaders.mk20
-rw-r--r--solenv/gbuild/TargetLocations.mk1
3 files changed, 18 insertions, 8 deletions
diff --git a/solenv/gbuild/LinkTarget.mk b/solenv/gbuild/LinkTarget.mk
index fe40fcbaf4ac..71be0790b59b 100644
--- a/solenv/gbuild/LinkTarget.mk
+++ b/solenv/gbuild/LinkTarget.mk
@@ -1853,6 +1853,7 @@ 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)) : $(patsubst %.cxx,%.hxx,$(call gb_CxxObject_get_source,$(SRCDIR),$(2)))
+$(call gb_PrecompiledHeader_get_target,$(3),$(4)) : $(call gb_PrecompiledHeader_get_flags_file,$(3),$(4))
$(call gb_PrecompiledHeader_get_target,$(3),$(4)) : $(call gb_LinkTarget_get_headers_target,$(1))
@@ -1912,7 +1913,9 @@ $(call gb_LinkTarget_get_pch_timestamp,$(4)) : $(call gb_LinkTarget_get_pch_reus
# Depending directly on the PCH could cause that PCH to be built with this linktarget's flags.
$(call gb_LinkTarget_get_pch_reuse_timestamp,$(4)) : $(call gb_PrecompiledHeader_get_for_reuse_target,$(3),$(4))
$(call gb_PrecompiledHeader_check_flags,$(4),$(2),\
- $(call gb_PrecompiledHeader_get_target,$(3),$(4)),$$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS))
+ $(call gb_PrecompiledHeader_get_target,$(3),$(4)),\
+ $(call gb_PrecompiledHeader_get_flags_file,$(3),$(4)),\
+ $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS))
$$(call gb_PrecompiledHeader__copy_reuse_files,$(1),$(3),$(4))
mkdir -p $$(dir $$@) && touch $$@
diff --git a/solenv/gbuild/PrecompiledHeaders.mk b/solenv/gbuild/PrecompiledHeaders.mk
index 60c56950350f..28f2308c8e92 100644
--- a/solenv/gbuild/PrecompiledHeaders.mk
+++ b/solenv/gbuild/PrecompiledHeaders.mk
@@ -44,6 +44,13 @@ $(call gb_PrecompiledHeader_get_dep_target,$(1),$(3)) :
mkdir -p $$(dir $$@) && \
echo "$$(call gb_PrecompiledHeader_get_target,$(1),$(3)) : $$(gb_Helper_PHONY)" > $$@)
+# keep the flags the PCH was built with in a separate file, update the file if and only if the flags
+# change, and make the PCH depend on it => the PCH will be rebuilt on any flags change
+.PHONY: force
+$(call gb_PrecompiledHeader_get_flags_file,$(1),$(3)) : force
+ echo $$(sort $$(PCH_DEFS) $$(PCH_CXXFLAGS) $$(gb_PrecompiledHeader_EXCEPTIONFLAGS)) | cmp -s - $$@ \
+ || echo $$(sort $$(PCH_DEFS) $$(PCH_CXXFLAGS) $$(gb_PrecompiledHeader_EXCEPTIONFLAGS)) > $$@
+
# despite this being only one .d file, need to run concat-deps on it to
# re-write external headers from UnpackedTarball
$(call gb_PrecompiledHeader_get_target,$(1),$(3)) :
@@ -52,7 +59,6 @@ $(call gb_PrecompiledHeader_get_target,$(1),$(3)) :
rm -f $$@
$$(call gb_PrecompiledHeader__command,$$@,$(1),$$<,$$(PCH_DEFS),$$(PCH_CXXFLAGS) $$(gb_PrecompiledHeader_EXCEPTIONFLAGS),$$(INCLUDE),$(3),$(5))
$$(call gb_PrecompiledHeader__sum_command,$$@,$(1),$$<,$$(PCH_DEFS),$$(PCH_CXXFLAGS) $$(gb_PrecompiledHeader_EXCEPTIONFLAGS),$$(INCLUDE),$(3))
- echo $$(sort $$(PCH_DEFS) $$(PCH_CXXFLAGS) $$(gb_PrecompiledHeader_EXCEPTIONFLAGS)) > $$(call gb_PrecompiledHeader_get_target,$(1),$(3)).flags
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))) && \
@@ -73,8 +79,8 @@ $(call gb_PrecompiledHeader_get_clean_target,$(1)) :
$$(call gb_PrecompiledHeader_get_target,$(1),$(3)).obj \
$$(call gb_PrecompiledHeader_get_target,$(1),$(3)).pdb \
$$(call gb_PrecompiledHeader_get_target,$(1),$(3)).sum \
- $$(call gb_PrecompiledHeader_get_target,$(1),$(3)).flags \
- $$(call gb_PrecompiledHeader_get_target,$(1),$(3)).reuse \
+ $$(call gb_PrecompiledHeader_get_flags_file,$(1),$(3)) \
+ $$(call gb_PrecompiledHeader_get_for_reuse_target,$(1),$(3)) \
$$(call gb_PrecompiledHeader_get_dep_target,$(1),$(3)))
endef
@@ -85,12 +91,12 @@ endef
# This complements the check in gb_CxxObject__set_pchflags.
define gb_PrecompiledHeader_check_flags
$$(call gb_Helper_abbreviate_dirs,\
- $$(if $$(strip $$(call gb_PrecompiledHeader_check_flags_internal,$$(shell cat $(3).flags),$(4),$(2))),false,true) || ( \
+ $$(if $$(strip $$(call gb_PrecompiledHeader_check_flags_internal,$$(shell cat $(4)),$(5),$(2))),false,true) || ( \
echo Error reusing $(2) by $(1). >&2 && \
echo -n " precompiled header flags : ">&2 && \
- cat $(3).flags >&2 && \
- echo " object flags : "$$(sort $(4)) >&2 && \
- echo " reason : $$(call gb_PrecompiledHeader_check_flags_internal,$$(shell cat $(3).flags),$(4),$(2))" >&2 && \
+ cat $(4) >&2 && \
+ echo " object flags : "$$(sort $(5)) >&2 && \
+ echo " reason : $$(call gb_PrecompiledHeader_check_flags_internal,$$(shell cat $(4)),$(5),$(2))" >&2 && \
echo Incorrect precompiled header setup or internal gbuild error. >&2 ; \
exit 1) \
)
diff --git a/solenv/gbuild/TargetLocations.mk b/solenv/gbuild/TargetLocations.mk
index 2559dddd46ef..e65e0759a2ab 100644
--- a/solenv/gbuild/TargetLocations.mk
+++ b/solenv/gbuild/TargetLocations.mk
@@ -157,6 +157,7 @@ gb_PackageInfo_get_target = $(WORKDIR)/PackageInfo
gb_Postprocess_get_target = $(WORKDIR)/Postprocess/$(1)
gb_PrecompiledHeader_get_dep_target = $(WORKDIR)/Dep/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(2))/$(1).hxx$(gb_PrecompiledHeader_EXT).d
gb_PrecompiledHeader_get_dep_target_tmp = $(call gb_PrecompiledHeader_get_dep_target,$(1),$(2)).tmp
+gb_PrecompiledHeader_get_flags_file = $(WORKDIR)/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(2))/$(1).hxx$(gb_PrecompiledHeader_EXT).flags
gb_PrecompiledHeader_get_for_reuse_target = $(WORKDIR)/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(2))/$(1).hxx$(gb_PrecompiledHeader_EXT).reuse
gb_PrecompiledHeader_get_target = $(WORKDIR)/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(2))/$(1).hxx$(gb_PrecompiledHeader_EXT)
gb_PropertiesTranslateTarget_get_target = $(WORKDIR)/PropertiesTranslateTarget/$(1).properties