xref: /OK3568_Linux_fs/buildroot/fs/common.mk (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#
2*4882a593Smuzhiyun# Macro that builds the needed Makefile target to create a root
3*4882a593Smuzhiyun# filesystem image.
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun# The following variable must be defined before calling this macro
6*4882a593Smuzhiyun#
7*4882a593Smuzhiyun#  ROOTFS_$(FSTYPE)_CMD, the command that generates the root
8*4882a593Smuzhiyun#  filesystem image. A single command is allowed. The filename of the
9*4882a593Smuzhiyun#  filesystem image that it must generate is $$@.
10*4882a593Smuzhiyun#
11*4882a593Smuzhiyun# The following variables can optionaly be defined
12*4882a593Smuzhiyun#
13*4882a593Smuzhiyun#  ROOTFS_$(FSTYPE)_DEPENDENCIES, the list of dependencies needed to
14*4882a593Smuzhiyun#  build the root filesystem (usually host tools)
15*4882a593Smuzhiyun#
16*4882a593Smuzhiyun#  ROOTFS_$(FSTYPE)_PRE_GEN_HOOKS, a list of hooks to call before
17*4882a593Smuzhiyun#  generating the filesystem image
18*4882a593Smuzhiyun#
19*4882a593Smuzhiyun#  ROOTFS_$(FSTYPE)_POST_GEN_HOOKS, a list of hooks to call after
20*4882a593Smuzhiyun#  generating the filesystem image
21*4882a593Smuzhiyun#
22*4882a593Smuzhiyun# In terms of configuration option, this macro assumes that the
23*4882a593Smuzhiyun# BR2_TARGET_ROOTFS_$(FSTYPE) config option allows to enable/disable
24*4882a593Smuzhiyun# the generation of a filesystem image of a particular type. If
25*4882a593Smuzhiyun# the configuration options BR2_TARGET_ROOTFS_$(FSTYPE)_GZIP,
26*4882a593Smuzhiyun# BR2_TARGET_ROOTFS_$(FSTYPE)_BZIP2 or
27*4882a593Smuzhiyun# BR2_TARGET_ROOTFS_$(FSTYPE)_LZMA exist and are enabled, then the
28*4882a593Smuzhiyun# macro will automatically generate a compressed filesystem image.
29*4882a593Smuzhiyun
30*4882a593SmuzhiyunFS_DIR = $(BUILD_DIR)/buildroot-fs
31*4882a593SmuzhiyunROOTFS_DEVICE_TABLES = $(call qstrip,$(BR2_ROOTFS_DEVICE_TABLE) \
32*4882a593Smuzhiyun	$(BR2_ROOTFS_STATIC_DEVICE_TABLE))
33*4882a593Smuzhiyun
34*4882a593SmuzhiyunROOTFS_USERS_TABLES = $(call qstrip,$(BR2_ROOTFS_USERS_TABLES))
35*4882a593Smuzhiyun
36*4882a593SmuzhiyunROOTFS_FULL_DEVICES_TABLE = $(FS_DIR)/full_devices_table.txt
37*4882a593SmuzhiyunROOTFS_FULL_USERS_TABLE = $(FS_DIR)/full_users_table.txt
38*4882a593Smuzhiyun
39*4882a593SmuzhiyunROOTFS_COMMON_NAME = rootfs-common
40*4882a593SmuzhiyunROOTFS_COMMON_TYPE = rootfs
41*4882a593SmuzhiyunROOTFS_COMMON_DEPENDENCIES = \
42*4882a593Smuzhiyun	host-fakeroot host-makedevs \
43*4882a593Smuzhiyun	$(BR2_TAR_HOST_DEPENDENCY) \
44*4882a593Smuzhiyun	$(if $(PACKAGES_USERS)$(ROOTFS_USERS_TABLES),host-mkpasswd)
45*4882a593Smuzhiyun
46*4882a593Smuzhiyunifeq ($(BR2_REPRODUCIBLE),y)
47*4882a593Smuzhiyundefine ROOTFS_REPRODUCIBLE
48*4882a593Smuzhiyun	find $(TARGET_DIR) -print0 | xargs -0 -r touch -hd @$(SOURCE_DATE_EPOCH)
49*4882a593Smuzhiyunendef
50*4882a593Smuzhiyunendif
51*4882a593Smuzhiyun
52*4882a593Smuzhiyunifeq ($(BR2_PACKAGE_REFPOLICY),y)
53*4882a593Smuzhiyundefine ROOTFS_SELINUX
54*4882a593Smuzhiyun	$(HOST_DIR)/sbin/setfiles -m -r $(TARGET_DIR) \
55*4882a593Smuzhiyun		-c $(TARGET_DIR)/etc/selinux/targeted/policy/policy.$(BR2_PACKAGE_LIBSEPOL_POLICY_VERSION) \
56*4882a593Smuzhiyun		$(TARGET_DIR)/etc/selinux/targeted/contexts/files/file_contexts \
57*4882a593Smuzhiyun		$(TARGET_DIR)
58*4882a593Smuzhiyunendef
59*4882a593SmuzhiyunROOTFS_COMMON_DEPENDENCIES += host-policycoreutils
60*4882a593Smuzhiyunendif
61*4882a593Smuzhiyun
62*4882a593SmuzhiyunROOTFS_COMMON_FINAL_RECURSIVE_DEPENDENCIES = $(sort \
63*4882a593Smuzhiyun	$(if $(filter undefined,$(origin ROOTFS_COMMON_FINAL_RECURSIVE_DEPENDENCIES__X)), \
64*4882a593Smuzhiyun		$(eval ROOTFS_COMMON_FINAL_RECURSIVE_DEPENDENCIES__X := \
65*4882a593Smuzhiyun			$(foreach p, \
66*4882a593Smuzhiyun				$(ROOTFS_COMMON_DEPENDENCIES), \
67*4882a593Smuzhiyun				$(p) \
68*4882a593Smuzhiyun				$($(call UPPERCASE,$(p))_FINAL_RECURSIVE_DEPENDENCIES) \
69*4882a593Smuzhiyun			) \
70*4882a593Smuzhiyun		) \
71*4882a593Smuzhiyun	) \
72*4882a593Smuzhiyun	$(ROOTFS_COMMON_FINAL_RECURSIVE_DEPENDENCIES__X))
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun.PHONY: rootfs-common
75*4882a593Smuzhiyunrootfs-common: $(ROOTFS_COMMON_DEPENDENCIES) target-finalize
76*4882a593Smuzhiyun	@$(call MESSAGE,"Generating root filesystems common tables")
77*4882a593Smuzhiyun	rm -rf $(FS_DIR)
78*4882a593Smuzhiyun	mkdir -p $(FS_DIR)
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun	$(call PRINTF,$(PACKAGES_USERS)) >> $(ROOTFS_FULL_USERS_TABLE)
81*4882a593Smuzhiyunifneq ($(ROOTFS_USERS_TABLES),)
82*4882a593Smuzhiyun	cat $(ROOTFS_USERS_TABLES) >> $(ROOTFS_FULL_USERS_TABLE)
83*4882a593Smuzhiyunendif
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun	$(call PRINTF,$(PACKAGES_PERMISSIONS_TABLE)) > $(ROOTFS_FULL_DEVICES_TABLE)
86*4882a593Smuzhiyunifneq ($(ROOTFS_DEVICE_TABLES),)
87*4882a593Smuzhiyun	cat $(ROOTFS_DEVICE_TABLES) >> $(ROOTFS_FULL_DEVICES_TABLE)
88*4882a593Smuzhiyunendif
89*4882a593Smuzhiyunifeq ($(BR2_ROOTFS_DEVICE_CREATION_STATIC),y)
90*4882a593Smuzhiyun	$(call PRINTF,$(PACKAGES_DEVICES_TABLE)) >> $(ROOTFS_FULL_DEVICES_TABLE)
91*4882a593Smuzhiyunendif
92*4882a593Smuzhiyun
93*4882a593Smuzhiyunrootfs-common-show-depends:
94*4882a593Smuzhiyun	@echo $(ROOTFS_COMMON_DEPENDENCIES)
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun.PHONY: rootfs-common-show-info
97*4882a593Smuzhiyunrootfs-common-show-info:
98*4882a593Smuzhiyun	@:
99*4882a593Smuzhiyun	$(info $(call clean-json,{ $(call json-info,ROOTFS_COMMON) }))
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun# Since this function will be called from within an $(eval ...)
102*4882a593Smuzhiyun# all variable references except the arguments must be $$-quoted.
103*4882a593Smuzhiyundefine inner-rootfs
104*4882a593Smuzhiyun
105*4882a593SmuzhiyunROOTFS_$(2)_NAME = rootfs-$(1)
106*4882a593SmuzhiyunROOTFS_$(2)_TYPE = rootfs
107*4882a593SmuzhiyunROOTFS_$(2)_IMAGE_NAME ?= rootfs.$(1)
108*4882a593SmuzhiyunROOTFS_$(2)_FINAL_IMAGE_NAME = $$(strip $$(ROOTFS_$(2)_IMAGE_NAME))
109*4882a593SmuzhiyunROOTFS_$(2)_DIR = $$(FS_DIR)/$(1)
110*4882a593SmuzhiyunROOTFS_$(2)_TARGET_DIR = $$(ROOTFS_$(2)_DIR)/target
111*4882a593Smuzhiyun
112*4882a593SmuzhiyunROOTFS_$(2)_DEPENDENCIES += rootfs-common
113*4882a593Smuzhiyun
114*4882a593SmuzhiyunROOTFS_$(2)_FINAL_RECURSIVE_DEPENDENCIES = $$(sort \
115*4882a593Smuzhiyun	$$(if $$(filter undefined,$$(origin ROOTFS_$(2)_FINAL_RECURSIVE_DEPENDENCIES__X)), \
116*4882a593Smuzhiyun		$$(eval ROOTFS_$(2)_FINAL_RECURSIVE_DEPENDENCIES__X := \
117*4882a593Smuzhiyun			$$(foreach p, \
118*4882a593Smuzhiyun				$$(ROOTFS_$(2)_DEPENDENCIES), \
119*4882a593Smuzhiyun				$$(p) \
120*4882a593Smuzhiyun				$$($$(call UPPERCASE,$$(p))_FINAL_RECURSIVE_DEPENDENCIES) \
121*4882a593Smuzhiyun			) \
122*4882a593Smuzhiyun		) \
123*4882a593Smuzhiyun	) \
124*4882a593Smuzhiyun	$$(ROOTFS_$(2)_FINAL_RECURSIVE_DEPENDENCIES__X))
125*4882a593Smuzhiyun
126*4882a593Smuzhiyunifeq ($$(BR2_TARGET_ROOTFS_$(2)_GZIP),y)
127*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_EXT = .gz
128*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_CMD = gzip -9 -c -n
129*4882a593Smuzhiyunendif
130*4882a593Smuzhiyunifeq ($$(BR2_TARGET_ROOTFS_$(2)_BZIP2),y)
131*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_EXT = .bz2
132*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_CMD = bzip2 -9 -c
133*4882a593Smuzhiyunendif
134*4882a593Smuzhiyunifeq ($$(BR2_TARGET_ROOTFS_$(2)_LZMA),y)
135*4882a593SmuzhiyunROOTFS_$(2)_DEPENDENCIES += host-lzma
136*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_EXT = .lzma
137*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_CMD = $$(LZMA) -9 -c
138*4882a593Smuzhiyunendif
139*4882a593Smuzhiyunifeq ($$(BR2_TARGET_ROOTFS_$(2)_LZ4),y)
140*4882a593SmuzhiyunROOTFS_$(2)_DEPENDENCIES += host-lz4
141*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_EXT = .lz4
142*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_CMD = lz4 -l -9 -c
143*4882a593Smuzhiyunendif
144*4882a593Smuzhiyunifeq ($$(BR2_TARGET_ROOTFS_$(2)_LZO),y)
145*4882a593SmuzhiyunROOTFS_$(2)_DEPENDENCIES += host-lzop
146*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_EXT = .lzo
147*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_CMD = $$(LZOP) -9 -c
148*4882a593Smuzhiyunendif
149*4882a593Smuzhiyunifeq ($$(BR2_TARGET_ROOTFS_$(2)_XZ),y)
150*4882a593SmuzhiyunROOTFS_$(2)_DEPENDENCIES += host-xz
151*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_EXT = .xz
152*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_CMD = xz -9 -C crc32 -c
153*4882a593Smuzhiyunifeq ($(BR2_REPRODUCIBLE),)
154*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_CMD += -T $(PARALLEL_JOBS)
155*4882a593Smuzhiyunendif
156*4882a593Smuzhiyunendif
157*4882a593Smuzhiyunifeq ($(BR2_TARGET_ROOTFS_$(2)_ZSTD),y)
158*4882a593SmuzhiyunROOTFS_$(2)_DEPENDENCIES += host-zstd
159*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_EXT = .zst
160*4882a593SmuzhiyunROOTFS_$(2)_COMPRESS_CMD = zstd -19 -z -f -T$(PARALLEL_JOBS)
161*4882a593Smuzhiyunendif
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun$$(BINARIES_DIR)/$$(ROOTFS_$(2)_FINAL_IMAGE_NAME): ROOTFS=$(2)
164*4882a593Smuzhiyun$$(BINARIES_DIR)/$$(ROOTFS_$(2)_FINAL_IMAGE_NAME): FAKEROOT_SCRIPT=$$(ROOTFS_$(2)_DIR)/fakeroot
165*4882a593Smuzhiyun$$(BINARIES_DIR)/$$(ROOTFS_$(2)_FINAL_IMAGE_NAME): $$(ROOTFS_$(2)_DEPENDENCIES)
166*4882a593Smuzhiyun	@$$(call MESSAGE,"Generating filesystem image $$(ROOTFS_$(2)_FINAL_IMAGE_NAME)")
167*4882a593Smuzhiyun	mkdir -p $$(@D)
168*4882a593Smuzhiyun	rm -rf $$(ROOTFS_$(2)_DIR)
169*4882a593Smuzhiyun	mkdir -p $$(ROOTFS_$(2)_DIR)
170*4882a593Smuzhiyun	rsync -auH \
171*4882a593Smuzhiyun		--exclude=/$$(notdir $$(TARGET_DIR_WARNING_FILE)) \
172*4882a593Smuzhiyun		$$(BASE_TARGET_DIR)/ \
173*4882a593Smuzhiyun		$$(TARGET_DIR)
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun	echo '#!/bin/sh' > $$(FAKEROOT_SCRIPT)
176*4882a593Smuzhiyun	echo "set -e" >> $$(FAKEROOT_SCRIPT)
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun	echo "chown -h -R 0:0 $$(TARGET_DIR)" >> $$(FAKEROOT_SCRIPT)
179*4882a593Smuzhiyun	PATH=$$(BR_PATH) $$(TOPDIR)/support/scripts/mkusers $$(ROOTFS_FULL_USERS_TABLE) $$(TARGET_DIR) >> $$(FAKEROOT_SCRIPT)
180*4882a593Smuzhiyun	echo "$$(HOST_DIR)/bin/makedevs -d $$(ROOTFS_FULL_DEVICES_TABLE) $$(TARGET_DIR)" >> $$(FAKEROOT_SCRIPT)
181*4882a593Smuzhiyun	$$(foreach hook,$$(ROOTFS_PRE_CMD_HOOKS),\
182*4882a593Smuzhiyun		$$(call PRINTF,$$($$(hook))) >> $$(FAKEROOT_SCRIPT)$$(sep))
183*4882a593Smuzhiyun	$$(foreach s,$$(call qstrip,$$(BR2_ROOTFS_POST_FAKEROOT_SCRIPT)),\
184*4882a593Smuzhiyun		echo "echo '$$(TERM_BOLD)>>>   Executing fakeroot script $$(s)$$(TERM_RESET)'" >> $$(FAKEROOT_SCRIPT); \
185*4882a593Smuzhiyun		echo $$(EXTRA_ENV) $$(s) $$(TARGET_DIR) $$(BR2_ROOTFS_POST_SCRIPT_ARGS) >> $$(FAKEROOT_SCRIPT)$$(sep))
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun	$$(foreach hook,$$(ROOTFS_$(2)_PRE_GEN_HOOKS),\
188*4882a593Smuzhiyun		$$(call PRINTF,$$($$(hook))) >> $$(FAKEROOT_SCRIPT)$$(sep))
189*4882a593Smuzhiyun	$$(call PRINTF,$$(ROOTFS_REPRODUCIBLE)) >> $$(FAKEROOT_SCRIPT)
190*4882a593Smuzhiyun	$$(call PRINTF,$$(ROOTFS_SELINUX)) >> $$(FAKEROOT_SCRIPT)
191*4882a593Smuzhiyun	$$(call PRINTF,$$(ROOTFS_$(2)_CMD)) >> $$(FAKEROOT_SCRIPT)
192*4882a593Smuzhiyun	chmod a+x $$(FAKEROOT_SCRIPT)
193*4882a593Smuzhiyun	PATH=$$(BR_PATH) FAKEROOTDONTTRYCHOWN=1 $$(HOST_DIR)/bin/fakeroot -- $$(FAKEROOT_SCRIPT)
194*4882a593Smuzhiyun	$(Q)rm -rf $$(TARGET_DIR)
195*4882a593Smuzhiyunifneq ($$(ROOTFS_$(2)_COMPRESS_CMD),)
196*4882a593Smuzhiyun	PATH=$$(BR_PATH) $$(ROOTFS_$(2)_COMPRESS_CMD) $$@ > $$@$$(ROOTFS_$(2)_COMPRESS_EXT)
197*4882a593Smuzhiyunendif
198*4882a593Smuzhiyun	$$(foreach hook,$$(ROOTFS_$(2)_POST_GEN_HOOKS),$$(call $$(hook))$$(sep))
199*4882a593Smuzhiyun
200*4882a593Smuzhiyunrootfs-$(1)-show-depends:
201*4882a593Smuzhiyun	@echo $$(ROOTFS_$(2)_DEPENDENCIES)
202*4882a593Smuzhiyun
203*4882a593Smuzhiyunrootfs-$(1)-show-info:
204*4882a593Smuzhiyun	@:
205*4882a593Smuzhiyun	$$(info $$(call clean-json,{ $$(call json-info,ROOTFS_$(2)) }))
206*4882a593Smuzhiyun
207*4882a593Smuzhiyunrootfs-$(1): $$(BINARIES_DIR)/$$(ROOTFS_$(2)_FINAL_IMAGE_NAME)
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun.PHONY: rootfs-$(1) rootfs-$(1)-show-depends rootfs-$(1)-show-info
210*4882a593Smuzhiyun
211*4882a593Smuzhiyunifeq ($$(BR2_TARGET_ROOTFS_$(2)),y)
212*4882a593SmuzhiyunTARGETS_ROOTFS += rootfs-$(1)
213*4882a593SmuzhiyunPACKAGES += $$(filter-out rootfs-%,$$(ROOTFS_$(2)_FINAL_RECURSIVE_DEPENDENCIES))
214*4882a593Smuzhiyunendif
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun# Check for legacy POST_TARGETS rules
217*4882a593Smuzhiyunifneq ($$(ROOTFS_$(2)_POST_TARGETS),)
218*4882a593Smuzhiyun$$(error Filesystem $(1) uses post-target rules, which are no longer supported.\
219*4882a593Smuzhiyun	Update $(1) to use post-gen hooks instead)
220*4882a593Smuzhiyunendif
221*4882a593Smuzhiyun
222*4882a593Smuzhiyunendef
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun# $(pkgname) also works well to return the filesystem name
225*4882a593Smuzhiyunrootfs = $(call inner-rootfs,$(pkgname),$(call UPPERCASE,$(pkgname)))
226*4882a593Smuzhiyun
227*4882a593Smuzhiyuninclude $(sort $(wildcard fs/*/*.mk))
228