130 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			130 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#!/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
							 |