summaryrefslogtreecommitdiff
path: root/package/pkg-utils.mk
blob: 91a198160fd4bad3f74f05bae27ead73376963d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
################################################################################
#
# 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))

# LOWERCASE macro -- transforms its arguments to lowercase
# The above non-tr implementation is not needed, because LOWERCASE is not
# called very often

define LOWERCASE
$(shell echo $1 | tr '[:upper:]' '[:lower:]')
endef

#
# 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.
pkgdir       = $(dir $(lastword $(MAKEFILE_LIST)))
pkgname      = $(lastword $(subst /, ,$(pkgdir)))

# 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
# suitable-extractor(filename): returns extractor based on suffix
suitable-extractor = $(INFLATE$(suffix $(1)))

# 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="::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"

define legal-warning # text
	echo "WARNING: $(1)" >>$(LEGAL_WARNINGS)
endef

define legal-warning-pkg # pkg, text
	echo "WARNING: $(1): $(2)" >>$(LEGAL_WARNINGS)
endef

define legal-warning-pkg-savednothing # pkg, {local|override}
	$(call legal-warning-pkg,$(1),sources and license files not saved ($(2) packages not handled))
endef

define legal-manifest # pkg, version, license, license-files, source, {HOST|TARGET}
	echo '"$(1)","$(2)","$(3)","$(4)","$(5)"' >>$(LEGAL_MANIFEST_CSV_$(6))
endef

define legal-license-header # pkg, license-file, {HOST|TARGET}
	echo -e "$(LEGAL_INFO_SEPARATOR)\n\t$(1):" \
		"$(2)\n$(LEGAL_INFO_SEPARATOR)\n\n" >>$(LEGAL_LICENSES_TXT_$(3))
endef

define legal-license-nofiles # pkg, {HOST|TARGET}
	$(call legal-license-header,$(1),unknown license file(s),$(2))
endef

define legal-license-file # pkg, filename, file-fullpath, {HOST|TARGET}
	$(call legal-license-header,$(1),$(2) file,$(4)) && \
	cat $(3) >>$(LEGAL_LICENSES_TXT_$(4)) && \
	echo >>$(LEGAL_LICENSES_TXT_$(4)) && \
	mkdir -p $(LICENSE_FILES_DIR_$(4))/$(1)/$(dir $(2)) && \
	cp $(3) $(LICENSE_FILES_DIR_$(4))/$(1)/$(2)
endef