You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					105 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					105 lines
				
				2.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								#!/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
							 |