| NOTES FOR WINDOWS PLATFORMS | |
| =========================== | |
| There are various options to build and run OpenSSL on the Windows platforms. | |
| "Native" OpenSSL uses the Windows APIs directly at run time. | |
| To build a native OpenSSL you can either use: | |
| Microsoft Visual C++ (MSVC) C compiler on the command line | |
| or | |
| MinGW cross compiler | |
| run on the GNU-like development environment MSYS2 | |
| or run on Linux or Cygwin | |
| "Hosted" OpenSSL relies on an external POSIX compatibility layer | |
| for building (using GNU/Unix shell, compiler, and tools) and at run time. | |
| For this option you can use Cygwin. | |
| Visual C++ native builds, aka VC-* | |
| ===================================== | |
| Requirement details | |
| ------------------- | |
| In addition to the requirements and instructions listed in INSTALL.md, | |
| these are required as well: | |
| - Perl. | |
| We recommend Strawberry Perl, available from http://strawberryperl.com/ | |
| Please read NOTES.PERL for more information, including the use of CPAN. | |
| An alternative is ActiveState Perl, https://www.activestate.com/ActivePerl | |
| for which you may need to explicitly build the Perl module Win32/Console.pm | |
| via https://platform.activestate.com/ActiveState and then download it. | |
| - Microsoft Visual C compiler. | |
| Since these are proprietary and ever-changing we cannot test them all. | |
| Older versions may not work. Use a recent version wherever possible. | |
| - Netwide Assembler (NASM), available from https://www.nasm.us | |
| Note that NASM is the only supported assembler. | |
| Quick start | |
| ----------- | |
| 1. Install Perl | |
| 2. Install NASM | |
| 3. Make sure both Perl and NASM are on your %PATH% | |
| 4. Use Visual Studio Developer Command Prompt with administrative privileges, | |
| choosing one of its variants depending on the intended architecture. | |
| Or run "cmd" and execute "vcvarsall.bat" with one of the options x86, | |
| x86_amd64, x86_arm, x86_arm64, amd64, amd64_x86, amd64_arm, or amd64_arm64. | |
| This sets up the environment variables needed for nmake.exe, cl.exe, etc. | |
| See also https://docs.microsoft.com/cpp/build/building-on-the-command-line | |
| 5. From the root of the OpenSSL source directory enter | |
| perl Configure VC-WIN32 if you want 32-bit OpenSSL or | |
| perl Configure VC-WIN64A if you want 64-bit OpenSSL or | |
| perl Configure to let Configure figure out the platform | |
| 6. nmake | |
| 7. nmake test | |
| 8. nmake install | |
| For the full installation instructions, or if anything goes wrong at any stage, | |
| check the INSTALL.md file. | |
| Installation directories | |
| ------------------------ | |
| The default installation directories are derived from environment | |
| variables. | |
| For VC-WIN32, the following defaults are use: | |
| PREFIX: %ProgramFiles(86)%\OpenSSL | |
| OPENSSLDIR: %CommonProgramFiles(86)%\SSL | |
| For VC-WIN64, the following defaults are use: | |
| PREFIX: %ProgramW6432%\OpenSSL | |
| OPENSSLDIR: %CommonProgramW6432%\SSL | |
| Should those environment variables not exist (on a pure Win32 | |
| installation for examples), these fallbacks are used: | |
| PREFIX: %ProgramFiles%\OpenSSL | |
| OPENSSLDIR: %CommonProgramFiles%\SSL | |
| ALSO NOTE that those directories are usually write protected, even if | |
| your account is in the Administrators group. To work around that, | |
| start the command prompt by right-clicking on it and choosing "Run as | |
| Administrator" before running 'nmake install'. The other solution | |
| is, of course, to choose a different set of directories by using | |
| --prefix and --openssldir when configuring. | |
| Special notes for Universal Windows Platform builds, aka VC-*-UWP | |
| -------------------------------------------------------------------- | |
| - UWP targets only support building the static and dynamic libraries. | |
| - You should define the platform type to "uwp" and the target arch via | |
| "vcvarsall.bat" before you compile. For example, if you want to build | |
| "arm64" builds, you should run "vcvarsall.bat x86_arm64 uwp". | |
| Native OpenSSL built using MinGW | |
| ================================ | |
| MinGW offers an alternative way to build native OpenSSL, by cross compilation. | |
| * Usually the build is done on Windows in a GNU-like environment called MSYS2. | |
| MSYS2 provides GNU tools, a Unix-like command prompt, | |
| and a UNIX compatibility layer for applications. | |
| However, in this context it is only used for building OpenSSL. | |
| The resulting OpenSSL does not rely on MSYS2 to run and is fully native. | |
| Requirement details | |
| - MSYS2 shell, from https://www.msys2.org/ | |
| - Perl, at least version 5.10.0, which usually comes pre-installed with MSYS2 | |
| - make, installed using "pacman -S make" into the MSYS2 environment | |
| - MinGW[64] compiler: mingw-w64-i686-gcc and/or mingw-w64-x86_64-gcc. | |
| These compilers must be on your MSYS2 $PATH. | |
| A common error is to not have these on your $PATH. | |
| The MSYS2 version of gcc will not work correctly here. | |
| In the MSYS2 shell do the configuration depending on the target architecture: | |
| ./Configure mingw ... | |
| or | |
| ./Configure mingw64 ... | |
| or | |
| ./Configure ... | |
| for the default architecture. | |
| Apart from that, follow the Unix / Linux instructions in INSTALL.md. | |
| * It is also possible to build mingw[64] on Linux or Cygwin. | |
| In this case configure with the corresponding --cross-compile-prefix= option. | |
| For example | |
| ./Configure mingw --cross-compile-prefix=i686-w64-mingw32- ... | |
| or | |
| ./Configure mingw64 --cross-compile-prefix=x86_64-w64-mingw32- ... | |
| This requires that you've installed the necessary add-on packages for | |
| mingw[64] cross compilation. | |
| Linking your application | |
| ======================== | |
| This section applies to all "native" builds. | |
| If you link with static OpenSSL libraries then you're expected to | |
| additionally link your application with WS2_32.LIB, GDI32.LIB, | |
| ADVAPI32.LIB, CRYPT32.LIB and USER32.LIB. Those developing | |
| non-interactive service applications might feel concerned about | |
| linking with GDI32.LIB and USER32.LIB, as they are justly associated | |
| with interactive desktop, which is not available to service | |
| processes. The toolkit is designed to detect in which context it's | |
| currently executed, GUI, console app or service, and act accordingly, | |
| namely whether or not to actually make GUI calls. Additionally those | |
| who wish to /DELAYLOAD:GDI32.DLL and /DELAYLOAD:USER32.DLL and | |
| actually keep them off service process should consider implementing | |
| and exporting from .exe image in question own _OPENSSL_isservice not | |
| relying on USER32.DLL. E.g., on Windows Vista and later you could: | |
| __declspec(dllexport) __cdecl BOOL _OPENSSL_isservice(void) | |
| { DWORD sess; | |
| if (ProcessIdToSessionId(GetCurrentProcessId(),&sess)) | |
| return sess==0; | |
| return FALSE; | |
| } | |
| If you link with OpenSSL .DLLs, then you're expected to include into | |
| your application code a small "shim" snippet, which provides | |
| the glue between the OpenSSL BIO layer and your compiler run-time. | |
| See also the OPENSSL_Applink manual page. | |
| Hosted OpenSSL built using Cygwin | |
| ================================= | |
| Cygwin implements a POSIX/Unix runtime system (cygwin1.dll) on top of the | |
| Windows subsystem and provides a Bash shell and GNU tools environment. | |
| Consequently, a build of OpenSSL with Cygwin is virtually identical to the | |
| Unix procedure. | |
| To build OpenSSL using Cygwin, you need to: | |
| * Install Cygwin, see https://cygwin.com/ | |
| * Install Cygwin Perl, at least version 5.10.0 | |
| and ensure it is in the $PATH | |
| * Run the Cygwin Bash shell | |
| Apart from that, follow the Unix / Linux instructions in INSTALL.md. | |
| NOTE: "make test" and normal file operations may fail in directories | |
| mounted as text (i.e. mount -t c:\somewhere /home) due to Cygwin | |
| stripping of carriage returns. To avoid this ensure that a binary | |
| mount is used, e.g. mount -b c:\somewhere /home. |