core: fix packages-file-list.txt after an incremental build
The package instrumentation step 'step_pkg_size' is populating the files: output/build/packages-file-list.txt output/build/packages-file-list-staging.txt output/build/packages-file-list-host.txt by comparing the list of files before and after installation of a package, with some clever tricks to detect changes to existing files etc. As an optimization, instead of gathering this list before and after each package, where the 'after-state' of one package is the same as the 'before-state' of the next package, only the 'after-state' is used and is shared between packages. This works fine, except at the end of the build, as explained next. In the target-finalize step, many files will be touched. For example, files like /etc/hosts, /etc/os-release, but also all object files that are stripped, and all files touched by post-build scripts or created by rootfs overlays. This means that the 'after-state' of the last package does not reflect the actual situation after target-finalize is run. For a single complete build this poses no problem. But, if one incrementally rebuilds a package after the initial build, e.g. with 'make foo-rebuild', then all changes that happened in target-finalize at the end of the initial build (the 'after-state' of the last package built) will be detected as changes caused by the rebuild of package foo. As a result, all these files will incorrectly be treated as 'owned' by package foo. Correct this situation by capturing a new state at the end of target-finalize, so that the 'before-state' of an incremental build will be correct. Note: the reasoning above talks about packages-file-list.txt and target-finalize, but also applies to packages-file-list-staging.txt/staging-finalize and packages-file-list-host.txt/host-finalize. Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
This commit is contained in:
parent
5abe7e4ce3
commit
509db3b88a
10
Makefile
10
Makefile
@ -801,6 +801,16 @@ endif # merged /usr
|
|||||||
|
|
||||||
touch $(TARGET_DIR)/usr
|
touch $(TARGET_DIR)/usr
|
||||||
|
|
||||||
|
# AFTER ALL FILE-CHANGING ACTIONS:
|
||||||
|
# Update timestamps in internal file list to fix attribution of files
|
||||||
|
# to packages on subsequent builds
|
||||||
|
$(call step_pkg_size_file_list,$(TARGET_DIR))
|
||||||
|
$(call step_pkg_size_finalize)
|
||||||
|
$(call step_pkg_size_file_list,$(STAGING_DIR),-staging)
|
||||||
|
$(call step_pkg_size_finalize,-staging)
|
||||||
|
$(call step_pkg_size_file_list,$(HOST_DIR),-host)
|
||||||
|
$(call step_pkg_size_finalize,-host)
|
||||||
|
|
||||||
.PHONY: target-post-image
|
.PHONY: target-post-image
|
||||||
target-post-image: $(TARGETS_ROOTFS) target-finalize staging-finalize
|
target-post-image: $(TARGETS_ROOTFS) target-finalize staging-finalize
|
||||||
@rm -f $(ROOTFS_COMMON_TAR)
|
@rm -f $(ROOTFS_COMMON_TAR)
|
||||||
|
@ -57,6 +57,23 @@ GLOBAL_INSTRUMENTATION_HOOKS += step_time
|
|||||||
|
|
||||||
# Hooks to collect statistics about installed files
|
# Hooks to collect statistics about installed files
|
||||||
|
|
||||||
|
# Helper function to create the file list -- also used from target-finalize
|
||||||
|
# $(1): base directory to search in
|
||||||
|
# $(2): suffix of file (optional)
|
||||||
|
define step_pkg_size_file_list
|
||||||
|
cd $(1); \
|
||||||
|
LC_ALL=C find . \( -type f -o -type l \) -printf '%T@:%i:%#m:%y:%s,%p\n' \
|
||||||
|
| LC_ALL=C sort > $(BUILD_DIR)/.files-list$(2).new
|
||||||
|
endef
|
||||||
|
|
||||||
|
# Helper function to mark the latest file list as the reference for next
|
||||||
|
# iteration -- also used from target-finalize
|
||||||
|
# $(1): suffix of file (optional)
|
||||||
|
define step_pkg_size_finalize
|
||||||
|
mv $(BUILD_DIR)/.files-list$(1).new \
|
||||||
|
$(BUILD_DIR)/.files-list$(1).stat
|
||||||
|
endef
|
||||||
|
|
||||||
# The suffix is typically empty for the target variant, for legacy backward
|
# The suffix is typically empty for the target variant, for legacy backward
|
||||||
# compatibility.
|
# compatibility.
|
||||||
# $(1): package name
|
# $(1): package name
|
||||||
@ -66,9 +83,7 @@ define step_pkg_size_inner
|
|||||||
@touch $(BUILD_DIR)/.files-list$(3).stat
|
@touch $(BUILD_DIR)/.files-list$(3).stat
|
||||||
@touch $(BUILD_DIR)/packages-file-list$(3).txt
|
@touch $(BUILD_DIR)/packages-file-list$(3).txt
|
||||||
$(SED) '/^$(1),/d' $(BUILD_DIR)/packages-file-list$(3).txt
|
$(SED) '/^$(1),/d' $(BUILD_DIR)/packages-file-list$(3).txt
|
||||||
cd $(2); \
|
$(call step_pkg_size_file_list,$(2),$(3))
|
||||||
LC_ALL=C find . \( -type f -o -type l \) -printf '%T@:%i:%#m:%y:%s,%p\n' \
|
|
||||||
| LC_ALL=C sort > $(BUILD_DIR)/.files-list$(3).new
|
|
||||||
LC_ALL=C comm -13 \
|
LC_ALL=C comm -13 \
|
||||||
$(BUILD_DIR)/.files-list$(3).stat \
|
$(BUILD_DIR)/.files-list$(3).stat \
|
||||||
$(BUILD_DIR)/.files-list$(3).new \
|
$(BUILD_DIR)/.files-list$(3).new \
|
||||||
@ -76,8 +91,7 @@ define step_pkg_size_inner
|
|||||||
sed -r -e 's/^[^,]+/$(1)/' \
|
sed -r -e 's/^[^,]+/$(1)/' \
|
||||||
$($(PKG)_BUILDDIR)/.files-list$(3).txt \
|
$($(PKG)_BUILDDIR)/.files-list$(3).txt \
|
||||||
>> $(BUILD_DIR)/packages-file-list$(3).txt
|
>> $(BUILD_DIR)/packages-file-list$(3).txt
|
||||||
mv $(BUILD_DIR)/.files-list$(3).new \
|
$(call step_pkg_size_finalize,$(3))
|
||||||
$(BUILD_DIR)/.files-list$(3).stat
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define step_pkg_size
|
define step_pkg_size
|
||||||
|
Loading…
Reference in New Issue
Block a user