| 1 | # Copyright 1999-2004 Gentoo Foundation |
1 | # Copyright 1999-2004 Gentoo Foundation |
| 2 | # Distributed under the terms of the GNU General Public License v2 |
2 | # Distributed under the terms of the GNU General Public License v2 |
| 3 | # $Header: /var/cvsroot/gentoo-x86/eclass/multilib.eclass,v 1.4 2005/01/12 20:27:30 eradicator Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/multilib.eclass,v 1.13 2005/01/17 04:20:55 eradicator Exp $ |
| 4 | # |
4 | # |
| 5 | # Author: Jeremy Huddleston <eradicator@gentoo.org> |
5 | # Author: Jeremy Huddleston <eradicator@gentoo.org> |
| 6 | # |
6 | # |
| 7 | # This eclass is for all functions pertaining to handling multilib. |
7 | # This eclass is for all functions pertaining to handling multilib. |
| 8 | # configurations. |
8 | # configurations. |
| 9 | |
9 | |
| 10 | ECLASS=multilib |
10 | ECLASS=multilib |
| 11 | INHERITED="$INHERITED $ECLASS" |
11 | INHERITED="$INHERITED $ECLASS" |
| 12 | |
12 | |
| 13 | DESCRIPTION="Based on the ${ECLASS} eclass" |
13 | DESCRIPTION="Based on the ${ECLASS} eclass" |
| 14 | |
|
|
| 15 | DEPEND="!build? ( sys-apps/sed sys-apps/findutils sys-apps/coreutils )" |
|
|
| 16 | |
14 | |
| 17 | # This function simply returns the desired lib directory. With portage |
15 | # This function simply returns the desired lib directory. With portage |
| 18 | # 2.0.51, we now have support for installing libraries to lib32/lib64 |
16 | # 2.0.51, we now have support for installing libraries to lib32/lib64 |
| 19 | # to accomidate the needs of multilib systems. It's no longer a good idea |
17 | # to accomidate the needs of multilib systems. It's no longer a good idea |
| 20 | # to assume all libraries will end up in lib. Replace any (sane) instances |
18 | # to assume all libraries will end up in lib. Replace any (sane) instances |
| … | |
… | |
| 180 | # echo the number of ABIs we will be installing for |
178 | # echo the number of ABIs we will be installing for |
| 181 | number_abis() { |
179 | number_abis() { |
| 182 | get_abi_order | wc -w |
180 | get_abi_order | wc -w |
| 183 | } |
181 | } |
| 184 | |
182 | |
|
|
183 | # get_ml_incdir [<include dir> [<ABI>]] |
|
|
184 | # include dir defaults to /usr/include |
|
|
185 | # ABI defaults to ${ABI} or ${DEFAULT_ABI} |
|
|
186 | get_ml_incdir() { |
|
|
187 | local dir=/usr/include |
|
|
188 | |
|
|
189 | if [[ ${#} -gt 0 ]]; then |
|
|
190 | incdir=${1} |
|
|
191 | shift |
|
|
192 | fi |
|
|
193 | |
|
|
194 | if [[ -z "${MULTILIB_ABIS}" ]]; then |
|
|
195 | echo ${incdir} |
|
|
196 | return 0 |
|
|
197 | fi |
|
|
198 | |
|
|
199 | local abi=${ABI:-${DEFAULT_ABI}} |
|
|
200 | if [[ ${#} -gt 0 ]]; then |
|
|
201 | abi=${1} |
|
|
202 | shift |
|
|
203 | fi |
|
|
204 | |
|
|
205 | if [[ -d "${dir}/gentoo-multilib/${abi}" ]]; then |
|
|
206 | echo ${dir}/gentoo-multilib/${abi} |
|
|
207 | else |
|
|
208 | echo ${dir} |
|
|
209 | fi |
|
|
210 | } |
|
|
211 | |
| 185 | # prep_ml_includes: |
212 | # prep_ml_includes: |
| 186 | # |
213 | # |
| 187 | # Some includes (include/asm, glibc, etc) are ABI dependent. In this case, |
214 | # Some includes (include/asm, glibc, etc) are ABI dependent. In this case, |
| 188 | # We can install them in different locations for each ABI and create a common |
215 | # We can install them in different locations for each ABI and create a common |
| 189 | # header which includes the right one based on CDEFINE_${ABI}. If your |
216 | # header which includes the right one based on CDEFINE_${ABI}. If your |
| … | |
… | |
| 196 | # ... |
223 | # ... |
| 197 | # prep_ml_includes /usr/qt/3/include |
224 | # prep_ml_includes /usr/qt/3/include |
| 198 | # } |
225 | # } |
| 199 | |
226 | |
| 200 | prep_ml_includes() { |
227 | prep_ml_includes() { |
| 201 | local dirs |
|
|
| 202 | if [ ${#} -eq 0 ]; then |
|
|
| 203 | dirs="/usr/include" |
|
|
| 204 | else |
|
|
| 205 | dirs="${@}" |
|
|
| 206 | fi |
|
|
| 207 | |
|
|
| 208 | if [ $(number_abis) -gt 1 ]; then |
228 | if [ $(number_abis) -gt 1 ]; then |
| 209 | local dir |
229 | local dir |
|
|
230 | local dirs |
|
|
231 | local base |
|
|
232 | |
|
|
233 | if [ ${#} -eq 0 ]; then |
|
|
234 | dirs="/usr/include" |
|
|
235 | else |
|
|
236 | dirs="${@}" |
|
|
237 | fi |
|
|
238 | |
| 210 | for dir in ${dirs}; do |
239 | for dir in ${dirs}; do |
|
|
240 | base=${T}/gentoo-multilib/${dir}/gentoo-multilib |
|
|
241 | mkdir -p ${base} |
|
|
242 | [ -d ${base}/${ABI} ] && rm -rf ${base}/${ABI} |
| 211 | mv ${D}/${dir} ${D}/${dir}.${ABI} |
243 | mv ${D}/${dir} ${base}/${ABI} |
| 212 | done |
244 | done |
| 213 | |
245 | |
| 214 | if is_final_abi; then |
246 | if is_final_abi; then |
|
|
247 | base=${T}/gentoo-multilib |
|
|
248 | pushd ${base} |
|
|
249 | find . | cpio -pmd --no-preserve-owner ${D} |
|
|
250 | popd |
|
|
251 | |
| 215 | for dir in ${dirs}; do |
252 | for dir in ${dirs}; do |
| 216 | local args="${dir}" |
253 | local args=${dir} |
| 217 | local abi |
254 | local abi |
| 218 | for abi in $(get_abi_order); do |
255 | for abi in $(get_abi_order); do |
| 219 | args="${args} $(get_abi_CDEFINE ${abi}):${dir}.${abi}" |
256 | args="${args} $(get_abi_CDEFINE ${abi}):${dir}/gentoo-multilib/${abi}" |
| 220 | done |
257 | done |
| 221 | create_ml_includes ${args} |
258 | create_ml_includes ${args} |
| 222 | done |
259 | done |
| 223 | fi |
260 | fi |
| 224 | fi |
261 | fi |
| … | |
… | |
| 253 | |
290 | |
| 254 | local dir |
291 | local dir |
| 255 | for dir in ${basedirs}; do |
292 | for dir in ${basedirs}; do |
| 256 | if [ -f "${D}/${dir}/${file}" ]; then |
293 | if [ -f "${D}/${dir}/${file}" ]; then |
| 257 | echo "#ifdef $(create_ml_includes-sym_for_dir ${dir} ${mlinfo})" |
294 | echo "#ifdef $(create_ml_includes-sym_for_dir ${dir} ${mlinfo})" |
| 258 | echo "#include \"$(create_ml_includes-relative_between ${dest} ${dir})/${file}\"" |
295 | echo "#include \"$(create_ml_includes-relative_between ${dest}/$(dirname ${file}) ${dir}/${file})\"" |
| 259 | echo "#endif /* $(create_ml_includes-sym_for_dir ${dir} ${mlinfo}) */" |
296 | echo "#endif /* $(create_ml_includes-sym_for_dir ${dir} ${mlinfo}) */" |
| 260 | echo "" |
297 | echo "" |
| 261 | fi |
298 | fi |
| 262 | done |
299 | done |
| 263 | |
300 | |
| … | |
… | |
| 265 | } > ${D}/${dest}/${file} |
302 | } > ${D}/${dest}/${file} |
| 266 | done |
303 | done |
| 267 | } |
304 | } |
| 268 | |
305 | |
| 269 | # Helper function for create_ml_includes |
306 | # Helper function for create_ml_includes |
| 270 | # TODO: This needs to be updated to spit out relative paths... |
|
|
| 271 | create_ml_includes-relative_between() { |
307 | create_ml_includes-relative_between() { |
|
|
308 | local src="$(create_ml_includes-tidy_path ${1})" |
|
|
309 | local dst="$(create_ml_includes-tidy_path ${2})" |
|
|
310 | |
|
|
311 | src=(${src//\// }) |
|
|
312 | dst=(${dst//\// }) |
|
|
313 | |
|
|
314 | local i |
|
|
315 | for ((i=0; i<${#src[*]}; i++)); do |
|
|
316 | [ "${dst[i]}" != "${src[i]}" ] && break |
|
|
317 | done |
|
|
318 | |
|
|
319 | local common=$i |
|
|
320 | |
|
|
321 | for ((i=${#src[*]}; i>common; i--)); do |
|
|
322 | echo -n ../ |
|
|
323 | done |
|
|
324 | |
|
|
325 | for ((i=common; i<${#dst[*]}-1; i++)); do |
|
|
326 | echo -n ${dst[i]}/ |
|
|
327 | done |
|
|
328 | |
|
|
329 | echo -n ${dst[i]} |
|
|
330 | } |
|
|
331 | |
|
|
332 | # Helper function for create_ml_includes |
|
|
333 | create_ml_includes-tidy_path() { |
| 272 | local from=${1} |
334 | local removed="${1}" |
| 273 | local to=${2} |
|
|
| 274 | |
|
|
| 275 | strip_duplicate_slashes "${ROOT}${to}" |
|
|
| 276 | } |
|
|
| 277 | |
335 | |
| 278 | # Helper function for create_ml_includes |
|
|
| 279 | strip_duplicate_slashes () { |
|
|
| 280 | if [ -n "${1}" ]; then |
336 | if [ -n "${removed}" ]; then |
| 281 | local removed=${1/\/\//\/} |
337 | # Remove multiple slashes |
| 282 | [ ${removed} != ${removed/\/\//\/} ] && removed=$(strip_duplicate_slashes "${removed}") |
338 | while [ "${removed}" != "${removed/\/\//\/}" ]; do |
|
|
339 | removed=${removed/\/\//\/} |
|
|
340 | done |
|
|
341 | |
|
|
342 | # Remove . directories |
|
|
343 | while [ "${removed}" != "${removed//\/.\//\/}" ]; do |
|
|
344 | removed=${removed//\/.\//\/} |
|
|
345 | done |
|
|
346 | [ "${removed##*/}" = "." ] && removed=${removed%/*} |
|
|
347 | |
|
|
348 | # Removed .. directories |
|
|
349 | while [ "${removed}" != "${removed//\/..\/}" ]; do |
|
|
350 | local p1="${removed%%\/..\/*}" |
|
|
351 | local p2="${removed#*\/..\/}" |
|
|
352 | |
|
|
353 | removed="${p1%\/*}/${p2}" |
|
|
354 | done |
|
|
355 | |
|
|
356 | # Remove trailing .. |
|
|
357 | [ "${removed##*/}" = ".." ] && removed=${removed%/*/*} |
|
|
358 | |
|
|
359 | # Remove trailing / |
|
|
360 | [ "${removed##*/}" = "" ] && removed=${removed%/*} |
|
|
361 | |
| 283 | echo ${removed} |
362 | echo ${removed} |
| 284 | fi |
363 | fi |
| 285 | } |
364 | } |
| 286 | |
365 | |
| 287 | # Helper function for create_ml_includes |
366 | # Helper function for create_ml_includes |
| … | |
… | |
| 313 | |
392 | |
| 314 | # Helper function for create_ml_includes |
393 | # Helper function for create_ml_includes |
| 315 | create_ml_includes-allfiles() { |
394 | create_ml_includes-allfiles() { |
| 316 | local basedirs=${@} |
395 | local basedirs=${@} |
| 317 | |
396 | |
| 318 | local files |
397 | local basedir |
| 319 | for basedir in ${basedirs}; do |
398 | for basedir in ${basedirs}; do |
| 320 | local file |
399 | local file |
| 321 | for file in $(find ${D}/${basedir} -type f); do |
400 | for file in $(find ${D}/${basedir} -type f); do |
| 322 | echo ${file/${D}\/${basedir}\//} |
401 | echo ${file/${D}\/${basedir}\//} |
| 323 | done |
402 | done |
| … | |
… | |
| 333 | if [ "${dir}" = "${data/*:/}" ]; then |
412 | if [ "${dir}" = "${data/*:/}" ]; then |
| 334 | echo ${data/:*/} |
413 | echo ${data/:*/} |
| 335 | return 0 |
414 | return 0 |
| 336 | fi |
415 | fi |
| 337 | done |
416 | done |
| 338 | echo "Should be here -- create_ml_includes-sym_for_dir ${1} ${@}" |
417 | echo "Shouldn't be here -- create_ml_includes-sym_for_dir ${1} ${@}" |
| 339 | # exit because we'll likely be called from a subshell |
418 | # exit because we'll likely be called from a subshell |
| 340 | exit 1 |
419 | exit 1 |
| 341 | } |
420 | } |