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