mxe/tools/make-shared-from-static

223 lines
5.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Taken from:
# https://hg.octave.org/mxe-octave/file/tip/tools/make-shared-from-static
set -e
. tools/compat-init.sh
LD=
AR=
INSTALL=
infile=
outfile=
libdir=
bindir=
install=false
windowsdll=false
msvc=false
msvclibmode=false
libprefix=
libsuffix=
LIBS=
topdir=$(pwd)
tmpdir=$topdir/make-shared-from-static.$$
#trap "cd $topdir; rm -rf $tmpdir" 1 2 15
for arg
do
case "$1" in
--install)
install=true
shift
if [ $# -gt 0 ]; then
INSTALL="$1"
shift
else
echo "make-shared-from-static: expecting argument for --install option" 1>&2
exit 1
fi
;;
--windowsdll)
shift
windowsdll=true
;;
--msvc)
shift
msvc=true
;;
--bindir)
shift
if [ $# -gt 0 ]; then
bindir="$1"
shift
else
echo "make-shared-from-static: expecting argument for --bindir option" 1>&2
exit 1
fi
;;
--libdir)
shift
if [ $# -gt 0 ]; then
libdir="$1"
shift
else
echo "make-shared-from-static: expecting argument for --libdir option" 1>&2
exit 1
fi
;;
--ld)
shift
if [ $# -gt 0 ]; then
LD="$1"
shift
else
echo "make-shared-from-static: expecting argument for --ld option" 1>&2
exit 1
fi
;;
--ar)
shift
if [ $# -gt 0 ]; then
AR="$1"
shift
else
echo "make-shared-from-static: expecting argument for --ar option" 1>&2
exit 1
fi
;;
--libprefix)
shift
if [ $# -gt 0 ]; then
libprefix="$1"
shift
else
echo "make-shared-from-static: expecting argument for --libprefix option" 1>&2
exit 1
fi
;;
--libsuffix)
shift
if [ $# -gt 0 ]; then
libsuffix="$1"
shift
else
echo "make-shared-from-static: expecting argument for --libsuffix option" 1>&2
exit 1
fi
;;
-l*)
LIBS="$LIBS $1"
shift
;;
*.a)
if [ -z "$infile" ]; then
case "$1" in
/*)
infile="$1"
;;
*)
infile=$(pwd)/$1
;;
esac
shift
else
echo "make-shared-from-static: only one input file allowed" 1>&2
exit 1
fi
;;
esac
done
if [ -n "$infile" ]; then
base_infile=$(basename $infile)
if $windowsdll; then
if $msvc; then
base_name=`echo $base_infile | $SED -n -e 's/^lib\(.*\)\.a$/\1/p'`
outfile="${libprefix}${base_name}${libsuffix}.dll"
implibfile="$base_name.lib"
# Modern libtool won't create .a files, but will create directly .lib files.
# If the .a file does not exist, check for an existing .lib file.
if [ ! -f "$infile" ]; then
msvc_infiles="`echo $infile | $SED -e 's/\.a$/.lib/'` \
`dirname \"$infile\"`/`echo $base_infile | $SED -e 's/\.a$/.lib/' -e 's/^lib//'`"
for msvc_infile in $msvc_infiles; do
if [ -f "$msvc_infile" ]; then
infile="$msvc_infile"
msvclibmode=true
break
fi
done
fi
else
outfile=$(echo $base_infile | $SED 's/\.a$/.dll/')
implibfile="$outfile.a"
fi
else
outfile=$(echo $base_infile | $SED 's/\.a$/.so/')
fi
else
echo "make-shared-from-static: no input file specified" 1>&2
exit 1
fi
NM=nm
global_symbol_pipe="$SED -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*_\\([_A-Za-z][_A-iZa-z0-9]*\\)\\{0,1\\}\$/\\1 _\\2 \\2/p' | $SED '/ __gnu_lto/d'"
# Ignore DATA symbols for now. They should be be properly exported from
# the source code using dllexport. They can't be re-exported manually like
# this using MSVC.
#export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED -e '/^[BCDGRS][ ]/s/.*[ ]\\\\([^ ]*\\\\)/\\\\1,DATA/' | \$SED -e '/^[AITW][ ]/s/.*[ ]//' | sort | uniq >> \$export_symbols"
export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED -e '/^[BCDGRS][ ]/d' | \$SED -e '/^[AITW][ ]/s/.*[ ]//' | sort | uniq >> \$export_symbols"
mkdir $tmpdir
(
cd $tmpdir
$msvclibmode || $AR x $infile
LIBDIR_ARGS=
if [ -n "$libdir" ]; then
LIBDIR_ARGS="-L$libdir"
fi
if $windowsdll; then
if $msvc; then
export_symbols="$base_name.def"
echo EXPORTS > $export_symbols
if $msvclibmode; then
libobjs="$infile"
else
libobjs="*.o"
fi
convenience=
eval cmd=\"$export_symbols_cmds\"
eval "$cmd"
link_args="-Wl,-def:$export_symbols $libobjs"
else
link_args="-Wl,--export-all-symbols -Wl,--enable-auto-import -Wl,--enable-auto-image-base *.o"
fi
set -x
$LD -shared $link_args -Wl,--out-implib="$implibfile" -o "$outfile" $LIBDIR_ARGS $LIBS
else
$LD -shared -o $outfile *.o $LIBDIR_ARGS $LIBS
fi
if $install; then
if $windowsdll; then
$INSTALL -d "$libdir"
$INSTALL -d "$bindir"
$INSTALL -m755 "$implibfile" "$libdir/$implibfile"
$INSTALL -m755 "$outfile" "$bindir/$outfile"
else
$INSTALL -d "$libdir"
$INSTALL -m755 "$outfile" "$libdir/$outfile"
fi
fi
)
rm -rf $tmpdir