File: make-version-scripts

package info (click to toggle)
hdf5 1.10.0-patch1%2Bdocs-3%2Bdeb9u1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 143,568 kB
  • sloc: ansic: 472,614; f90: 28,734; java: 27,116; xml: 17,791; sh: 16,757; cpp: 14,937; makefile: 1,769; perl: 1,339; yacc: 338; lex: 184; ruby: 24
file content (91 lines) | stat: -rwxr-xr-x 3,058 bytes parent folder | download | duplicates (2)
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
#!/bin/bash
# This script generates the version scripts

set -e

# 1- Go to debian dir
debian_dir="$(dirname "$(readlink -f "$0")")"
cd "$debian_dir"

# 2- Get sonames
soname=$(cd .. && ./debian/rules SONAME)
soname_cxx=$(cd .. && ./debian/rules SONAME_CXX)

# 3- Read mangled C++ symbols table and declare tne new table
declare -A mangled
declare -A mangled_new

if [ -f mangled-symbols-table ]; then
  while IFS='' read line; do
    if [[ "$line" =~ ^\"([^\"]*)\"\ (_Z[a-zA-Z0-9_]*)$ ]]; then
      mangled["${BASH_REMATCH[1]}"]="${BASH_REMATCH[2]}"
    fi
  done <mangled-symbols-table
fi

# 4- Generate version scripts
#    While doing this, we update the mangled C++ symbols table to drop
#    unused symbols.
function map_symbols_file {
  declare -A versions=()
  declare -A c=()
  declare -A cpp=()

  while IFS='' read ligne; do
    if [[ "$ligne" =~ ^\ (\(([^\)]*)\))?\"?([^@\"]*)@([^\ \"]*)\"?\ ([^\ ]*)$ ]]; then
      flags="${BASH_REMATCH[2]}"
      symbol="${BASH_REMATCH[3]}"
      version_name="${BASH_REMATCH[4]}"
      version_first_seen="${BASH_REMATCH[5]}"
      mangled_cpp_symbol="${mangled["$symbol"]}"
      if [ "$version_name" = "Base" ]; then
        version_name="$version_first_seen"
      else
        version_name="${version_name##*_}"
      fi
      if [ ! ${versions[$version_name]+_} ]; then
        versions[$version_name]=""
      fi
      if [[ "$flags" =~ (^|\|)c\+\+(\||$) ]]; then
        if [ -n "$mangled_cpp_symbol" ]; then
          cpp[$version_name]="${cpp[$version_name]}$(c++filt -i "$mangled_cpp_symbol")\n"
          echo '"'"$symbol"'"'" $mangled_cpp_symbol" >>mangled-symbols-table.new
        else
          cpp[$version_name]="${cpp[$version_name]}${symbol}\n"
        fi
      else
        c[$version_name]="${c[$version_name]}${symbol}\n"
      fi
    fi
  done <"$1"

  echo "/* Generated from script $(basename "$0") */"
  echo
  prev_version=""
  for version in $(echo "${!versions[@]}" | sed 's/ /\n/g' | sort -V); do
    echo "HDF5_@MAP@_$version {"
    # Drop symbols which are version names, such as:"
    # HDF5_CPP_1.8.14@HDF5_CPP_1.8.14
    c[$version]="$(echo -e "${c[$version]}" | grep -v '^HDF5_\(SERIAL\|CPP\|MPI\)_[0-9\.]*$')"
    if [ -n "${cpp[$version]}${c[$version]}" ]; then
      echo "    global:"
    fi
    if [ -n "${cpp[$version]}" ]; then
      echo '        extern "C++" {'
      echo -e "${cpp[$version]}" | sort -u | sed '/^$/d;s/^/            "/;s/$/"\;/'
      echo '        };'
    fi
    echo -e "${c[$version]}" | sort -u | sed '/^$/d;s/^/        /;s/$/\;/'
    echo "}${prev_version:+ HDF5_@MAP@_$prev_version};"
    echo ""
    prev_version=$version
  done
}

rm -f mangled-symbols-table.new
map_symbols_file "libhdf5-$soname.symbols" | sed 's/@MAP@/SERIAL/' >map_serial.ver
map_symbols_file "libhdf5-cpp-$soname_cxx.symbols" | sed 's/@MAP@/CPP/' >>map_serial.ver
map_symbols_file "libhdf5-openmpi-$soname.symbols" | sed 's/@MAP@/MPI/' >map_mpi.ver

# 5- Replace the mangled C++ symbols table with the updated one
mv mangled-symbols-table.new mangled-symbols-table