This patch is against version openssl-1.0.0d.

Please find attached a patch that works for me.  Works means it builds 
without error, the test.bat executes the tests ok and even the "make 
install" works to some degree.  It has also been test built against 
"zlib zlib-dynamic" options.

Background to this work.  This work has been done to provide the QtJambi 
project with a MinGW based build, this project are Java bindings library 
for the GUI / platform toolkit Qt.  Due to the nature and complexity of 
the resulting project (a collection of multiple open source libraries 
end up loaded into a Java JVM) toolchain compatibility and 
interoperability is critical to this project.


This patch should be tested against other MinGW build environments, such 
as using MinGW under CYGWIN shell or MSYS shell.  To make sure that 
process is not broken, also to see if the ms/mingw32.bat script still 
works for them.  But I guess no one builds this way when they have a 
bash shell.  So maybe this batch file can be exclusively for he purpose 
of building with MinGW from cmd.exe.



$ git diff | diffstat
  Configure          |   11 +++++++++--
  INSTALL.W32        |   22 ++++++++++++++++++++++
  ms/mingw32.bat     |   41 ++++++++++++++++++++++++++++++++---------
  ms/test.bat        |    2 ++
  util/mk1mf.pl      |    7 +++----
  util/pl/Mingw32.pl |   10 ++++++----
  6 files changed, 74 insertions(+), 19 deletions(-)




File Notes:


   Configure - This includes MinGW64 additions but another patch/ticket 
will be opened for that target. I have used the term "native-mingw" to 
mean from cmd.exe and without access to any Unix like shell.  Compile 
options brought roughly info line with those in util/pl/Mingw32.pl 
however they are on the new target "native-mingw" so should not affect 
anyone else.


INSTALL.W32 - Tried to update some documentation about mingw to clarify 
builds with Unix like shell (CYGWIN/MSYS) to those without.


ms/mingw32.bat - This tries to detect if a bash.exe is present to setup 
the correct argument to "perl Configure ..." this needs proper testing 
with MinGW builds under CYGWIN/MSYS.  There is provision for manually 
setting up debug builds by editing the top of the mingw32.bat file, see 
the comments.  Additional errorlevel checks are put in place to fail 
upon any error with any part of the process.  It does not seem necessary 
at all to perform any of the ASM generation since the mk1mf.pl has been 
fixed to do the correct thing now.


ms/test.bat - This has been updated to allow optional first argument as 
the directory to change into before executing the test EXE files.


util/mk1mf.pl - Multiple fixes here.

Fix the "test" target to not execute a "cd out" as one command and then 
run "..\ms\test" as another command.  I don't think this even works on 
Unix shell systems, you'd need to put them on the same line with a 
semicolon for it to work.  But on Windows it is more complicated so to 
make the "make test" work out-the-box the directory to change into is 
now passed as the first argument to the test.bat file.

Fix the "install" target to not have the shell glob pattern *.[ch] for 
installing the include files.  There are no *.c file to install.  The 
Windows "copy" command does not understand the *.[ch] glob syntax.  The 
Windows "copy" command returns error status of no files were found to 
copy.  So the *.c has been removed, with just *.h remaining.


util/pl/Mingw32.pl - Compile options tweaked.  Missing 
$asmtype='gaswin', maybe this is the reason why ms/mingw32.bat manually 
generated the ASM, since the resulting ms/mingw32a.mak Makefile is 
broken with working out-the-box without $asmtype being set.  Added 
$exep='.exe' since the "make install" breaks without it and the linker 
auto-corrects the resulting exe name so doesn't care either way.

Darryl





diff --git a/Configure b/Configure
index 429ab2e..ccfa30c 100755
--- a/Configure
+++ b/Configure
@@ -506,6 +506,9 @@ my %table=(
 
 # MinGW
 "mingw", "gcc:-mno-cygwin -DL_ENDIAN -DWIN32_LEAN_AND_MEAN -fomit-frame-pointer -O3 -march=i486 -Wall::-D_MT:MINGW32:-lws2_32 -lgdi32 -lcrypt32:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts} EXPORT_VAR_AS_FN:${x86_asm}:coff:win32:cygwin-shared:-D_WINDLL -DOPENSSL_USE_APPLINK:-mno-cygwin:.dll.a",
+# *-native-mingw means without Bash (no CYGWIN, no MSYS, no bash, no sh), see ms/mingw32.bat
+"debug-native-mingw", "gcc:-mno-cygwin -DL_ENDIAN -DDSO_WIN32 -DWIN32_LEAN_AND_MEAN -g2 -ggdb -march=i486 -Wall::-D_MT:MINGW32:-lws2_32 -lgdi32 -lcrypt32:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts} EXPORT_VAR_AS_FN:${x86_asm}:coff:win32:cygwin-shared:-D_WINDLL -DOPENSSL_USE_APPLINK:-mno-cygwin:.dll.a",
+"native-mingw", "gcc:-mno-cygwin -DL_ENDIAN -DDSO_WIN32 -DWIN32_LEAN_AND_MEAN -fomit-frame-pointer -O3 -march=i486 -Wall::-D_MT:MINGW32:-lws2_32 -lgdi32 -lcrypt32:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts} EXPORT_VAR_AS_FN:${x86_asm}:coff:win32:cygwin-shared:-D_WINDLL -DOPENSSL_USE_APPLINK:-mno-cygwin:.dll.a",
 # As for OPENSSL_USE_APPLINK. Applink makes it possible to use .dll
 # compiled with one compiler with application compiled with another
 # compiler. It's possible to engage Applink support in mingw64 build,
@@ -514,6 +517,8 @@ my %table=(
 # non-mingw64 run-time environment. And as mingw64 is always consistent
 # with itself, Applink is never engaged and can as well be omitted.
 "mingw64", "gcc:-mno-cygwin -DL_ENDIAN -O3 -Wall -DWIN32_LEAN_AND_MEAN -DUNICODE -D_UNICODE::-D_MT:MINGW64:-lws2_32 -lgdi32 -lcrypt32:SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:${x86_64_asm}:mingw64:win32:cygwin-shared:-D_WINDLL:-mno-cygwin:.dll.a",
+"debug-native-mingw64", "gcc:-mno-cygwin -DL_ENDIAN -DDSO_WIN32 -DWIN32_LEAN_AND_MEAN -g2 -ggdb -Wall -DUNICODE -D_UNICODE::-D_MT:MINGW64:-lws2_32 -lgdi32 -lcrypt32:SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:${x86_64_asm}:mingw64:win32:cygwin-shared:-D_WINDLL:-mno-cygwin:.dll.a",
+"native-mingw64", "gcc:-mno-cygwin -DL_ENDIAN -DDSO_WIN32 -DWIN32_LEAN_AND_MEAN -fomit-frame-pointer -O3 -Wall -DUNICODE -D_UNICODE::-D_MT:MINGW64:-lws2_32 -lgdi32 -lcrypt32:SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:${x86_64_asm}:mingw64:win32:cygwin-shared:-D_WINDLL:-mno-cygwin:.dll.a",
 
 # UWIN 
 "UWIN", "cc:-DTERMIOS -DL_ENDIAN -O -Wall:::UWIN::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:win32",
@@ -588,6 +593,8 @@ my @MK1MF_Builds=qw(VC-WIN64I VC-WIN64A
 		    debug-VC-WIN64I debug-VC-WIN64A
 		    VC-NT VC-CE VC-WIN32 debug-VC-WIN32
 		    BC-32 
+		    debug-native-mingw   native-mingw
+		    debug-native-mingw64 native-mingw64
 		    netware-clib netware-clib-bsdsock
 		    netware-libc netware-libc-bsdsock);
 
@@ -1038,7 +1045,7 @@ foreach (sort @experimental)
 
 my $IsMK1MF=scalar grep /^$target$/,@MK1MF_Builds;
 
-$exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^mingw/);
+$exe_ext=".exe" if ($target eq "Cygwin" || $target eq "DJGPP" || $target =~ /^(native-mingw|mingw)/);
 $exe_ext=".nlm" if ($target =~ /netware/);
 $exe_ext=".pm"  if ($target =~ /vos/);
 $openssldir="/usr/local/ssl" if ($openssldir eq "" and $prefix eq "");
@@ -1111,7 +1118,7 @@ my ($prelflags,$postlflags)=split('%',$lflags);
 if (defined($postlflags))	{ $lflags=$postlflags;	}
 else				{ $lflags=$prelflags; undef $prelflags;	}
 
-if ($target =~ /^mingw/ && `$cc --target-help 2>&1` !~ m/\-mno\-cygwin/m)
+if ($target =~ /^(native-mingw|mingw)/ && `$cc --target-help 2>&1` !~ m/\-mno\-cygwin/m)
 	{
 	$cflags =~ s/\-mno\-cygwin\s*//;
 	$shared_ldflag =~ s/\-mno\-cygwin\s*//;
diff --git a/INSTALL.W32 b/INSTALL.W32
index d23c4ba..a54a5d8 100644
--- a/INSTALL.W32
+++ b/INSTALL.W32
@@ -165,6 +165,17 @@
    $ make test
    $ make install
 
+  To build the MinGW version (native Windows) without Cygwin from cmd.exe:
+
+   $ set MAKE=mingw32-make
+   $ ms\mingw32.bat
+   [...]
+   $ mingw32-make
+   [...]
+   $ mingw32-make -f ms\mingw32a.mak test
+   [...the install below may not install *.dll...]
+   $ mingw32-make -f ms\mingw32a.mak install
+
  Cygwin Notes:
 
  "make test" and normal file operations may fail in directories
@@ -176,6 +187,17 @@
  non-fatal error in "make test" but is otherwise harmless.  If
  desired and needed, GNU bc can be built with Cygwin without change.
 
+ MinGW Notes:
+
+ There are two types of MinGW builds:
+  * those with a Unix like shell available.  These builds are much like
+     all Unix builds and are expected to happen under a CYGWIN/MSYS shell.
+  * those without a Unix like shell available.  *-native-mingw but with
+     the MinGW toolchain available on the %PATH%, as well as perl.exe.
+    These builds use the batch file ms\mingw32.bat.
+    It is possible to build debug versions by editing the top of
+    mingw32.bat as per the instructions in there.
+
  GNU C (MinGW/MSYS)
  -------------
 
diff --git a/ms/mingw32.bat b/ms/mingw32.bat
index 06b5733..295c114 100644
--- a/ms/mingw32.bat
+++ b/ms/mingw32.bat
@@ -1,12 +1,33 @@
 @rem OpenSSL with Mingw32+GNU as
 @rem ---------------------------
 
-perl Configure mingw %1 %2 %3 %4 %5 %6 %7 %8
+@rem Swap these 2 settings below for a debuging build
+set build_debug=
+set build_dirext=
+@rem set build_debug=debug-
+@rem set build_dirext=.dbg
+
+@rem we try to detect if we are mingw or native-mingw by the presence of bash.exe on the PATH
+bash -c "exit 0" 2>NUL:
+@if errorlevel 1 goto native-mingw
+set build_flavour=%build_debug%mingw
+goto configure
+
+:native-mingw
+set build_flavour=%build_debug%native-mingw
+
+:configure
+echo BUILD_FLAVOR=%build_flavour%
+perl Configure %build_flavour% %1 %2 %3 %4 %5 %6 %7 %8
+@if errorlevel 1 goto end
 
 @echo off
 
 perl -e "exit 1 if '%1' eq 'no-asm'"
-if errorlevel 1 goto noasm
+@if errorlevel 1 goto noasm
+@rem always skip ASM generation here for native-mingw since the makefile knows how to build them
+if "%build_flavour%"=="native-mingw" goto noasm
+if "%build_flavour%"=="debug-native-mingw" goto noasm
 
 echo Generating x86 for GNU assember
 
@@ -65,24 +86,26 @@ cd ..\..\..
 
 echo Generating makefile
 perl util\mkfiles.pl >MINFO
+@if errorlevel 1 goto end
 perl util\mk1mf.pl gaswin Mingw32 >ms\mingw32a.mak
+@if errorlevel 1 goto end
 echo Generating DLL definition files
 perl util\mkdef.pl 32 libeay >ms\libeay32.def
-if errorlevel 1 goto end
+@if errorlevel 1 goto end
 perl util\mkdef.pl 32 ssleay >ms\ssleay32.def
-if errorlevel 1 goto end
+@if errorlevel 1 goto end
 
 rem copy ms\tlhelp32.h outinc
 
 echo Building the libraries
 mingw32-make -f ms/mingw32a.mak
-if errorlevel 1 goto end
+@if errorlevel 1 goto end
 
 echo Generating the DLLs and input libraries
-dllwrap --dllname libeay32.dll --output-lib out/libeay32.a --def ms/libeay32.def out/libcrypto.a -lws2_32 -lgdi32
-if errorlevel 1 goto end
-dllwrap --dllname libssl32.dll --output-lib out/libssl32.a --def ms/ssleay32.def out/libssl.a out/libeay32.a
-if errorlevel 1 goto end
+dllwrap --dllname libeay32.dll --output-lib out%build_dirext%/libeay32.a --def ms/libeay32.def out%build_dirext%/libcrypto.a -lws2_32 -lgdi32 -lcrypt32
+@if errorlevel 1 goto end
+dllwrap --dllname libssl32.dll --output-lib out%build_dirext%/libssl32.a --def ms/ssleay32.def out%build_dirext%/libssl.a out%build_dirext%/libeay32.a
+@if errorlevel 1 goto end
 
 echo Done compiling OpenSSL
 
diff --git a/ms/test.bat b/ms/test.bat
index f490546..b48cff0 100755
--- a/ms/test.bat
+++ b/ms/test.bat
@@ -1,5 +1,7 @@
 @echo off
 
+if not "%1"=="" cd "%1"
+
 set test=..\ms
 set opath=%PATH%
 PATH=..\ms;%PATH%
diff --git a/util/mk1mf.pl b/util/mk1mf.pl
index afe8c73..4ab01e0 100755
--- a/util/mk1mf.pl
+++ b/util/mk1mf.pl
@@ -549,16 +549,15 @@ install: all
 	\$(MKDIR) \"\$(INSTALLTOP)${o}include\"
 	\$(MKDIR) \"\$(INSTALLTOP)${o}include${o}openssl\"
 	\$(MKDIR) \"\$(INSTALLTOP)${o}lib\"
-	\$(CP) \"\$(INCO_D)${o}*.\[ch\]\" \"\$(INSTALLTOP)${o}include${o}openssl\"
-	\$(CP) \"\$(BIN_D)$o\$(E_EXE)$exep \$(INSTALLTOP)${o}bin\"
+	\$(CP) \"\$(INCO_D)${o}*.h\" \"\$(INSTALLTOP)${o}include${o}openssl\"
+	\$(CP) \"\$(BIN_D)$o\$(E_EXE)$exep\" \"\$(INSTALLTOP)${o}bin\"
 	\$(MKDIR) \"\$(OPENSSLDIR)\"
 	\$(CP) apps${o}openssl.cnf \"\$(OPENSSLDIR)\"
 $extra_install
 
 
 test: \$(T_EXE)
-	cd \$(BIN_D)
-	..${o}ms${o}test
+	ms${o}test \$(BIN_D)
 
 clean:
 	\$(RM) \$(TMP_D)$o*.*
diff --git a/util/pl/Mingw32.pl b/util/pl/Mingw32.pl
index fe3fb27..613cff7 100644
--- a/util/pl/Mingw32.pl
+++ b/util/pl/Mingw32.pl
@@ -17,9 +17,9 @@ $mkdir='mkdir';
 
 $cc='gcc';
 if ($debug)
-	{ $cflags="-DL_ENDIAN -DDSO_WIN32 -g2 -ggdb"; }
+	{ $cflags="-DL_ENDIAN -DDSO_WIN32 -DWIN32_LEAN_AND_MEAN -g2 -ggdb -march=i486 -Wall"; }
 else
-	{ $cflags="-DL_ENDIAN -DDSO_WIN32 -fomit-frame-pointer -O3 -mcpu=i486 -Wall"; }
+	{ $cflags="-DL_ENDIAN -DDSO_WIN32 -DWIN32_LEAN_AND_MEAN -fomit-frame-pointer -O3 -march=i486 -Wall"; }
 
 if ($gaswin and !$no_asm)
 	{
@@ -46,6 +46,7 @@ if ($gaswin and !$no_asm)
 	$cflags.=" -DBN_ASM -DMD5_ASM -DSHA1_ASM -DOPENSSL_BN_ASM_PART_WORDS";
 	}
 
+$asmtype='gaswin' if($gaswin);
 
 $obj='.o';
 $ofile='-o ';
@@ -54,8 +55,9 @@ $ofile='-o ';
 $link='${CC}';
 $lflags='${CFLAGS}';
 $efile='-o ';
-$exep='';
-$ex_libs="-lws2_32 -lgdi32";
+$exep='.exe';
+# -lcrypt32 added due to engines/e_capi.c
+$ex_libs="-lws2_32 -lgdi32 -lcrypt32";
 
 # static library stuff
 $mklib='ar r';

Reply via email to