f20a343b46
Package-Manager: portage-2.2.7 RepoMan-Options: --force
336 lines
8.4 KiB
Plaintext
336 lines
8.4 KiB
Plaintext
# Copyright 1999-2005 Gentoo Foundation
|
|
# Distributed under the terms of the GNU General Public License v2
|
|
# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc/files/awk/fixlafiles.awk-no_gcc_la,v 1.4 2010/03/19 23:53:07 vapier Exp $
|
|
|
|
#
|
|
# Helper functions
|
|
#
|
|
function printn(string) {
|
|
printf("%s", string)
|
|
}
|
|
function einfo(string) {
|
|
printf(" \033[32;01m*\033[0m %s\n", string)
|
|
}
|
|
function einfon(string) {
|
|
printf(" \033[32;01m*\033[0m %s", string)
|
|
}
|
|
function ewarn(string) {
|
|
printf(" \033[33;01m*\033[0m %s\n", string)
|
|
}
|
|
function ewarnn(string) {
|
|
printf(" \033[33;01m*\033[0m %s", string)
|
|
}
|
|
function eerror(string) {
|
|
printf(" \033[31;01m*\033[0m %s\n", string)
|
|
}
|
|
|
|
#
|
|
# assert(condition, errmsg)
|
|
# assert that a condition is true. Otherwise exit.
|
|
#
|
|
function assert(condition, string) {
|
|
if (! condition) {
|
|
printf("%s:%d: assertion failed: %s\n",
|
|
FILENAME, FNR, string) > "/dev/stderr"
|
|
_assert_exit = 1
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
#
|
|
# system(command, return)
|
|
# wrapper that normalizes return codes ...
|
|
#
|
|
function dosystem(command, ret) {
|
|
ret = 0
|
|
ret = system(command)
|
|
if (ret == 0)
|
|
return 1
|
|
else
|
|
return 0
|
|
}
|
|
|
|
#
|
|
# parse_ld_conf(config_file)
|
|
#
|
|
function parse_ld_conf(conf, pipe, ldsoconf_data, CHILD, y) {
|
|
pipe = "cd /etc; cat " conf " | sort 2>/dev/null"
|
|
while(((pipe) | getline ldsoconf_data) > 0) {
|
|
if (ldsoconf_data ~ /^[[:space:]]*#/)
|
|
continue
|
|
if (ldsoconf_data == "")
|
|
continue
|
|
|
|
# Handle the "include" keyword
|
|
if (ldsoconf_data ~ /^include /) {
|
|
sub(/^include /, "", ldsoconf_data)
|
|
parse_ld_conf(ldsoconf_data)
|
|
continue
|
|
}
|
|
|
|
# Remove any trailing comments
|
|
sub(/#.*$/, "", ldsoconf_data)
|
|
# Remove any trailing spaces
|
|
sub(/[[:space:]]+$/, "", ldsoconf_data)
|
|
# Eat duplicate slashes
|
|
sub(/\/\//, "/", ldsoconf_data)
|
|
# Prune trailing /
|
|
sub(/\/$/, "", ldsoconf_data)
|
|
|
|
#
|
|
# Drop the directory if its a child directory of
|
|
# one that was already added ...
|
|
# For example, if we have:
|
|
# /usr/lib /usr/libexec /usr/lib/mozilla /usr/lib/nss
|
|
# We really just want to save /usr/lib /usr/libexec
|
|
#
|
|
CHILD = 0
|
|
for (y in DIRLIST) {
|
|
if (ldsoconf_data ~ "^" DIRLIST[y] "(/|$)") {
|
|
CHILD = 1
|
|
break
|
|
}
|
|
}
|
|
if (CHILD) continue
|
|
|
|
DIRLIST[++LIBCOUNT] = ldsoconf_data
|
|
}
|
|
close(pipe)
|
|
}
|
|
|
|
BEGIN {
|
|
#
|
|
# Get our variables from environment
|
|
#
|
|
OLDVER = ENVIRON["OLDVER"]
|
|
OLDCHOST = ENVIRON["OLDCHOST"]
|
|
|
|
if (OLDVER == "") {
|
|
eerror("Could not get OLDVER!");
|
|
exit 1
|
|
}
|
|
|
|
# Setup some sane defaults
|
|
LIBCOUNT = 2
|
|
HAVE_GCC34 = 0
|
|
DIRLIST[1] = "/lib"
|
|
DIRLIST[2] = "/usr/lib"
|
|
|
|
#
|
|
# Walk /etc/ld.so.conf to discover all our library paths
|
|
#
|
|
parse_ld_conf("/etc/ld.so.conf")
|
|
|
|
#
|
|
# Get line from gcc's output containing CHOST
|
|
#
|
|
pipe = "gcc -print-file-name=libgcc.a 2>/dev/null"
|
|
if ((!((pipe) | getline TMP_CHOST)) || (TMP_CHOST == "")) {
|
|
close(pipe)
|
|
|
|
# If we fail to get the CHOST, see if we can get the CHOST
|
|
# portage thinks we are using ...
|
|
pipe = "/usr/bin/portageq envvar 'CHOST'"
|
|
assert(((pipe) | getline CHOST), "(" pipe ") | getline CHOST")
|
|
} else {
|
|
# Check pre gcc-3.4.x versions
|
|
CHOST = gensub("^.+lib/gcc-lib/([^/]+)/[0-9]+.+$", "\\1", 1, TMP_CHOST)
|
|
|
|
if (CHOST == TMP_CHOST || CHOST == "") {
|
|
# Check gcc-3.4.x or later
|
|
CHOST = gensub("^.+lib/gcc/([^/]+)/[0-9]+.+$", "\\1", 1, TMP_CHOST);
|
|
|
|
if (CHOST == TMP_CHOST || CHOST == "")
|
|
CHOST = ""
|
|
else
|
|
HAVE_GCC34 = 1
|
|
}
|
|
}
|
|
close(pipe)
|
|
|
|
if (CHOST == "") {
|
|
eerror("Could not get gcc's CHOST!")
|
|
exit 1
|
|
}
|
|
|
|
if (OLDCHOST != "")
|
|
if (OLDCHOST == CHOST)
|
|
OLDCHOST = ""
|
|
|
|
GCCLIBPREFIX_OLD = "/usr/lib/gcc-lib/"
|
|
GCCLIBPREFIX_NEW = "/usr/lib/gcc/"
|
|
|
|
if (HAVE_GCC34)
|
|
GCCLIBPREFIX = GCCLIBPREFIX_NEW
|
|
else
|
|
GCCLIBPREFIX = GCCLIBPREFIX_OLD
|
|
|
|
GCCLIB = GCCLIBPREFIX CHOST
|
|
|
|
if (OLDCHOST != "") {
|
|
OLDGCCLIB1 = GCCLIBPREFIX_OLD OLDCHOST
|
|
OLDGCCLIB2 = GCCLIBPREFIX_NEW OLDCHOST
|
|
}
|
|
|
|
# Get current gcc's version
|
|
pipe = "gcc -dumpversion"
|
|
assert(((pipe) | getline NEWVER), "(" pipe ") | getline NEWVER)")
|
|
close(pipe)
|
|
|
|
if (NEWVER == "") {
|
|
eerror("Could not get gcc's version!")
|
|
exit 1
|
|
}
|
|
|
|
# Nothing to do ?
|
|
# NB: Do not check for (OLDVER == NEWVER) anymore, as we might need to
|
|
# replace libstdc++.la ....
|
|
if ((OLDVER == "") && (OLDCHOST == ""))
|
|
exit 0
|
|
|
|
#
|
|
# Ok, now let's scan for the .la files and actually fix them up
|
|
#
|
|
for (x = 1; x <= LIBCOUNT; x++) {
|
|
# Do nothing if the target dir is gcc's internal library path
|
|
if (DIRLIST[x] ~ GCCLIBPREFIX_OLD ||
|
|
DIRLIST[x] ~ GCCLIBPREFIX_NEW)
|
|
continue
|
|
|
|
einfo(" [" x "/" LIBCOUNT "] Scanning " DIRLIST[x] " ...")
|
|
|
|
pipe = "find " DIRLIST[x] "/ -name '*.la' 2>/dev/null"
|
|
while (((pipe) | getline la_files) > 0) {
|
|
|
|
# Do nothing if the .la file is located in gcc's internal lib path
|
|
if (la_files ~ GCCLIBPREFIX_OLD ||
|
|
la_files ~ GCCLIBPREFIX_NEW)
|
|
continue
|
|
|
|
CHANGED = 0
|
|
CHOST_CHANGED = 0
|
|
|
|
# See if we need to fix the .la file
|
|
while ((getline la_data < (la_files)) > 0) {
|
|
if (OLDCHOST != "") {
|
|
if ((gsub(OLDGCCLIB1 "[/[:space:]]+",
|
|
GCCLIB, la_data) > 0) ||
|
|
(gsub(OLDGCCLIB2 "[/[:space:]]+",
|
|
GCCLIB, la_data) > 0)) {
|
|
CHANGED = 1
|
|
CHOST_CHANGED = 1
|
|
}
|
|
}
|
|
if (OLDVER != NEWVER) {
|
|
if ((gsub(GCCLIBPREFIX_OLD CHOST "/" OLDVER "[/[:space:]]*",
|
|
GCCLIB "/" NEWVER, la_data) > 0) ||
|
|
(gsub(GCCLIBPREFIX_NEW CHOST "/" OLDVER "[/[:space:]]*",
|
|
GCCLIB "/" NEWVER, la_data) > 0))
|
|
CHANGED = 1
|
|
}
|
|
# We now check if we have libstdc++.la, as we remove the
|
|
# libtool linker scripts for gcc ...
|
|
# We do this last, as we only match the new paths
|
|
if (gsub(GCCLIB "/" NEWVER "/libstdc\\+\\+\\.la",
|
|
"-lstdc++", la_data) > 0)
|
|
CHANGED = 1
|
|
}
|
|
close(la_files)
|
|
|
|
# Do the actual changes in a second loop, as we can then
|
|
# verify that CHOST_CHANGED among things is correct ...
|
|
if (CHANGED) {
|
|
ewarnn(" FIXING: " la_files " ...[")
|
|
|
|
# Clear the temp file (removing rather than '>foo' is better
|
|
# out of a security point of view?)
|
|
dosystem("rm -f " la_files ".new")
|
|
|
|
while ((getline la_data < (la_files)) > 0) {
|
|
if (OLDCHOST != "") {
|
|
tmpstr = gensub(OLDGCCLIB1 "([/[:space:]]+)",
|
|
GCCLIB "\\1", "g", la_data)
|
|
tmpstr = gensub(OLDGCCLIB2 "([/[:space:]]+)",
|
|
GCCLIB "\\1", "g", tmpstr)
|
|
|
|
if (la_data != tmpstr) {
|
|
printn("c")
|
|
la_data = tmpstr
|
|
}
|
|
|
|
if (CHOST_CHANGED > 0) {
|
|
# We try to be careful about CHOST changes outside
|
|
# the gcc library path (meaning we cannot match it
|
|
# via /GCCLIBPREFIX CHOST/) ...
|
|
|
|
# Catch:
|
|
#
|
|
# dependency_libs=' -L/usr/CHOST/{bin,lib}'
|
|
#
|
|
gsub("-L/usr/" OLDCHOST "/",
|
|
"-L/usr/" CHOST "/", la_data)
|
|
# Catch:
|
|
#
|
|
# dependency_libs=' -L/usr/lib/gcc-lib/CHOST/VER/../../../../CHOST/lib'
|
|
#
|
|
la_data = gensub("(" GCCLIB "/[^[:space:]]+)/" OLDCHOST "/",
|
|
"\\1/" CHOST "/", "g", la_data)
|
|
}
|
|
}
|
|
|
|
if (OLDVER != NEWVER) {
|
|
# Catch:
|
|
#
|
|
# dependency_libs=' -L/usr/lib/gcc/CHOST/VER'
|
|
#
|
|
tmpstr = gensub(GCCLIBPREFIX_OLD CHOST "/" OLDVER "([/[:space:]]+)",
|
|
GCCLIB "/" NEWVER "\\1", "g", la_data)
|
|
tmpstr = gensub(GCCLIBPREFIX_NEW CHOST "/" OLDVER "([/[:space:]]+)",
|
|
GCCLIB "/" NEWVER "\\1", "g", tmpstr)
|
|
|
|
if (la_data != tmpstr) {
|
|
# Catch:
|
|
#
|
|
# dependency_libs=' -L/usr/lib/gcc-lib/../../CHOST/lib'
|
|
#
|
|
# in cases where we have gcc34
|
|
tmpstr = gensub(GCCLIBPREFIX_OLD "(../../" CHOST "/lib)",
|
|
GCCLIBPREFIX "\\1", "g", tmpstr)
|
|
tmpstr = gensub(GCCLIBPREFIX_NEW "(../../" CHOST "/lib)",
|
|
GCCLIBPREFIX "\\1", "g", tmpstr)
|
|
printn("v")
|
|
la_data = tmpstr
|
|
}
|
|
}
|
|
|
|
# We now check if we have libstdc++.la, as we remove the
|
|
# libtool linker scripts for gcc and any referencese in any
|
|
# libtool linker scripts.
|
|
# We do this last, as we only match the new paths
|
|
tmpstr = gensub(GCCLIB "/" NEWVER "/libstdc\\+\\+\\.la",
|
|
"-lstdc++", "g", la_data);
|
|
if (la_data != tmpstr) {
|
|
printn("l")
|
|
la_data = tmpstr
|
|
}
|
|
|
|
print la_data >> (la_files ".new")
|
|
}
|
|
|
|
if (CHANGED)
|
|
print "]"
|
|
|
|
close(la_files)
|
|
close(la_files ".new")
|
|
|
|
assert(dosystem("mv -f " la_files ".new " la_files),
|
|
"dosystem(\"mv -f " la_files ".new " la_files "\")")
|
|
}
|
|
}
|
|
|
|
close(pipe)
|
|
}
|
|
}
|
|
|
|
# vim:ts=4
|