buildrootschalter/package/pkg-utils.mk
Luca Ceresoli 7e76f904d2 legal-info: infrastructure to collect legally-relevant material
This allows to automatically collect material that may be needed to comply with
the license of packages that Buildroot prepares for the target device.

The core of the implementation is made by the following parts:
 - in package/pkg-utils.mk some helper functions are defined for common actions
   such as generating a warning, producing info about a package etc;
 - in package/pkg-gentargets.mk, within the GENTARGETS framework, a new
   <PKG>-legal-info target produces all the info for a given package;
 - Makefile implements the top-level targets:
   - legal-info-prepare creates the output directory and produces legal info
     about Buildroot itself and the toolchain, which mostly means just warning
     the user that this is not implemented;
   - legal-info, the only target that is supposed to be used directly, depends
     on all of the above and finishes things by producing the README files from
     the various pieces.

Signed-off-by: Luca Ceresoli <luca@lucaceresoli.net>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
2012-07-17 19:05:49 +02:00

120 lines
4.0 KiB
Makefile

############################################################################
#
# This file contains various utility functions used by the package
# infrastructure, or by the packages themselves.
#
############################################################################
# UPPERCASE Macro -- transform its argument to uppercase and replace dots and
# hyphens to underscores
# Heavily inspired by the up macro from gmsl (http://gmsl.sf.net)
# This is approx 5 times faster than forking a shell and tr, and
# as this macro is used a lot it matters
# This works by creating translation character pairs (E.G. a:A b:B)
# and then looping though all of them running $(subst from,to,text)
[FROM] := a b c d e f g h i j k l m n o p q r s t u v w x y z . -
[TO] := A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ _
UPPERCASE = $(strip $(eval __tmp := $1) \
$(foreach c, $(join $(addsuffix :,$([FROM])),$([TO])), \
$(eval __tmp := \
$(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),\
$(__tmp)))) \
$(__tmp))
#
# Manipulation of .config files based on the Kconfig
# infrastructure. Used by the Busybox package, the Linux kernel
# package, and more.
#
define KCONFIG_ENABLE_OPT
$(SED) "/\\<$(1)\\>/d" $(2)
echo "$(1)=y" >> $(2)
endef
define KCONFIG_SET_OPT
$(SED) "/\\<$(1)\\>/d" $(3)
echo "$(1)=$(2)" >> $(3)
endef
define KCONFIG_DISABLE_OPT
$(SED) "/\\<$(1)\\>/d" $(2)
echo "# $(1) is not set" >> $(2)
endef
# Helper functions to determine the name of a package and its
# directory from its makefile directory, using the $(MAKEFILE_LIST)
# variable provided by make. This is used by the *TARGETS macros to
# automagically find where the package is located. Note that the
# pkgdir macro is carefully written to handle the case of the Linux
# package, for which the package directory is an empty string.
define pkgdir
$(dir $(lastword $(MAKEFILE_LIST)))
endef
define pkgname
$(lastword $(subst /, ,$(call pkgdir)))
endef
define pkgparentdir
$(patsubst %$(call pkgname)/,%,$(call pkgdir))
endef
# Define extractors for different archive suffixes
INFLATE.bz2 = $(BZCAT)
INFLATE.gz = $(ZCAT)
INFLATE.tbz = $(BZCAT)
INFLATE.tbz2 = $(BZCAT)
INFLATE.tgz = $(ZCAT)
INFLATE.xz = $(XZCAT)
INFLATE.tar = cat
# MESSAGE Macro -- display a message in bold type
MESSAGE = echo "$(TERM_BOLD)>>> $($(PKG)_NAME) $($(PKG)_VERSION) $(1)$(TERM_RESET)"
TERM_BOLD := $(shell tput smso)
TERM_RESET := $(shell tput rmso)
# Utility functions for 'find'
# findfileclauses(filelist) => -name 'X' -o -name 'Y'
findfileclauses = $(call notfirstword,$(patsubst %,-o -name '%',$(1)))
# finddirclauses(base, dirlist) => -path 'base/dirX' -o -path 'base/dirY'
finddirclauses = $(call notfirstword,$(patsubst %,-o -path '$(1)/%',$(2)))
# Miscellaneous utility functions
# notfirstword(wordlist): returns all but the first word in wordlist
notfirstword = $(wordlist 2,$(words $(1)),$(1))
# Needed for the foreach loops to loop over the list of hooks, so that
# each hook call is properly separated by a newline.
define sep
endef
#
# legal-info helper functions
#
LEGAL_INFO_SEPARATOR="::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
legal-warning=echo "WARNING: $(1)" >>$(LEGAL_WARNINGS)
legal-warning-pkg=echo "WARNING: $(1): $(2)" >>$(LEGAL_WARNINGS)
define legal-warning-pkg-savednothing # pkg, {local|override}
$(call legal-warning-pkg,$(1),sources and license files not saved ($(2) packages not handled))
endef
legal-manifest=echo "$(1),$(2),$(3),$(4),$(5)" >>$(LEGAL_MANIFEST_CSV)
define legal-license-header
echo -e "$(LEGAL_INFO_SEPARATOR)\n\t$(1):" \
"$(2)\n$(LEGAL_INFO_SEPARATOR)\n\n" >>$(LEGAL_LICENSES_TXT)
endef
define legal-license-nofiles
$(call legal-license-header,$(1),unknown license file(s))
endef
define legal-license-file # pkg, filename, file-fullpath
$(call legal-license-header,$(1),$(2) file) && \
cat $(3) >>$(LEGAL_LICENSES_TXT) && \
echo >>$(LEGAL_LICENSES_TXT) && \
mkdir -p $(LICENSE_FILES_DIR)/$(1)/ && \
cp $(3) $(LICENSE_FILES_DIR)/$(1)/
endef