diff --git a/ChangeLog b/ChangeLog index b64d2b16e4..7a15f2f4ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2005-02-10 Roland McGrath + + [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 * elf/dl-load.c (_dl_map_object_from_fd): Fix a typo. diff --git a/Makeconfig b/Makeconfig index 5ecda01169..306053241d 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 0000000000..31f248f47d --- /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 \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 6207088514..3d50c4deeb 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 72cbb4af0e..b6999c3439 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) # ------------- --------------- ------------------------------