123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- #!/bin/sh
- # Copyright (c) 2013, Derek Buitenhuis
- #
- # Permission to use, copy, modify, and/or distribute this software for any
- # purpose with or without fee is hereby granted, provided that the above
- # copyright notice and this permission notice appear in all copies.
- #
- # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- # mktemp isn't POSIX, so supply an implementation
- mktemp() {
- echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
- }
- if [ $# -lt 2 ]; then
- echo "Usage: makedef <version_script> <objects>" >&2
- exit 0
- fi
- vscript=$1
- shift
- if [ ! -f "$vscript" ]; then
- echo "Version script does not exist" >&2
- exit 1
- fi
- for object in "$@"; do
- if [ ! -f "$object" ]; then
- echo "Object does not exist: ${object}" >&2
- exit 1
- fi
- done
- # Create a lib temporarily to dump symbols from.
- # It's just much easier to do it this way
- libname=$(mktemp -u "library").lib
- trap 'rm -f -- $libname' EXIT
- if [ -n "$AR" ]; then
- $AR rcs ${libname} $@ >/dev/null
- else
- lib.exe -out:${libname} $@ >/dev/null
- fi
- if [ $? != 0 ]; then
- echo "Could not create temporary library." >&2
- exit 1
- fi
- IFS='
- '
- prefix="$EXTERN_PREFIX"
- started=0
- regex="none"
- for line in $(cat ${vscript} | tr '\t' ' '); do
- # We only care about global symbols
- echo "${line}" | grep -q '^ \+global:'
- if [ $? = 0 ]; then
- started=1
- line=$(echo "${line}" | sed -e 's/^ \{1,\}global: *//')
- else
- echo "${line}" | grep -q '^ \+local:'
- if [ $? = 0 ]; then
- started=0
- fi
- fi
- if [ ${started} = 0 ]; then
- continue
- fi
- # Handle multiple symbols on one line
- IFS=';'
- # Work around stupid expansion to filenames
- line=$(echo "${line}" | sed -e 's/\*/.\\+/g')
- for exp in ${line}; do
- # Remove leading and trailing whitespace
- exp=$(echo "${exp}" | sed -e 's/^ *//' -e 's/ *$//')
- if [ "${regex}" = "none" ]; then
- regex="${exp}"
- else
- regex="${regex};${exp}"
- fi
- done
- IFS='
- '
- done
- if [ -n "$NM" ]; then
- # Use eval, since NM="nm -g"
- dump=$(eval "$NM --defined-only -g ${libname}" |
- grep -v : |
- grep -v ^$ |
- cut -d' ' -f3 |
- sed -e "s/^${prefix}//")
- else
- dump=$(dumpbin.exe -linkermember:1 ${libname} |
- sed -e '/public symbols/,$!d' -e '/^ \{1,\}Summary/,$d' -e "s/ \{1,\}${prefix}/ /" -e 's/ \{1,\}/ /g' |
- tail -n +2 |
- cut -d' ' -f3)
- fi
- rm ${libname}
- IFS=';'
- list=""
- for exp in ${regex}; do
- list="${list}"'
- '$(echo "${dump}" |
- grep "^${exp}" |
- sed -e 's/^/ /')
- done
- echo "EXPORTS"
- echo "${list}" | sort | uniq | tail -n +2
|