#!/bin/sh
# This is a2dll 1.0
# (c)1999-2000 Paul Sokolovsky
# a2dll is distrubuted under GNU General Public License, see http://www.gnu.org
usage() {
echo 'a2dll 1.0: convert static library into win32 dll'
echo ' by <Paul.Sokolovsky@technologist.com>'
echo 'Usage: a2dll <staticlib> [-o <dllname>] [linker commands:-L,-l,-s] [--relink]'
exit 0
}
cmdline=$@
while test $# -ge 1
do
case "$1" in
-\? | -h* | --h*) usage;;
-o ) out="$2"; shift; shift;;
--relink) relink=1; shift;;
-* ) libs="$libs $1"; shift;;
*) in=$1; shift;;
esac
done
if [ "$in" = "" ]
then
usage
fi
base=`basename $in .a`
if [ "$out" = "" ]
then
out=`awk -v n=$base 'BEGIN {print substr(n,4); exit;}'`.dll
fi
if [ "$relink" != "1" ]
then
rm -f .dll/*
/usr/bin/mkdir -p .dll
cd .dll
ar x ../$in
else
cd .dll
fi
echo Creating shared library \'$out\'
dllwrap --export-all -o ../$out `ls` $libs >../ld.err 2>&1
cd ..
if [ `wc ld.err|awk ' {print $1}' ` -gt 2 ]
then
echo Linking error, consult file \'ld.err\', correct errors, and run
echo \'$0 $cmdline --relink\'
exit 1
else
# cleanup
rm -f ld.err
rm -f .dll/*
/usr/bin/rmdir .dll
# create .def
# we use pexports on dll instead of dlltool on objects for this,
# because it's:
# 1. faster
# 2. I just saw that dlltool lies about assembly-sourced files, it
# lists their symbols as data
pexports $out >$base.def
# create import library
mv $in $in.static
dlltool --dllname $out --def $base.def --output-lib $in
# finally, we check whether dll exports data symbols
# if yes, we suggest user on steps to perform
pexports $out | awk '/DATA/ { print $1}' >$out.data
if test -s $out.data
then
echo
echo Shared library exports data symbols, they are listed \
in \'$out.data\'. For using them in client application, you should mark \
them as __declspec\(dllimport\) in library headers. You can quickly \
find places where these data symbols declared by issuing
echo
echo " grep -f $out.data *.h"
echo
echo in library header directory. Also note that this step is optional, you can postpone \
it until you\'ll get during linking unresolved symbol _imp__\<something\>, where \
\<something\> is one of the symbols listed in $out.data. Read documentation \
\(static2dll_howto.txt\) for more information.
else
rm $out.data
fi
rm $base.def
fi