summaryrefslogtreecommitdiff
blob: 411b36509fb1bb294697c66b7b30fb34fe465bf2 (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

# @ECLASS: prefix.eclass
# @MAINTAINER:
# Feel free to contact the Prefix team through <prefix@gentoo.org> if
# you have problems, suggestions or questions.
# @BLURB: Eclass to provide Prefix functionality
# @DESCRIPTION:
# Gentoo Prefix allows users to install into a self defined offset
# located somewhere in the filesystem.  Prefix ebuilds require
# additional functions and variables which are defined by this eclass.

# @ECLASS-VARIABLE: EPREFIX
# @DESCRIPTION:
# The offset prefix of a Gentoo Prefix installation.  When Gentoo Prefix
# is not used, ${EPREFIX} should be "".  Prefix Portage sets EPREFIX,
# hence this eclass has nothing to do here in that case.
# Note that setting EPREFIX in the environment with Prefix Portage sets
# Portage into cross-prefix mode.
if [[ ! ${EPREFIX+set} ]]; then
	export EPREFIX=''
fi


# @FUNCTION: eprefixify
# @USAGE: <list of to be eprefixified files>
# @DESCRIPTION:
# Replaces @GENTOO_PORTAGE_EPREFIX@ with ${EPREFIX} for the given files,
# Dies if no arguments are given, a file does not exist, or changing a
# file failed.
eprefixify() {
	[[ $# -lt 1 ]] && die "at least one file operand is required"
	einfo "Adjusting to prefix ${EPREFIX:-/}"
	local x
	for x in "$@" ; do
		if [[ -e ${x} ]] ; then
			ebegin "  ${x##*/}"
			sed -i -e "s|@GENTOO_PORTAGE_EPREFIX@|${EPREFIX}|g" "${x}"
			eend $? || die "failed to eprefixify ${x}"
		else
			die "${x} does not exist"
		fi
	done

	return 0
}

# @FUNCTION: hprefixify
# @USAGE: [ -w <line matching regex> ] [-e <extended regex>] <list of files>
# @DESCRIPTION:
#
# Tries a set of heuristics to prefixify the given files, Dies if no
# arguments are given, a file does not exist, or changing a file failed.
#
# Additional extended regular expression can be passed by -e or
# environment variable PREFIX_EXTRA_REGEX.  The default heuristics can
# be constrained to lines matching regular expressions passed by -w or
# environment variable PREFIX_LINE_MATCH.
hprefixify() {
	local PREFIX_EXTRA_REGEX PREFIX_LINE_MATCH xl=() x
	while [[ $# -gt 0 ]]; do
		case $1 in
			-e)
				PREFIX_EXTRA_REGEX="$2"
				shift
				;;
			-w)
				PREFIX_LINE_MATCHING="$2"
				shift
				;;
			*)
				xl+=( "$1" )
				;;
		esac
		shift
	done

	[[ ${#xl[@]} -lt 1 ]] && die "at least one file operand is required"
	einfo "Adjusting to prefix ${EPREFIX:-/}"
	for x in "${xl[@]}" ; do
		if [[ -e ${x} ]] ; then
			ebegin "  ${x##*/}"
			sed -r \
				-e "${PREFIX_LINE_MATCH}s,([^[:alnum:]}\)\.])/(usr|lib(|[onx]?32|n?64)|etc|bin|sbin|var|opt),\1${EPREFIX}/\2,g" \
				-e "${PREFIX_EXTRA_REGEX}" \
				-i "${x}"
			eend $? || die "failed to prefixify ${x}"
		else
			die "${x} does not exist"
		fi
	done
}

# @FUNCTION: __temp_prefixify
# @USAGE: a single file. Internal use only.
# @DESCRIPTION:
# copies the files to ${T}, calls eprefixify, echos the new file.
__temp_prefixify() {
	if [[ -e $1 ]] ; then
		local f=${1##*/}
		cp "$1" "${T}" || die "failed to copy file"
		local x="${T}"/${f}
		if grep -qs @GENTOO_PORTAGE_EPREFIX@ "${x}" ; then
			eprefixify "${T}"/${f} > /dev/null
		else
			hprefixify "${T}"/${f} > /dev/null
		fi
		echo "${x}"
	else
		die "$1 does not exist"
	fi
}

# @FUNCTION: fprefixify
# @USAGE: <function> <files>
# @DESCRIPTION:
# prefixify a function call.
# copies the files to ${T}, calls eprefixify, and calls the function.
# @EXAMPLE:
# fprefixify doexe ${FILESDIR}/fix_libtool_files.sh
# fprefixify epatch ${FILESDIR}/${PN}-4.0.2-path.patch
fprefixify() {
	[[ $# -lt 2 ]] && die "at least two arguments required"

	local func=$1 f
	einfo "Adjusting ${func} to prefix ${EPREFIX:-/}"
	shift
	case ${func} in
		new*)
			[[ $# -ne 2 ]] && die "${func} takes two arguments"
			ebegin "  ${1##*/}"
			f=$(__temp_prefixify "$1")
			${func} "${f}" "$2"
			eend $? || die "failed to execute ${func}"
			;;
		*)
			for x in "$@" ; do
				ebegin "  ${x##*/}"
				f=$(__temp_prefixify "${x}")
				${func} "${f}"
				eend $? || die "failed to execute ${func}"
			done
			;;
	esac

	return 0
}

# vim: tw=72: