aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2005-02-10 09:18:34 +0000
committerRoland McGrath <roland@gnu.org>2005-02-10 09:18:34 +0000
commit91adb529b07eca93e25a84d0054418335e2fc6cf (patch)
tree4ec4dbe583b69bcdac6c37b87a32688fafa422a6
parent677dda3f2779b8696689708998129e770d1b8a86 (diff)
downloadglibc-91adb529b07eca93e25a84d0054418335e2fc6cf.zip
glibc-91adb529b07eca93e25a84d0054418335e2fc6cf.tar.gz
glibc-91adb529b07eca93e25a84d0054418335e2fc6cf.tar.bz2
[BZ #632]
2005-02-10 Roland McGrath <roland@redhat.com> [BZ #632] * scripts/soversions.awk: Expect cpu, vendor, os as separate variables from command line. Grok shlib-versions lines with WORDSIZE* in second column. Add new leading column to output, DEFAULT for existing output lines. Also emit lines with WORDSIZE* for alternate configurations. * Makeconfig ($(common-objpfx)soversions.i): Pass those variables. ($(common-objpfx)soversions.mk): Grok new column, use only DEFAULT. ($(common-objpfx)gnu/lib-names.stmp): Depend on soversions.i instead of soversions.mk; replace inline shell script with use of ... * scripts/lib-names.awk: New file. If input has non-DEFAULT lines, emit multiple sets of macros under #if. * shlib-versions (x86_64-.*-.*): Add WORDSIZE32 line mapping to i686. (s390x-.*-.*): Likewise for s390. (powerpc64-.*-.*): Likewise for powerpc. (sparc64-.*-.*): Likewise for sparc.
-rw-r--r--ChangeLog19
-rw-r--r--Makeconfig33
-rw-r--r--scripts/lib-names.awk68
-rw-r--r--scripts/soversions.awk58
-rw-r--r--shlib-versions12
5 files changed, 150 insertions, 40 deletions
diff --git a/ChangeLog b/ChangeLog
index b64d2b1..7a15f2f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2005-02-10 Roland McGrath <roland@redhat.com>
+
+ [BZ #632]
+ * scripts/soversions.awk: Expect cpu, vendor, os as separate variables
+ from command line.
+ Grok shlib-versions lines with WORDSIZE* in second column.
+ Add new leading column to output, DEFAULT for existing output lines.
+ Also emit lines with WORDSIZE* for alternate configurations.
+ * Makeconfig ($(common-objpfx)soversions.i): Pass those variables.
+ ($(common-objpfx)soversions.mk): Grok new column, use only DEFAULT.
+ ($(common-objpfx)gnu/lib-names.stmp): Depend on soversions.i instead
+ of soversions.mk; replace inline shell script with use of ...
+ * scripts/lib-names.awk: New file. If input has non-DEFAULT lines,
+ emit multiple sets of macros under #if.
+ * shlib-versions (x86_64-.*-.*): Add WORDSIZE32 line mapping to i686.
+ (s390x-.*-.*): Likewise for s390.
+ (powerpc64-.*-.*): Likewise for powerpc.
+ (sparc64-.*-.*): Likewise for sparc.
+
2005-02-08 Jakub Jelinek <jakub@redhat.com>
* elf/dl-load.c (_dl_map_object_from_fd): Fix a typo.
diff --git a/Makeconfig b/Makeconfig
index 5ecda01..3060532 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -787,11 +787,14 @@ soversions-default-setname = $(patsubst %, %,\
$(common-objpfx)soversions.i: $(..)scripts/soversions.awk \
$(common-objpfx)shlib-versions.v
$(AWK) -v default_setname='$(soversions-default-setname)' \
- -v config='$(config-machine)-$(config-vendor)-$(config-os)' \
+ -v cpu='$(config-machine)' \
+ -v vendor='$(config-vendor)' \
+ -v os='$(config-os)' \
-f $^ > $@T
mv -f $@T $@
$(common-objpfx)soversions.mk: $(common-objpfx)soversions.i
- (while read lib number setname; do \
+ (while read which lib number setname; do \
+ test x"$$which" = xDEFAULT || continue; \
case $$number in \
[0-9]*) echo "$$lib.so-version=.$$number"; \
echo "all-sonames+=$$lib=$$lib.so\$$($$lib.so-version)";;\
@@ -812,31 +815,11 @@ postclean-generated += soversions.mk soversions.i \
before-compile += $(common-objpfx)gnu/lib-names.h
ifeq ($(soversions.mk-done),t)
$(common-objpfx)gnu/lib-names.h: $(common-objpfx)gnu/lib-names.stmp; @:
-$(common-objpfx)gnu/lib-names.stmp: $(common-objpfx)soversions.mk
+$(common-objpfx)gnu/lib-names.stmp: $(..)scripts/lib-names.awk \
+ $(common-objpfx)soversions.i
$(make-target-directory)
@rm -f ${@:stmp=T} $@
- (echo '/* This file is automatically generated.';\
- echo ' It defines macros to allow user program to find the shared';\
- echo ' library files which come as part of GNU libc. */';\
- echo '#ifndef __GNU_LIB_NAMES_H'; \
- echo '#define __GNU_LIB_NAMES_H 1'; \
- echo; \
- (libs='$(all-sonames)';\
- for l in $$libs; do \
- name=`echo $$l | sed 's/.*=//'`; \
- upname=`echo $$l | sed 's/=.*//' | \
- tr 'abcdefghijklmnopqrstuvwxyz-' \
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`; \
- upname2=`echo $$name | sed 's/[.]so.*//' | \
- tr 'abcdefghijklmnopqrstuvwxyz-' \
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`; \
- echo "#define $${upname}_SO \"$$name\""; \
- if test $$upname != $$upname2; then \
- echo "#define $${upname2}_SO \"$$name\""; \
- fi; \
- done;) | sort; \
- echo; \
- echo '#endif /* gnu/lib-names.h */';) > ${@:stmp=T}
+ $(AWK) -f $^ > ${@:stmp=T}
$(move-if-change) ${@:stmp=T} ${@:stmp=h}
touch $@
endif
diff --git a/scripts/lib-names.awk b/scripts/lib-names.awk
new file mode 100644
index 0000000..31f248f
--- /dev/null
+++ b/scripts/lib-names.awk
@@ -0,0 +1,68 @@
+# awk script for soversions.i -> gnu/lib-names.h; see Makeconfig.
+
+$1 != "DEFAULT" { multi = 1 }
+
+#
+{
+ lib = $2;
+ version = $3;
+ if ($3 ~ /[^0-9]/) {
+ soname = $3;
+ extra = $3;
+ sub(/\.so.*$/, "", extra);
+ }
+ else {
+ soname = lib ".so." $3;
+ extra = "";
+ }
+ soname = "\"" soname "\"";
+ lib = toupper(lib);
+ extra = toupper(extra);
+ gsub(/-/, "_", lib);
+ gsub(/-/, "_", extra);
+ macros[$1 FS lib "_SO"] = soname;
+ if (extra)
+ macros[$1 FS extra "_SO"] = soname;
+}
+
+END {
+ print "/* This file is automatically generated.";
+ print " It defines macros to allow user program to find the shared";
+ print " library files which come as part of GNU libc. */";
+ print "#ifndef __GNU_LIB_NAMES_H";
+ print "#define __GNU_LIB_NAMES_H 1";
+ print "";
+
+ pfx = multi ? "# define " : "#define ";
+ for (elt in macros) {
+ split(elt, x);
+ line = sprintf("%-40s%s", pfx x[2], macros[elt]);
+ if (x[1] in lines)
+ lines[x[1]] = lines[x[1]] "\n" line;
+ else
+ lines[x[1]] = line;
+ }
+
+ default_lines = lines["DEFAULT"];
+ delete lines["DEFAULT"];
+ if (multi) {
+ print "#include <bits/wordsize.h>\n";
+ pfx = "#if";
+ for (kind in lines) {
+ l = lines[kind];
+ sub(/WORDSIZE/, "", kind);
+ print pfx, "__WORDSIZE", "==", kind;
+ cmd = "LC_ALL=C sort"; print l | cmd; close(cmd);
+ pfx = "#elif";
+ }
+ print "#else";
+ cmd = "LC_ALL=C sort"; print default_lines | cmd; close(cmd);
+ print "#endif";
+ }
+ else {
+ cmd = "LC_ALL=C sort"; print default_lines | cmd; close(cmd);
+ }
+
+ print "";
+ print "#endif /* gnu/lib-names.h */"
+}
diff --git a/scripts/soversions.awk b/scripts/soversions.awk
index 6207088..3d50c4d 100644
--- a/scripts/soversions.awk
+++ b/scripts/soversions.awk
@@ -1,14 +1,29 @@
-# awk script for shlib-versions.v.i -> soversions.i; see Makeconfig.
+# awk script for shlib-versions.v -> soversions.i; see Makeconfig.
-# Only lines matching `config' (set with -v) are relevant to us.
-config !~ $1 { next }
+BEGIN {
+ config = cpu "-" vendor "-" os;
+ configs[config] = "DEFAULT";
+}
+
+{ thiscf = $1 }
+
+$2 ~ /WORDSIZE[3264]/ {
+ if (config ~ thiscf) {
+ othercf = $3;
+ sub(/@CPU@/, cpu, othercf);
+ sub(/@VENDOR@/, vendor, othercf);
+ sub(/@OS@/, os, othercf);
+ configs[othercf] = $2;
+ }
+ next;
+}
# Obey the first matching DEFAULT line.
$2 == "DEFAULT" {
- if (!matched_default) {
- matched_default = 1;
+ if (!matched_default[thiscf]) {
+ matched_default[thiscf] = 1;
$1 = $2 = "";
- default_setname = $0;
+ default_set[thiscf] = $0;
}
next
}
@@ -19,20 +34,33 @@ $2 == "DEFAULT" {
lib = number = $2;
sub(/=.*$/, "", lib);
sub(/^.*=/, "", number);
- if (lib in numbers) next;
- numbers[lib] = number;
+ if ((thiscf FS lib) in numbers) next;
+ numbers[thiscf FS lib] = number;
+ order[thiscf FS lib] = ++order_n;
if (NF > 2) {
$1 = $2 = "";
- versions[lib] = $0
+ versions[thiscf FS lib] = $0
}
}
END {
- for (lib in numbers) {
- set = (lib in versions) ? versions[lib] : default_setname;
- if (set)
- print lib, numbers[lib], set;
- else
- print lib, numbers[lib];
+ for (elt in numbers) {
+ split(elt, x);
+ cf = x[1];
+ lib = x[2];
+ if (default_setname && !(cf in default_set) && config ~ cf)
+ default_set[cf] = default_setname;
+ set = (elt in versions) ? versions[elt] : default_set[cf];
+ line = set ? (lib FS numbers[elt] FS set) : (lib FS numbers[elt]);
+ for (c in configs)
+ if (c ~ cf) {
+ if (!((c FS lib) in lineorder) || order[elt] < lineorder[c FS lib]) {
+ lineorder[c FS lib] = order[elt];
+ lines[c FS lib] = configs[c] FS line;
+ }
+ }
+ }
+ for (c in lines) {
+ print lines[c]
}
}
diff --git a/shlib-versions b/shlib-versions
index 72cbb4a..b6999c3 100644
--- a/shlib-versions
+++ b/shlib-versions
@@ -17,6 +17,11 @@
# to apply on matching configurations when the matching entry for a particular
# library has no third column. The defaults must precede the entries they
# apply to.
+#
+# An entry with WORDSIZE* in the second column gives an alternate
+# configuration tuple whose macros will be conditionally defined in
+# gnu/lib-names.h; @CPU@, @VENDOR@, @OS@ can be used in the third
+# column to compose the alternate tuple matched against the patterns here.
# Configuration DEFAULT Earliest symbol set
# ------------- --------------- ------------------------------
@@ -27,6 +32,13 @@ x86_64-.*-linux.* DEFAULT GLIBC_2.2.5
powerpc64-.*-linux.* DEFAULT GLIBC_2.3
.*-.*-gnu-gnu.* DEFAULT GLIBC_2.2.6
+# Configuration WORDSIZE32 Alternate configuration
+# ------------- ---------- -----------------------
+x86_64-.*-.* WORDSIZE32 i686-@VENDOR@-@OS@
+s390x-.*-.* WORDSIZE32 s390-@VENDOR@-@OS@
+powerpc64-.*-.* WORDSIZE32 powerpc-@VENDOR@-@OS@
+sparc64-.*-.* WORDSIZE32 sparc-@VENDOR@-@OS@
+
# Configuration Library=version Earliest symbol set (optional)
# ------------- --------------- ------------------------------