aboutsummaryrefslogtreecommitdiff
blob: 5c8302f8481328796ee3281872ef91447978df75 (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
152
153
154
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/eclass/waf-utils.eclass,v 1.18 2013/11/23 04:35:16 jcallen Exp $

# @ECLASS: waf-utils-multilib.eclass
# @MAINTAINER:
# gnome@gentoo.org
# @AUTHOR:
# Original Author: Greg Turner <gmt@be-evil.net>
# @BLURB: common ebuild functions for multi-abi waf-based packages
# @DESCRIPTION:
# The waf-utils-multilib eclass contains functions that make creating ebuild for
# waf-based packages much easier, while supporting multi-abi installation, for example
# using the ABI_X86 USE_EXPAND variable.
# Its main features are support of common portage default settings.

inherit base eutils multilib toolchain-funcs multiprocessing multilib-build

case ${EAPI:-0} in
	4|5) EXPORT_FUNCTIONS src_configure src_compile src_install ;;
	*) die "EAPI=${EAPI} is not supported" ;;
esac

# Python with threads is required to run waf. We do not know which python slot
# is being used as the system interpreter, so we are forced to block all
# slots that have USE=-threads.
DEPEND="${DEPEND}
	dev-lang/python[${MULTILIB_USEDEP}]
	!dev-lang/python[-threads]"

# @ECLASS-VARIABLE: WAF_VERBOSE
# @DESCRIPTION:
# Set to OFF to disable verbose messages during compilation
# this is _not_ meant to be set in ebuilds
: ${WAF_VERBOSE:=ON}

# @FUNCTION: waf-utils_src_configure
# @DESCRIPTION:
# General function for configuring with waf.
waf-utils-multilib_src_configure() {
	debug-print-function ${FUNCNAME} "$@"

	multilib_copy_sources
	multilib_parallel_foreach_abi run_in_build_dir _in_waf_utils_multilib_env \
		_waf-utils-multilib-perabi_src_configure "$@"
}

_in_waf_utils_multilib_env() {
	debug-print-function ${FUNCNAME} "$@"

	local S="${BUILD_DIR}"

	local libdir=""

	# @ECLASS-VARIABLE: WAF_BINARY
	# @DESCRIPTION:
	# not supported in this eclass -- waf must always be at ${S}/waf or use WAF_BINARY_REL
	#
	# @ECLASS-VARIABLE: WAF_BINARY_REL
	# @DESCRIPTION:
	# Provides the location of the waf binary relative to "${S}"

	[[ ${WAF_BINARY} ]] && die "WAF_BINARY overriding is not supported by waf-utils-multilib"
	if [[ ${WAF_BINARY_REL} ]] ; then
		local WAF_BINARY="${S}/${WAF_BINARY_REL}"
	else
		local WAF_BINARY="${S}/waf"
	fi

	# @ECLASS-VARIABLE: NO_WAF_LIBDIR
	# @DEFAULT_UNSET
	# @DESCRIPTION:
	# Variable specifying that you don't want to set the libdir for waf script.
	# Some scripts does not allow setting it at all and die if they find it.
	[[ -z ${NO_WAF_LIBDIR} ]] && libdir="--libdir=${EPREFIX}/usr/$(get_libdir)"

	# when compiling for non-native ABI's, we hit a snag since python starts whispering
	# wrong things into WAF's ear about the native ABI which prevent the correct
	# python libraries being used... whisper the truth as a countermeasure....
	multilib_is_native_abi || local LDFLAGS="-L${EPREFIX}/usr/$(get_libdir)${LDFLAGS+ }${LDFLAGS}"

	MULTILIB_TC_EXPORT_VARS="AR CC CPP CXX RANLIB" multilib_tc_export "$@"
}

_waf-utils-multilib-perabi_src_configure() {
	debug-print-function ${FUNCNAME} "$@"

	echo "CCFLAGS=\"${CFLAGS}\" LINKFLAGS=\"${LDFLAGS}\" \"${WAF_BINARY}\" --prefix=${EPREFIX}/usr ${libdir} $@ configure"

	# This condition is required because waf takes even whitespace as function
	# calls, awesome isn't it?
	if [[ -z ${NO_WAF_LIBDIR} ]]; then
		CCFLAGS="${CFLAGS}" LINKFLAGS="${LDFLAGS}" "${WAF_BINARY}" \
			"--prefix=${EPREFIX}/usr" \
			"${libdir}" \
			"$@" \
			configure || die "configure failed"
	else
		CCFLAGS="${CFLAGS}" LINKFLAGS="${LDFLAGS}" "${WAF_BINARY}" \
			"--prefix=${EPREFIX}/usr" \
			"$@" \
			configure || die "configure failed"
	fi
}

# @FUNCTION: waf-utils_src_compile
# @DESCRIPTION:
# General function for compiling with waf.
waf-utils-multilib_src_compile() {
	debug-print-function ${FUNCNAME} "$@"
	multilib_parallel_foreach_abi run_in_build_dir _in_waf_utils_multilib_env \
		_waf-utils-multilib-perabi_src_compile "$@"
}

_waf-utils-multilib-perabi_src_compile() {
	debug-print-function ${FUNCNAME} "$@"

	local _mywafconfig
	[[ "${WAF_VERBOSE}" ]] && _mywafconfig="--verbose"

	local jobs="--jobs=$(makeopts_jobs)"
	echo "\"${WAF_BINARY}\" build ${_mywafconfig} ${jobs}"
	"${WAF_BINARY}" ${_mywafconfig} ${jobs} || die "build failed"
}

# @FUNCTION: waf-utils_src_install
# @DESCRIPTION:
# Function for installing the package.
waf-utils-multilib_src_install() {
	debug-print-function ${FUNCNAME} "$@"
	_waf-utils-multilib_secure_install() {
		debug-print-function ${FUNCNAME} "$@"
		_in_waf_utils_multilib_env _waf-utils-multilib-perabi_src_install "$@"
		# Do multilib magic only when >1 ABI is used.
		if [[ ${#MULTIBUILD_VARIANTS[@]} -gt 1 ]]; then
			multilib_prepare_wrappers
			# Make sure all headers are the same for each ABI.
			multilib_check_headers
		fi
	}
	multilib_foreach_abi run_in_build_dir _waf-utils-multilib_secure_install "$@"
	# merge any wrapped headers
	multilib_install_wrappers
}

_waf-utils-multilib-perabi_src_install() {
	debug-print-function ${FUNCNAME} "$@"

	echo "\"${WAF_BINARY}\" --destdir=\"${D}\" install"
	"${WAF_BINARY}" --destdir="${D}" install  || die "Make install failed"

	# Manual document installation
	base_src_install_docs
}