xref: /OK3568_Linux_fs/buildroot/package/pkg-utils.mk (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun################################################################################
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# This file contains various utility functions used by the package
4*4882a593Smuzhiyun# infrastructure, or by the packages themselves.
5*4882a593Smuzhiyun#
6*4882a593Smuzhiyun################################################################################
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun#
9*4882a593Smuzhiyun# Manipulation of .config files based on the Kconfig
10*4882a593Smuzhiyun# infrastructure. Used by the BusyBox package, the Linux kernel
11*4882a593Smuzhiyun# package, and more.
12*4882a593Smuzhiyun#
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun# KCONFIG_DOT_CONFIG ([file])
15*4882a593Smuzhiyun# Returns the path to the .config file that should be used, which will
16*4882a593Smuzhiyun# be $(1) if provided, or the current package .config file otherwise.
17*4882a593SmuzhiyunKCONFIG_DOT_CONFIG = $(strip \
18*4882a593Smuzhiyun	$(if $(strip $(1)), $(1), \
19*4882a593Smuzhiyun		$($(PKG)_BUILDDIR)/$($(PKG)_KCONFIG_DOTCONFIG) \
20*4882a593Smuzhiyun	) \
21*4882a593Smuzhiyun)
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun# KCONFIG_MUNGE_DOT_CONFIG (option, newline [, file])
24*4882a593Smuzhiyundefine KCONFIG_MUNGE_DOT_CONFIG
25*4882a593Smuzhiyun	$(SED) "/\\<$(strip $(1))\\>/d" $(call KCONFIG_DOT_CONFIG,$(3))
26*4882a593Smuzhiyun	echo '$(strip $(2))' >> $(call KCONFIG_DOT_CONFIG,$(3))
27*4882a593Smuzhiyunendef
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun# KCONFIG_ENABLE_OPT (option [, file])
30*4882a593SmuzhiyunKCONFIG_ENABLE_OPT  = $(call KCONFIG_MUNGE_DOT_CONFIG, $(1), $(1)=y, $(2))
31*4882a593Smuzhiyun# KCONFIG_SET_OPT (option, value [, file])
32*4882a593SmuzhiyunKCONFIG_SET_OPT     = $(call KCONFIG_MUNGE_DOT_CONFIG, $(1), $(1)=$(2), $(3))
33*4882a593Smuzhiyun# KCONFIG_DISABLE_OPT  (option [, file])
34*4882a593SmuzhiyunKCONFIG_DISABLE_OPT = $(call KCONFIG_MUNGE_DOT_CONFIG, $(1), $(SHARP_SIGN) $(1) is not set, $(2))
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun# Helper functions to determine the name of a package and its
37*4882a593Smuzhiyun# directory from its makefile directory, using the $(MAKEFILE_LIST)
38*4882a593Smuzhiyun# variable provided by make. This is used by the *-package macros to
39*4882a593Smuzhiyun# automagically find where the package is located.
40*4882a593Smuzhiyunpkgdir = $(dir $(lastword $(MAKEFILE_LIST)))
41*4882a593Smuzhiyunpkgname = $(lastword $(subst /, ,$(pkgdir)))
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun# Helper to build the extension for a package archive, based on various
44*4882a593Smuzhiyun# conditions.
45*4882a593Smuzhiyun# $(1): upper-case package name
46*4882a593Smuzhiyunpkg_source_ext = $(BR_FMT_VERSION_$($(1)_SITE_METHOD)).tar.gz
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun# Define extractors for different archive suffixes
49*4882a593SmuzhiyunINFLATE.bz2  = $(BZCAT)
50*4882a593SmuzhiyunINFLATE.gz   = $(ZCAT)
51*4882a593SmuzhiyunINFLATE.lz   = $(LZCAT)
52*4882a593SmuzhiyunINFLATE.lzma = $(XZCAT)
53*4882a593SmuzhiyunINFLATE.tbz  = $(BZCAT)
54*4882a593SmuzhiyunINFLATE.tbz2 = $(BZCAT)
55*4882a593SmuzhiyunINFLATE.tgz  = $(ZCAT)
56*4882a593SmuzhiyunINFLATE.xz   = $(XZCAT)
57*4882a593SmuzhiyunINFLATE.tar  = cat
58*4882a593Smuzhiyun# suitable-extractor(filename): returns extractor based on suffix
59*4882a593Smuzhiyunsuitable-extractor = $(INFLATE$(suffix $(1)))
60*4882a593Smuzhiyun
61*4882a593SmuzhiyunEXTRACTOR_PKG_DEPENDENCY.lzma = $(BR2_XZCAT_HOST_DEPENDENCY)
62*4882a593SmuzhiyunEXTRACTOR_PKG_DEPENDENCY.xz   = $(BR2_XZCAT_HOST_DEPENDENCY)
63*4882a593SmuzhiyunEXTRACTOR_PKG_DEPENDENCY.lz   = $(BR2_LZIP_HOST_DEPENDENCY)
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun# extractor-pkg-dependency(filename): returns a Buildroot package
66*4882a593Smuzhiyun# dependency needed to extract file based on suffix
67*4882a593Smuzhiyunextractor-pkg-dependency = $(EXTRACTOR_PKG_DEPENDENCY$(suffix $(1)))
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun# extractor-system-dependency(filename): returns the name of the tool
70*4882a593Smuzhiyun# needed to extract 'filename', and is meant to be used with
71*4882a593Smuzhiyun# DL_TOOLS_DEPENDENCIES, in order to check that the necesary tool is
72*4882a593Smuzhiyun# provided by the system Buildroot runs on.
73*4882a593Smuzhiyun#
74*4882a593Smuzhiyun# $(firstword) is used here because the extractor can have arguments,
75*4882a593Smuzhiyun# like ZCAT="gzip -d -c", and to check for the dependency we only want
76*4882a593Smuzhiyun# 'gzip'.
77*4882a593Smuzhiyunextractor-system-dependency = $(if $(EXTRACTOR_PKG_DEPENDENCY$(suffix $(1))),,\
78*4882a593Smuzhiyun	$(firstword $(INFLATE$(suffix $(1)))))
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun# check-deprecated-variable -- throw an error on deprecated variables
81*4882a593Smuzhiyun# example:
82*4882a593Smuzhiyun#   $(eval $(call check-deprecated-variable,FOO_MAKE_OPT,FOO_MAKE_OPTS))
83*4882a593Smuzhiyundefine check-deprecated-variable # (deprecated var, new var)
84*4882a593Smuzhiyunifneq ($$(origin $(1)),undefined)
85*4882a593Smuzhiyun$$(error Package error: use $(2) instead of $(1). Please fix your .mk file)
86*4882a593Smuzhiyunendif
87*4882a593Smuzhiyunendef
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun# $(1): YES or NO
90*4882a593Smuzhiyundefine yesno-to-bool
91*4882a593Smuzhiyun	$(subst NO,false,$(subst YES,true,$(1)))
92*4882a593Smuzhiyunendef
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun# json-info -- return package or filesystem metadata formatted as an entry
95*4882a593Smuzhiyun#              of a JSON dictionnary
96*4882a593Smuzhiyun# $(1): upper-case package or filesystem name
97*4882a593Smuzhiyundefine json-info
98*4882a593Smuzhiyun	"$($(1)_NAME)": {
99*4882a593Smuzhiyun		"type": "$($(1)_TYPE)",
100*4882a593Smuzhiyun		$(if $(filter rootfs,$($(1)_TYPE)), \
101*4882a593Smuzhiyun			$(call _json-info-fs,$(1)), \
102*4882a593Smuzhiyun			$(call _json-info-pkg,$(1)), \
103*4882a593Smuzhiyun		)
104*4882a593Smuzhiyun	}
105*4882a593Smuzhiyunendef
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun# _json-info-pkg, _json-info-pkg-details, _json-info-fs: private helpers
108*4882a593Smuzhiyun# for json-info, above
109*4882a593Smuzhiyundefine _json-info-pkg
110*4882a593Smuzhiyun	"name": "$($(1)_RAWNAME)",
111*4882a593Smuzhiyun	$(if $($(1)_IS_VIRTUAL), \
112*4882a593Smuzhiyun		"virtual": true$(comma),
113*4882a593Smuzhiyun		"virtual": false$(comma)
114*4882a593Smuzhiyun		$(call _json-info-pkg-details,$(1)) \
115*4882a593Smuzhiyun	)
116*4882a593Smuzhiyun	"build_dir": "$(patsubst $(CONFIG_DIR)/%,%,$($(1)_BUILDDIR))",
117*4882a593Smuzhiyun	$(if $(filter target,$($(1)_TYPE)), \
118*4882a593Smuzhiyun		"install_target": $(call yesno-to-bool,$($(1)_INSTALL_TARGET))$(comma) \
119*4882a593Smuzhiyun		"install_staging": $(call yesno-to-bool,$($(1)_INSTALL_STAGING))$(comma) \
120*4882a593Smuzhiyun		"install_images": $(call yesno-to-bool,$($(1)_INSTALL_IMAGES))$(comma) \
121*4882a593Smuzhiyun	)
122*4882a593Smuzhiyun	"dependencies": [
123*4882a593Smuzhiyun		$(call make-comma-list,$(sort $($(1)_FINAL_ALL_DEPENDENCIES)))
124*4882a593Smuzhiyun	],
125*4882a593Smuzhiyun	"reverse_dependencies": [
126*4882a593Smuzhiyun		$(call make-comma-list,$(sort $($(1)_RDEPENDENCIES)))
127*4882a593Smuzhiyun	]
128*4882a593Smuzhiyun	$(if $($(1)_CPE_ID_VALID), \
129*4882a593Smuzhiyun		$(comma) "cpe-id": "$($(1)_CPE_ID)" \
130*4882a593Smuzhiyun	)
131*4882a593Smuzhiyun	$(if $($(1)_IGNORE_CVES),
132*4882a593Smuzhiyun		$(comma) "ignore_cves": [
133*4882a593Smuzhiyun			$(call make-comma-list,$(sort $($(1)_IGNORE_CVES)))
134*4882a593Smuzhiyun		]
135*4882a593Smuzhiyun	)
136*4882a593Smuzhiyunendef
137*4882a593Smuzhiyun
138*4882a593Smuzhiyundefine _json-info-pkg-details
139*4882a593Smuzhiyun	"version": "$($(1)_DL_VERSION)",
140*4882a593Smuzhiyun	"licenses": "$($(1)_LICENSE)",
141*4882a593Smuzhiyun	"dl_dir": "$($(1)_DL_SUBDIR)",
142*4882a593Smuzhiyun	"downloads": [
143*4882a593Smuzhiyun	$(foreach dl,$(sort $($(1)_ALL_DOWNLOADS)),
144*4882a593Smuzhiyun		{
145*4882a593Smuzhiyun			"source": "$(notdir $(dl))",
146*4882a593Smuzhiyun			"uris": [
147*4882a593Smuzhiyun				$(call make-comma-list,
148*4882a593Smuzhiyun					$(subst \|,|,
149*4882a593Smuzhiyun						$(call DOWNLOAD_URIS,$(dl),$(1))
150*4882a593Smuzhiyun					)
151*4882a593Smuzhiyun				)
152*4882a593Smuzhiyun			]
153*4882a593Smuzhiyun		},
154*4882a593Smuzhiyun	)
155*4882a593Smuzhiyun	],
156*4882a593Smuzhiyunendef
157*4882a593Smuzhiyun
158*4882a593Smuzhiyundefine _json-info-fs
159*4882a593Smuzhiyun	"image_name": $(if $($(1)_FINAL_IMAGE_NAME), \
160*4882a593Smuzhiyun				"$($(1)_FINAL_IMAGE_NAME)", \
161*4882a593Smuzhiyun				null \
162*4882a593Smuzhiyun			),
163*4882a593Smuzhiyun	"dependencies": [
164*4882a593Smuzhiyun		$(call make-comma-list,$(sort $($(1)_DEPENDENCIES)))
165*4882a593Smuzhiyun	]
166*4882a593Smuzhiyunendef
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun# clean-json -- cleanup pseudo-json into clean json:
169*4882a593Smuzhiyun#  - remove commas before closing ] and }
170*4882a593Smuzhiyun#  - minify with $(strip)
171*4882a593Smuzhiyunclean-json = $(strip \
172*4882a593Smuzhiyun	$(subst $(comma)},}, $(subst $(comma)$(space)},$(space)}, \
173*4882a593Smuzhiyun	$(subst $(comma)],], $(subst $(comma)$(space)],$(space)], \
174*4882a593Smuzhiyun	$(subst \,\\, \
175*4882a593Smuzhiyun		$(strip $(1)) \
176*4882a593Smuzhiyun	))))) \
177*4882a593Smuzhiyun)
178*4882a593Smuzhiyun
179*4882a593Smuzhiyunifeq ($(BR2_PER_PACKAGE_DIRECTORIES),y)
180*4882a593Smuzhiyun# rsync the contents of per-package directories
181*4882a593Smuzhiyun# $1: space-separated list of packages to rsync from
182*4882a593Smuzhiyun# $2: 'host' or 'target'
183*4882a593Smuzhiyun# $3: destination directory
184*4882a593Smuzhiyundefine per-package-rsync
185*4882a593Smuzhiyun	mkdir -p $(3)
186*4882a593Smuzhiyun	$(foreach pkg,$(1),\
187*4882a593Smuzhiyun		rsync -a --link-dest=$(PER_PACKAGE_DIR)/$(pkg)/$(2)/ \
188*4882a593Smuzhiyun		$(PER_PACKAGE_DIR)/$(pkg)/$(2)/ \
189*4882a593Smuzhiyun		$(3)$(sep))
190*4882a593Smuzhiyunendef
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun# prepares the per-package HOST_DIR and TARGET_DIR of the current
193*4882a593Smuzhiyun# package, by rsync the host and target directories of the
194*4882a593Smuzhiyun# dependencies of this package. The list of dependencies is passed as
195*4882a593Smuzhiyun# argument, so that this function can be used to prepare with
196*4882a593Smuzhiyun# different set of dependencies (download, extract, configure, etc.)
197*4882a593Smuzhiyun#
198*4882a593Smuzhiyun# $1: space-separated list of packages to rsync from
199*4882a593Smuzhiyundefine prepare-per-package-directory
200*4882a593Smuzhiyun	$(call per-package-rsync,$(1),host,$(HOST_DIR))
201*4882a593Smuzhiyun	$(call per-package-rsync,$(1),target,$(TARGET_DIR))
202*4882a593Smuzhiyunendef
203*4882a593Smuzhiyunendif
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun#
206*4882a593Smuzhiyun# legal-info helper functions
207*4882a593Smuzhiyun#
208*4882a593SmuzhiyunLEGAL_INFO_SEPARATOR = "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
209*4882a593Smuzhiyun
210*4882a593Smuzhiyundefine legal-warning # text
211*4882a593Smuzhiyun	echo "WARNING: $(1)" >>$(LEGAL_WARNINGS)
212*4882a593Smuzhiyunendef
213*4882a593Smuzhiyun
214*4882a593Smuzhiyundefine legal-warning-pkg # pkg, text
215*4882a593Smuzhiyun	echo "WARNING: $(1): $(2)" >>$(LEGAL_WARNINGS)
216*4882a593Smuzhiyunendef
217*4882a593Smuzhiyun
218*4882a593Smuzhiyundefine legal-warning-nosource # pkg, {local|override}
219*4882a593Smuzhiyun	$(call legal-warning-pkg,$(1),sources not saved ($(2) packages not handled))
220*4882a593Smuzhiyunendef
221*4882a593Smuzhiyun
222*4882a593Smuzhiyundefine legal-manifest # {HOST|TARGET}, pkg, version, license, license-files, source, url, dependencies
223*4882a593Smuzhiyun	echo '"$(2)","$(3)","$(4)","$(5)","$(6)","$(7)","$(8)"' >>$(LEGAL_MANIFEST_CSV_$(1))
224*4882a593Smuzhiyunendef
225*4882a593Smuzhiyun
226*4882a593Smuzhiyundefine legal-license-file # pkgname, pkgname-pkgver, pkg-hashfile, filename, file-fullpath, {HOST|TARGET}
227*4882a593Smuzhiyun	mkdir -p $(LICENSE_FILES_DIR_$(6))/$(2)/$(dir $(4)) && \
228*4882a593Smuzhiyun	{ \
229*4882a593Smuzhiyun		support/download/check-hash $(3) $(5) $(4); \
230*4882a593Smuzhiyun		case $${?} in (0|3) ;; (*) exit 1;; esac; \
231*4882a593Smuzhiyun	} && \
232*4882a593Smuzhiyun	cp $(5) $(LICENSE_FILES_DIR_$(6))/$(2)/$(4)
233*4882a593Smuzhiyunendef
234*4882a593Smuzhiyun
235*4882a593Smuzhiyunnon-virtual-deps = $(foreach p,$(1),$(if $($(call UPPERCASE,$(p))_IS_VIRTUAL),,$(p)))
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun# Returns the list of recursive dependencies and their licensing terms
238*4882a593Smuzhiyun# for the package specified in parameter (in lowercase). If that
239*4882a593Smuzhiyun# package is a target package, remove host packages from the list.
240*4882a593Smuzhiyunlegal-deps = \
241*4882a593Smuzhiyun    $(foreach p,\
242*4882a593Smuzhiyun        $(filter-out $(if $(1:host-%=),host-%),\
243*4882a593Smuzhiyun            $(call non-virtual-deps,\
244*4882a593Smuzhiyun                $($(call UPPERCASE,$(1))_FINAL_RECURSIVE_DEPENDENCIES))),$(p) [$($(call UPPERCASE,$(p))_LICENSE)])
245