buildroot/package/skeleton-custom/skeleton-custom.mk
Yann E. MORIN aff2f73958 Revert "package/skeleton-custom: also check for missing directories"
This partially reverts commit cf6d321e9d.

The underlying reason for doing the checks is to ensure that a
merged-usr setting is properly enforced, even for custom skeletons.

Before that patch, a custom skeleton where both /bin and /usr/bin were
missing was accepted; but then the first package that intalled something
in /bin would create it as a directory, thus breaking the merged-usr
situation. Ditto sbin and lib, of course.

cf6d321 was created to detect that situation, and the fix was to require
that both directories do exist in the custom skeleton, so that we new
the check for consistency were OK, in all cases.

However, that broke existing skeletons which where missing both
directories, and some people are shinning about it...

The crux of the problem is that Buildroot should be responsible for
creating the directories or the symliks when they are missing, and only
fail if the existing ones are incorrect, but not impose the burden on
the user.

A situation where the problem arises is when a skeleton is shared
between various builds, some using a merged-usr while other do not.

We fix that by reverting the offending changes change, back to the
previous behaviour. We keep the stderr redirection in stat calls, and
the variable renaming.

A proper fix to create the missing directories can be added later.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Arnout Vandecappelle <arnout@mind.be>
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
2017-08-09 23:26:01 +02:00

82 lines
3.2 KiB
Makefile

################################################################################
#
# skeleton-custom
#
################################################################################
# The skeleton can't depend on the toolchain, since all packages depends on the
# skeleton and the toolchain is a target package, as is skeleton.
# Hence, skeleton would depends on the toolchain and the toolchain would depend
# on skeleton.
SKELETON_CUSTOM_ADD_TOOLCHAIN_DEPENDENCY = NO
SKELETON_CUSTOM_ADD_SKELETON_DEPENDENCY = NO
SKELETON_CUSTOM_PROVIDES = skeleton
SKELETON_CUSTOM_INSTALL_STAGING = YES
SKELETON_CUSTOM_PATH = $(call qstrip,$(BR2_ROOTFS_SKELETON_CUSTOM_PATH))
ifeq ($(BR2_PACKAGE_SKELETON_CUSTOM)$(BR_BUILDING),yy)
ifeq ($(SKELETON_CUSTOM_PATH),)
$(error No path specified for the custom skeleton)
endif
endif
# Extract the inode numbers for all of those directories. In case any is
# a symlink, we want to get the inode of the pointed-to directory, so we
# append '/.' to be sure we get the target directory. Since the symlinks
# can be anyway (/bin -> /usr/bin or /usr/bin -> /bin), we do that for
# all of them.
#
SKELETON_CUSTOM_LIB_INODE = $(shell stat -c '%i' $(SKELETON_CUSTOM_PATH)/lib/. 2>/dev/null)
SKELETON_CUSTOM_BIN_INODE = $(shell stat -c '%i' $(SKELETON_CUSTOM_PATH)/bin/. 2>/dev/null)
SKELETON_CUSTOM_SBIN_INODE = $(shell stat -c '%i' $(SKELETON_CUSTOM_PATH)/sbin/. 2>/dev/null)
SKELETON_CUSTOM_USR_LIB_INODE = $(shell stat -c '%i' $(SKELETON_CUSTOM_PATH)/usr/lib/. 2>/dev/null)
SKELETON_CUSTOM_USR_BIN_INODE = $(shell stat -c '%i' $(SKELETON_CUSTOM_PATH)/usr/bin/. 2>/dev/null)
SKELETON_CUSTOM_USR_SBIN_INODE = $(shell stat -c '%i' $(SKELETON_CUSTOM_PATH)/usr/sbin/. 2>/dev/null)
# For a merged /usr, ensure that /lib, /bin and /sbin and their /usr
# counterparts are appropriately setup as symlinks ones to the others.
ifeq ($(BR2_ROOTFS_MERGED_USR),y)
ifneq ($(SKELETON_CUSTOM_LIB_INODE),$(SKELETON_CUSTOM_USR_LIB_INODE))
SKELETON_CUSTOM_NOT_MERGED_USR_DIRS += /lib
endif
ifneq ($(SKELETON_CUSTOM_BIN_INODE),$(SKELETON_CUSTOM_USR_BIN_INODE))
SKELETON_CUSTOM_NOT_MERGED_USR_DIRS += /bin
endif
ifneq ($(SKELETON_CUSTOM_SBIN_INODE),$(SKELETON_CUSTOM_USR_SBIN_INODE))
SKELETON_CUSTOM_NOT_MERGED_USR_DIRS += /sbin
endif
endif # merged /usr
ifeq ($(BR2_PACKAGE_SKELETON_CUSTOM)$(BR_BUILDING),yy)
ifneq ($(SKELETON_CUSTOM_NOT_MERGED_USR_DIRS),)
$(error The custom skeleton in $(SKELETON_CUSTOM_PATH) is not \
using a merged /usr for the following directories: \
$(SKELETON_CUSTOM_NOT_MERGED_USR_DIRS))
endif
endif
# The target-dir-warning file and the lib{32,64} symlinks are the only
# things we customise in the custom skeleton.
define SKELETON_CUSTOM_INSTALL_TARGET_CMDS
$(call SYSTEM_RSYNC,$(SKELETON_CUSTOM_PATH),$(TARGET_DIR))
$(call SYSTEM_LIB_SYMLINK,$(TARGET_DIR))
$(INSTALL) -m 0644 support/misc/target-dir-warning.txt \
$(TARGET_DIR_WARNING_FILE)
endef
# For the staging dir, we don't really care what we install, but we
# need the /lib and /usr/lib appropriately setup. Since we ensure,
# above, that they are correct in the skeleton, we can simply copy the
# skeleton to staging.
define SKELETON_CUSTOM_INSTALL_STAGING_CMDS
$(call SYSTEM_RSYNC,$(SKELETON_CUSTOM_PATH),$(STAGING_DIR))
$(call SYSTEM_LIB_SYMLINK,$(STAGING_DIR))
endef
$(eval $(generic-package))