1cabdff1aSopenharmony_ci#!/bin/sh 2cabdff1aSopenharmony_ci 3cabdff1aSopenharmony_ci# Copyright (c) 2013, Derek Buitenhuis 4cabdff1aSopenharmony_ci# 5cabdff1aSopenharmony_ci# Permission to use, copy, modify, and/or distribute this software for any 6cabdff1aSopenharmony_ci# purpose with or without fee is hereby granted, provided that the above 7cabdff1aSopenharmony_ci# copyright notice and this permission notice appear in all copies. 8cabdff1aSopenharmony_ci# 9cabdff1aSopenharmony_ci# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10cabdff1aSopenharmony_ci# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11cabdff1aSopenharmony_ci# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12cabdff1aSopenharmony_ci# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13cabdff1aSopenharmony_ci# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14cabdff1aSopenharmony_ci# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15cabdff1aSopenharmony_ci# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16cabdff1aSopenharmony_ci 17cabdff1aSopenharmony_ci# mktemp isn't POSIX, so supply an implementation 18cabdff1aSopenharmony_cimktemp() { 19cabdff1aSopenharmony_ci echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$" 20cabdff1aSopenharmony_ci} 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ciif [ $# -lt 2 ]; then 23cabdff1aSopenharmony_ci echo "Usage: makedef <version_script> <objects>" >&2 24cabdff1aSopenharmony_ci exit 0 25cabdff1aSopenharmony_cifi 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_civscript=$1 28cabdff1aSopenharmony_cishift 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ciif [ ! -f "$vscript" ]; then 31cabdff1aSopenharmony_ci echo "Version script does not exist" >&2 32cabdff1aSopenharmony_ci exit 1 33cabdff1aSopenharmony_cifi 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_cifor object in "$@"; do 36cabdff1aSopenharmony_ci if [ ! -f "$object" ]; then 37cabdff1aSopenharmony_ci echo "Object does not exist: ${object}" >&2 38cabdff1aSopenharmony_ci exit 1 39cabdff1aSopenharmony_ci fi 40cabdff1aSopenharmony_cidone 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci# Create a lib temporarily to dump symbols from. 43cabdff1aSopenharmony_ci# It's just much easier to do it this way 44cabdff1aSopenharmony_cilibname=$(mktemp -u "library").lib 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_citrap 'rm -f -- $libname' EXIT 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ciif [ -n "$AR" ]; then 49cabdff1aSopenharmony_ci $AR rcs ${libname} $@ >/dev/null 50cabdff1aSopenharmony_cielse 51cabdff1aSopenharmony_ci lib.exe -out:${libname} $@ >/dev/null 52cabdff1aSopenharmony_cifi 53cabdff1aSopenharmony_ciif [ $? != 0 ]; then 54cabdff1aSopenharmony_ci echo "Could not create temporary library." >&2 55cabdff1aSopenharmony_ci exit 1 56cabdff1aSopenharmony_cifi 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ciIFS=' 59cabdff1aSopenharmony_ci' 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ciprefix="$EXTERN_PREFIX" 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_cistarted=0 64cabdff1aSopenharmony_ciregex="none" 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_cifor line in $(cat ${vscript} | tr '\t' ' '); do 67cabdff1aSopenharmony_ci # We only care about global symbols 68cabdff1aSopenharmony_ci echo "${line}" | grep -q '^ \+global:' 69cabdff1aSopenharmony_ci if [ $? = 0 ]; then 70cabdff1aSopenharmony_ci started=1 71cabdff1aSopenharmony_ci line=$(echo "${line}" | sed -e 's/^ \{1,\}global: *//') 72cabdff1aSopenharmony_ci else 73cabdff1aSopenharmony_ci echo "${line}" | grep -q '^ \+local:' 74cabdff1aSopenharmony_ci if [ $? = 0 ]; then 75cabdff1aSopenharmony_ci started=0 76cabdff1aSopenharmony_ci fi 77cabdff1aSopenharmony_ci fi 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci if [ ${started} = 0 ]; then 80cabdff1aSopenharmony_ci continue 81cabdff1aSopenharmony_ci fi 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_ci # Handle multiple symbols on one line 84cabdff1aSopenharmony_ci IFS=';' 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci # Work around stupid expansion to filenames 87cabdff1aSopenharmony_ci line=$(echo "${line}" | sed -e 's/\*/.\\+/g') 88cabdff1aSopenharmony_ci for exp in ${line}; do 89cabdff1aSopenharmony_ci # Remove leading and trailing whitespace 90cabdff1aSopenharmony_ci exp=$(echo "${exp}" | sed -e 's/^ *//' -e 's/ *$//') 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci if [ "${regex}" = "none" ]; then 93cabdff1aSopenharmony_ci regex="${exp}" 94cabdff1aSopenharmony_ci else 95cabdff1aSopenharmony_ci regex="${regex};${exp}" 96cabdff1aSopenharmony_ci fi 97cabdff1aSopenharmony_ci done 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci IFS=' 100cabdff1aSopenharmony_ci' 101cabdff1aSopenharmony_cidone 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ciif [ -n "$NM" ]; then 104cabdff1aSopenharmony_ci # Use eval, since NM="nm -g" 105cabdff1aSopenharmony_ci dump=$(eval "$NM --defined-only -g ${libname}" | 106cabdff1aSopenharmony_ci grep -v : | 107cabdff1aSopenharmony_ci grep -v ^$ | 108cabdff1aSopenharmony_ci cut -d' ' -f3 | 109cabdff1aSopenharmony_ci sed -e "s/^${prefix}//") 110cabdff1aSopenharmony_cielse 111cabdff1aSopenharmony_ci dump=$(dumpbin.exe -linkermember:1 ${libname} | 112cabdff1aSopenharmony_ci sed -e '/public symbols/,$!d' -e '/^ \{1,\}Summary/,$d' -e "s/ \{1,\}${prefix}/ /" -e 's/ \{1,\}/ /g' | 113cabdff1aSopenharmony_ci tail -n +2 | 114cabdff1aSopenharmony_ci cut -d' ' -f3) 115cabdff1aSopenharmony_cifi 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_cirm ${libname} 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ciIFS=';' 120cabdff1aSopenharmony_cilist="" 121cabdff1aSopenharmony_cifor exp in ${regex}; do 122cabdff1aSopenharmony_ci list="${list}"' 123cabdff1aSopenharmony_ci'$(echo "${dump}" | 124cabdff1aSopenharmony_ci grep "^${exp}" | 125cabdff1aSopenharmony_ci sed -e 's/^/ /') 126cabdff1aSopenharmony_cidone 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_ciecho "EXPORTS" 129cabdff1aSopenharmony_ciecho "${list}" | sort | uniq | tail -n +2 130