My goal: compile opensc, openssl and putty for windows,
but using linux and mingw (on i686 machine, debian sarge).
that way opensc could build nightly binary pacakges for windows.

so, here is a patch for openssl, so it can be compiled with
mingw under linux. no big changes, mostly using the existing
code, changed paths from \ to / and used the i586-mingw32msvc-*
tools (thats how they are called on debian gnu/linux).

install procedure:

wget http://www.openssl.org/source/openssl-0.9.8-beta5.tar.gz
tar xfvz openssl-0.9.8-beta5.tar.gz
cd openssl-0.9.8-beta5
patch -p1 < ../diff5
sh -x ms/mingw32.sh

mkdir -p /opt/win32/openssl
mkdir /opt/win32/openssl/bin
mkdir /opt/win32/openssl/lib
mkdir /opt/win32/openssl/include
mkdir /opt/win32/openssl/include/openssl

cp outinc/openssl/* /opt/win32/openssl/include/openssl
cp out/*.lib /opt/win32/openssl/lib
cp *.dll /opt/win32/openssl/bin
cp out/openssl.exe /opt/win32/openssl/bin

I can't test the result well today (no windows here),but will
do so tomorrow. the resulting binaries are located at
http://www.opensc.org/files/testing/openssl-0.9.8-beta5-win32.tar.gz

I don't know the openssl build system well, so please help me to
fix any bugs I might have in this patch. (it doesn't change any
existing code, only adds new files and a mingwx option.) 

Thanks, Andreas
diff -udrNP openssl-0.9.8-beta4.orig/Configure openssl-0.9.8-beta4/Configure
--- openssl-0.9.8-beta4.orig/Configure  2005-06-06 00:19:34.000000000 +0200
+++ openssl-0.9.8-beta4/Configure       2005-06-19 18:38:18.195835720 +0200
@@ -474,6 +474,9 @@
 # MinGW
 "mingw", "gcc:-mno-cygwin -DL_ENDIAN -fomit-frame-pointer -O3 -march=i486 
-Wall -D_WIN32_WINNT=0x333:::MINGW32:-lwsock32 -lgdi32:BN_LLONG ${x86_gcc_des} 
${x86_gcc_opts} EXPORT_VAR_AS_FN:${x86_coff_asm}:win32:cygwin-shared:-D_WINDLL 
-DOPENSSL_USE_APPLINK:-mno-cygwin -shared:.dll.a",
 
+# MinGW cross compile
+"mingwx", "i586-mingw32msvc-cc:-mno-cygwin -DL_ENDIAN -fomit-frame-pointer -O3 
-march=i486 -Wall -D_WIN32_WINNT=0x333:::MINGW32:-lwsock32 -lgdi32:BN_LLONG 
${x86_gcc_des} ${x86_gcc_opts} 
EXPORT_VAR_AS_FN:${x86_coff_asm}:win32:cygwin-shared:-D_WINDLL 
-DOPENSSL_USE_APPLINK:-mno-cygwin -shared:.dll.a",
+
 # UWIN 
 "UWIN", "cc:-DTERMIOS -DL_ENDIAN -O -Wall:::UWIN::BN_LLONG ${x86_gcc_des} 
${x86_gcc_opts}:${no_asm}:win32",
 
@@ -908,9 +911,9 @@
 
 my $IsMK1MF=scalar grep /^$target$/,@MK1MF_Builds;
 
-$IsMK1MF=1 if ($target eq "mingw" && $^O ne "cygwin");
+$IsMK1MF=1 if ($target eq "mingw" && $^O ne "mingwx" && $^O ne "cygwin");
 
-$exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target eq 
"mingw");
+$exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target eq 
"mingw" || $target eq "mingwx");
 $exe_ext=".pm"  if ($target =~ /vos/);
 $openssldir="/usr/local/ssl" if ($openssldir eq "" and $prefix eq "");
 $prefix=$openssldir if $prefix eq "";
diff -udrNP openssl-0.9.8-beta4.orig/Makefile openssl-0.9.8-beta4/Makefile
--- openssl-0.9.8-beta4.orig/Makefile   2005-06-06 02:51:46.000000000 +0200
+++ openssl-0.9.8-beta4/Makefile        2005-06-19 18:38:24.904815800 +0200
@@ -11,11 +11,11 @@
 SHLIB_VERSION_HISTORY=
 SHLIB_MAJOR=0
 SHLIB_MINOR=9.8
-SHLIB_EXT=
-PLATFORM=dist
-OPTIONS= no-gmp no-krb5 no-mdc2 no-rc5 no-shared no-zlib no-zlib-dynamic
-CONFIGURE_ARGS=dist
-SHLIB_TARGET=
+SHLIB_EXT=.dll.a
+PLATFORM=mingwx
+OPTIONS=386 no-gmp no-krb5 no-mdc2 no-rc5 no-shared no-sse2 no-zlib 
no-zlib-dynamic
+CONFIGURE_ARGS=386 mingwx
+SHLIB_TARGET=cygwin-shared
 
 # HERE indicates where this Makefile lives.  This can be used to indicate
 # where sub-Makefiles are expected to be.  Currently has very limited usage,
@@ -59,16 +59,16 @@
 # equal 4.
 # PKCS1_CHECK - pkcs1 tests.
 
-CC= cc
-CFLAG= -O
+CC= i586-mingw32msvc-cc
+CFLAG= -DOPENSSL_THREADS  -DDSO_WIN32 -mno-cygwin -DL_ENDIAN 
-fomit-frame-pointer -O3 -march=i486 -Wall -D_WIN32_WINNT=0x333 
-DOPENSSL_BN_ASM_PART_WORDS -DSHA1_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM
 DEPFLAG= -DOPENSSL_NO_GMP -DOPENSSL_NO_MDC2 -DOPENSSL_NO_RC5 
 PEX_LIBS= 
-EX_LIBS= 
-EXE_EXT= 
+EX_LIBS= -lwsock32 -lgdi32
+EXE_EXT= .exe
 ARFLAGS= 
 AR=ar $(ARFLAGS) r
-RANLIB= /usr/bin/ranlib
-PERL= /usr/bin/perl
+RANLIB= true
+PERL= perl
 TAR= tar
 TARFLAGS= --no-recursion
 MAKEDEPPROG=makedepend
@@ -83,20 +83,20 @@
 
 # For x86 assembler: Set PROCESSOR to 386 if you want to support
 # the 80386.
-PROCESSOR= 
+PROCESSOR= 386
 
 # CPUID module collects small commonly used assembler snippets
 CPUID_OBJ= 
-BN_ASM= bn_asm.o
-DES_ENC= des_enc.o fcrypt_b.o
-AES_ASM_OBJ= aes_core.o aes_cbc.o
-BF_ENC= bf_enc.o
-CAST_ENC= c_enc.o
-RC4_ENC= rc4_enc.o
-RC5_ENC= rc5_enc.o
-MD5_ASM_OBJ= 
-SHA1_ASM_OBJ= 
-RMD160_ASM_OBJ= 
+BN_ASM= bn86-cof.o co86-cof.o
+DES_ENC= dx86-cof.o yx86-cof.o
+AES_ASM_OBJ= ax86-cof.o
+BF_ENC= bx86-cof.o
+CAST_ENC= cx86-cof.o
+RC4_ENC= rx86-cof.o
+RC5_ENC= r586-cof.o
+MD5_ASM_OBJ= mx86-cof.o
+SHA1_ASM_OBJ= sx86-cof.o 
+RMD160_ASM_OBJ= rm86-cof.o
 
 # KRB5 stuff
 KRB5_INCLUDES=
@@ -136,7 +136,7 @@
 SHARED_SSL=libssl$(SHLIB_EXT)
 SHARED_LIBS=
 SHARED_LIBS_LINK_EXTS=
-SHARED_LDFLAGS=
+SHARED_LDFLAGS=-mno-cygwin -shared
 
 GENERAL=        Makefile
 BASENAME=       openssl
diff -udrNP openssl-0.9.8-beta4.orig/crypto/opensslconf.h 
openssl-0.9.8-beta4/crypto/opensslconf.h
--- openssl-0.9.8-beta4.orig/crypto/opensslconf.h       2005-06-06 
02:51:46.000000000 +0200
+++ openssl-0.9.8-beta4/crypto/opensslconf.h    2005-06-19 18:38:24.960807288 
+0200
@@ -2,6 +2,9 @@
 /* WARNING: Generated automatically from opensslconf.h.in by Configure. */
 
 /* OpenSSL was configured with the following options: */
+#ifndef OPENSSL_SYSNAME_MINGW32
+# define OPENSSL_SYSNAME_MINGW32
+#endif
 #ifndef OPENSSL_DOING_MAKEDEPEND
 
 #ifndef OPENSSL_NO_GMP
@@ -18,6 +21,9 @@
 #endif
 
 #endif /* OPENSSL_DOING_MAKEDEPEND */
+#ifndef OPENSSL_THREADS
+# define OPENSSL_THREADS
+#endif
 #ifndef OPENSSL_NO_DYNAMIC_ENGINE
 # define OPENSSL_NO_DYNAMIC_ENGINE
 #endif
@@ -44,7 +50,7 @@
 /* crypto/opensslconf.h.in */
 
 /* Generate 80386 code? */
-#undef I386_ONLY
+#define I386_ONLY
 
 #if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
 #if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
@@ -57,6 +63,7 @@
 #define OPENSSL_UNISTD <unistd.h>
 
 #undef OPENSSL_EXPORT_VAR_AS_FUNCTION
+#define OPENSSL_EXPORT_VAR_AS_FUNCTION
 
 #if defined(HEADER_IDEA_H) && !defined(IDEA_INT)
 #define IDEA_INT unsigned int
@@ -101,7 +108,7 @@
 
 #if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H)
 #define CONFIG_HEADER_BN_H
-#undef BN_LLONG
+#define BN_LLONG
 
 /* Should we define BN_DIV2W here? */
 
@@ -120,7 +127,7 @@
 #define CONFIG_HEADER_RC4_LOCL_H
 /* if this is defined data[i] is used instead of *data, this is a %20
  * speedup on x86 */
-#undef RC4_INDEX
+#define RC4_INDEX
 #endif
 
 #if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H)
@@ -134,14 +141,14 @@
 /* the following is tweaked from a config script, that is why it is a
  * protected undef/define */
 #ifndef DES_PTR
-#undef DES_PTR
+#define DES_PTR
 #endif
 
 /* This helps C compiler generate the correct code for multiple functional
  * units.  It reduces register dependancies at the expense of 2 more
  * registers */
 #ifndef DES_RISC1
-#undef DES_RISC1
+#define DES_RISC1
 #endif
 
 #ifndef DES_RISC2
@@ -155,7 +162,7 @@
 /* Unroll the inner loop, this sometimes helps, sometimes hinders.
  * Very mucy CPU dependant */
 #ifndef DES_UNROLL
-#undef DES_UNROLL
+#define DES_UNROLL
 #endif
 
 /* These default values were supplied by
diff -udrNP openssl-0.9.8-beta4.orig/ms/mingw32.sh 
openssl-0.9.8-beta4/ms/mingw32.sh
--- openssl-0.9.8-beta4.orig/ms/mingw32.sh      1970-01-01 01:00:00.000000000 
+0100
+++ openssl-0.9.8-beta4/ms/mingw32.sh   2005-06-19 19:58:04.709175088 +0200
@@ -0,0 +1,98 @@
+#!/bin/sh
+
+# OpenSSL with Mingw32+GNU as
+# ---------------------------
+
+set -e
+
+perl Configure 386 mingwx
+
+if test "$1" != "no-asm"
+then
+       echo Generating x86 for GNU assember
+
+       echo Bignum
+       cd crypto/bn/asm
+       perl bn-586.pl gaswin > bn-win32.s
+       perl co-586.pl gaswin > co-win32.s
+       cd ../../..
+
+       echo DES
+       cd crypto/des/asm
+       perl des-586.pl gaswin > d-win32.s
+       cd ../../..
+
+       echo crypt
+       cd crypto/des/asm
+       perl crypt586.pl gaswin > y-win32.s
+       cd ../../..
+
+       echo Blowfish
+       cd crypto/bf/asm
+       perl bf-586.pl gaswin > b-win32.s
+       cd ../../..
+
+       echo CAST5
+       cd crypto/cast/asm
+       perl cast-586.pl gaswin > c-win32.s
+       cd ../../..
+
+       echo RC4
+       cd crypto/rc4/asm
+       perl rc4-586.pl gaswin > r4-win32.s
+       cd ../../..
+       
+       echo MD5
+       cd crypto/md5/asm
+       perl md5-586.pl gaswin > m5-win32.s
+       cd ../../..
+       
+       echo SHA1
+       cd crypto/sha/asm
+       perl sha1-586.pl gaswin > s1-win32.s
+       cd ../../..
+       
+       echo RIPEMD160
+       cd crypto/ripemd/asm
+       perl rmd-586.pl gaswin > rm-win32.s
+       cd ../../..
+       
+       echo RC5/32
+       cd crypto/rc5/asm
+       perl rc5-586.pl gaswin > r5-win32.s
+       cd ../../..
+
+       echo CPUID
+       cd crypto/
+       perl x86cpuid.pl gaswin > x86cpuid.s
+       cd ..
+
+fi
+
+echo Generating makefile
+perl util/mkfiles.pl >MINFO
+perl util/mk1mf.pl gaswin Mingw32-sh >ms/mingw32a.mak
+
+echo Generating DLL definition files
+perl util/mkdef.pl 32 libeay >ms/libeay32.def
+perl util/mkdef.pl 32 ssleay >ms/ssleay32.def
+
+# copy ms/tlhelp32.h outinc
+
+echo Building the libraries
+make -f ms/mingw32a.mak
+
+echo Generating the DLLs and input libraries
+i586-mingw32msvc-dlltool -d ms/libeay32.def -e out/libeay32.lib \
+       -l libeay32.dll out/libcrypto.a
+i586-mingw32msvc-cc -shared -o libeay32.dll out/libeay32.lib out/libcrypto.a \
+       /usr/i586-mingw32msvc/lib/libwsock32.a \
+       /usr/i586-mingw32msvc/lib/libgdi32.a
+#dllwrap --dllname libeay32.dll --output-lib out/libeay32.a --def 
ms/libeay32.def out/libcrypto.a -lwsock32 -lgdi32
+
+i586-mingw32msvc-dlltool -d ms/ssleay32.def -e out/libssl32.lib  -l 
libssl32.dll out/libssl.a
+i586-mingw32msvc-cc -shared -o libssl32.dll libeay32.dll out/libssl32.lib 
out/libssl.a 
+#dllwrap --dllname libssl32.dll --output-lib out/libssl32.a --def 
ms/ssleay32.def out/libssl.a out/libeay32.a
+
+echo Done compiling OpenSSL
+
diff -udrNP openssl-0.9.8-beta4.orig/util/mk1mf.pl 
openssl-0.9.8-beta4/util/mk1mf.pl
--- openssl-0.9.8-beta4.orig/util/mk1mf.pl      2005-05-17 15:51:35.000000000 
+0200
+++ openssl-0.9.8-beta4/util/mk1mf.pl   2005-06-19 18:38:18.204834352 +0200
@@ -27,6 +27,7 @@
        "VC-CE",   "Microsoft eMbedded Visual C++ 3.0 - Windows CE ONLY",
        "VC-NT",   "Microsoft Visual C++ [4-6] - Windows NT ONLY",
        "Mingw32", "GNU C++ - Windows NT or 9x",
+       "Mingw32-sh", "GNU C++ - for Windows, but crosscompile from unix",
        "Mingw32-files", "Create files with DOS copy ...",
        "BC-NT",   "Borland C++ 4.5 - Windows NT",
        "linux-elf","Linux elf",
@@ -132,6 +133,10 @@
        {
        require 'Mingw32.pl';
        }
+elsif ($platform eq "Mingw32-sh")
+       {
+       require 'Mingw32x.pl';
+       }
 elsif ($platform eq "Mingw32-files")
        {
        require 'Mingw32f.pl';
@@ -598,6 +603,11 @@
                $lib_obj =~ s/\s(\S*\/rmd_dgst\S*)/ $1 \$(RMD160_ASM_OBJ)/;
                $rules.=&do_asm_rule($rmd160_asm_obj,$rmd160_asm_src);
                }
+       if (($cpuid_asm_obj ne "") && ($_ eq "CRYPTO"))
+               {
+               $lib_obj =~ s/\s(\S*\/cpuid\S*)/ $1 \$(CPUID_OBJ)/;
+               $rules.=&do_asm_rule($rmd160_asm_obj,$rmd160_asm_src);
+               }
        $defs.=&do_defs(${_}."OBJ",$lib_obj,"\$(OBJ_D)",$obj);
        $lib=($slib)?" \$(SHLIB_CFLAGS)".$shlib_ex_cflags{$_}:" \$(LIB_CFLAGS)";
        $rules.=&do_compile_rule("\$(OBJ_D)",$lib_obj{$_},$lib);
diff -udrNP openssl-0.9.8-beta4.orig/util/pl/Mingw32x.pl 
openssl-0.9.8-beta4/util/pl/Mingw32x.pl
--- openssl-0.9.8-beta4.orig/util/pl/Mingw32x.pl        1970-01-01 
01:00:00.000000000 +0100
+++ openssl-0.9.8-beta4/util/pl/Mingw32x.pl     2005-06-19 18:38:18.209833592 
+0200
@@ -0,0 +1,104 @@
+#!/usr/local/bin/perl
+#
+# Mingw32x.pl -- Mingw cross compile from unix.
+#
+
+$o='/';
+$cp='cp';
+$rm='rm -f';
+$mkdir='gmkdir';
+
+$o='/';
+$cp='cp';
+$rm='rm';
+$mkdir='mkdir';
+
+# C compiler stuff
+
+$cc='i586-mingw32msvc-cc';
+if ($debug)
+       { $cflags="-DL_ENDIAN -DDSO_WIN32 -g2 -ggdb"; }
+else
+       { $cflags="-DL_ENDIAN -DDSO_WIN32 -fomit-frame-pointer -O3 -mtune=i486 
-Wall"; }
+
+if ($gaswin and !$no_asm)
+       {
+        $bn_asm_obj='$(OBJ_D)/bn-win32.o';
+        $bn_asm_src='crypto/bn/asm/bn-win32.s';
+        $bnco_asm_obj='$(OBJ_D)/co-win32.o';
+        $bnco_asm_src='crypto/bn/asm/co-win32.s';
+        $des_enc_obj='$(OBJ_D)/d-win32.o $(OBJ_D)/y-win32.o';
+        $des_enc_src='crypto/des/asm/d-win32.s crypto/des/asm/y-win32.s';
+        $bf_enc_obj='$(OBJ_D)/b-win32.o';
+        $bf_enc_src='crypto/bf/asm/b-win32.s';
+#       $cast_enc_obj='$(OBJ_D)/c-win32.o';
+#       $cast_enc_src='crypto/cast/asm/c-win32.s';
+        $rc4_enc_obj='$(OBJ_D)/r4-win32.o';
+        $rc4_enc_src='crypto/rc4/asm/r4-win32.s';
+        $rc5_enc_obj='$(OBJ_D)/r5-win32.o';
+        $rc5_enc_src='crypto/rc5/asm/r5-win32.s';
+        $md5_asm_obj='$(OBJ_D)/m5-win32.o';
+        $md5_asm_src='crypto/md5/asm/m5-win32.s';
+        $rmd160_asm_obj='$(OBJ_D)/rm-win32.o';
+        $rmd160_asm_src='crypto/ripemd/asm/rm-win32.s';
+        $sha1_asm_obj='$(OBJ_D)/s1-win32.o';
+        $sha1_asm_src='crypto/sha/asm/s1-win32.s';
+       $cflags.=" -DBN_ASM -DMD5_ASM -DSHA1_ASM -DOPENSSL_BN_ASM_PART_WORDS";
+       }
+
+
+$obj='.o';
+$ofile='-o ';
+
+# EXE linking stuff
+$link='i586-mingw32msvc-cc';
+$lflags='${CFLAGS}';
+$efile='-o ';
+$exep='.exe';
+$ex_libs="/usr/i586-mingw32msvc/lib/libwsock32.a 
/usr/i586-mingw32msvc/lib/libgdi32.a";
+
+# static library stuff
+$mklib='ar r';
+$mlflags='';
+$ranlib='i586-mingw32msvc-ranlib';
+$plib='lib';
+$libp=".a";
+$shlibp=".a";
+$lfile='';
+
+$asm='i586-mingw32msvc-as';
+$afile='-o ';
+#$bn_asm_obj="";
+#$bn_asm_src="";
+#$des_enc_obj="";
+#$des_enc_src="";
+#$bf_enc_obj="";
+#$bf_enc_src="";
+
+sub do_lib_rule
+       {
+       local($obj,$target,$name,$shlib)[EMAIL PROTECTED];
+       local($ret,$_,$Name);
+
+       $target =~ s/\//$o/g if $o ne '/';
+       $target="$target";
+       ($Name=$name) =~ tr/a-z/A-Z/;
+
+       $ret.="$target: \$(${Name}OBJ)\n";
+       $ret.="\t\$(RM) -f $target\n";
+       $ret.="\t\$(MKLIB) $target \$(${Name}OBJ)\n";
+       $ret.="\t\$(RANLIB) $target\n\n";
+       }
+
+sub do_link_rule
+       {
+       local($target,$files,$dep_libs,$libs)[EMAIL PROTECTED];
+       local($ret,$_);
+       
+       $file =~ s/\//$o/g if $o ne '/';
+       $n=&bname($target);
+       $ret.="$target: $files $dep_libs\n";
+       $ret.="\t\$(LINK) ${efile}$target \$(LFLAGS) $files $libs\n\n";
+       return($ret);
+       }
+1;

Reply via email to