1 | Notes for Windows platforms
|
---|
2 | ===========================
|
---|
3 |
|
---|
4 | - [Native builds using Visual C++](#native-builds-using-visual-c)
|
---|
5 | - [Native builds using Embarcadero C++Builder](
|
---|
6 | #native-builds-using-embarcadero-cbuilder)
|
---|
7 | - [Native builds using MinGW](#native-builds-using-mingw)
|
---|
8 | - [Linking native applications](#linking-native-applications)
|
---|
9 | - [Hosted builds using Cygwin](#hosted-builds-using-cygwin)
|
---|
10 |
|
---|
11 | There are various options to build and run OpenSSL on the Windows platforms.
|
---|
12 |
|
---|
13 | "Native" OpenSSL uses the Windows APIs directly at run time.
|
---|
14 | To build a native OpenSSL you can either use:
|
---|
15 |
|
---|
16 | Microsoft Visual C++ (MSVC) C compiler on the command line
|
---|
17 | or
|
---|
18 | Embarcadero C++Builder
|
---|
19 | or
|
---|
20 | MinGW cross compiler
|
---|
21 | run on the GNU-like development environment MSYS2
|
---|
22 | or run on Linux or Cygwin
|
---|
23 |
|
---|
24 | "Hosted" OpenSSL relies on an external POSIX compatibility layer
|
---|
25 | for building (using GNU/Unix shell, compiler, and tools) and at run time.
|
---|
26 | For this option, you can use Cygwin.
|
---|
27 |
|
---|
28 | Native builds using Visual C++
|
---|
29 | ==============================
|
---|
30 |
|
---|
31 | The native builds using Visual C++ have a `VC-*` prefix.
|
---|
32 |
|
---|
33 | Requirement details
|
---|
34 | -------------------
|
---|
35 |
|
---|
36 | In addition to the requirements and instructions listed in `INSTALL.md`,
|
---|
37 | these are required as well:
|
---|
38 |
|
---|
39 | ### Perl
|
---|
40 |
|
---|
41 | We recommend Strawberry Perl, available from <http://strawberryperl.com/>
|
---|
42 | Please read NOTES.PERL for more information, including the use of CPAN.
|
---|
43 | An alternative is ActiveState Perl, <https://www.activestate.com/ActivePerl>
|
---|
44 | for which you may need to explicitly build the Perl module Win32/Console.pm
|
---|
45 | via <https://platform.activestate.com/ActiveState> and then download it.
|
---|
46 |
|
---|
47 | ### Microsoft Visual C compiler.
|
---|
48 |
|
---|
49 | Since these are proprietary and ever-changing we cannot test them all.
|
---|
50 | Older versions may not work. Use a recent version wherever possible.
|
---|
51 |
|
---|
52 | ### Netwide Assembler (NASM)
|
---|
53 |
|
---|
54 | NASM is the only supported assembler. It is available from <https://www.nasm.us>.
|
---|
55 |
|
---|
56 | Quick start
|
---|
57 | -----------
|
---|
58 |
|
---|
59 | 1. Install Perl
|
---|
60 |
|
---|
61 | 2. Install NASM
|
---|
62 |
|
---|
63 | 3. Make sure both Perl and NASM are on your %PATH%
|
---|
64 |
|
---|
65 | 4. Use Visual Studio Developer Command Prompt with administrative privileges,
|
---|
66 | choosing one of its variants depending on the intended architecture.
|
---|
67 | Or run `cmd` and execute `vcvarsall.bat` with one of the options `x86`,
|
---|
68 | `x86_amd64`, `x86_arm`, `x86_arm64`, `amd64`, `amd64_x86`, `amd64_arm`,
|
---|
69 | or `amd64_arm64`.
|
---|
70 | This sets up the environment variables needed for `nmake.exe`, `cl.exe`,
|
---|
71 | etc.
|
---|
72 | See also
|
---|
73 | <https://docs.microsoft.com/cpp/build/building-on-the-command-line>
|
---|
74 |
|
---|
75 | 5. From the root of the OpenSSL source directory enter
|
---|
76 | - `perl Configure VC-WIN32` if you want 32-bit OpenSSL or
|
---|
77 | - `perl Configure VC-WIN64A` if you want 64-bit OpenSSL or
|
---|
78 | - `perl Configure VC-WIN64-ARM` if you want Windows on Arm (win-arm64)
|
---|
79 | OpenSSL or
|
---|
80 | - `perl Configure VC-WIN64-CLANGASM-ARM` if you want Windows on Arm (win-arm64)
|
---|
81 | OpenSSL with assembly support using clang-cl as assembler or
|
---|
82 | - `perl Configure VC-CLANG-WIN64-CLANGASM-ARM` if you want Windows on Arm (win-arm64)
|
---|
83 | OpenSSL using clang-cl as both compiler and assembler or
|
---|
84 | - `perl Configure VC-WIN32-HYBRIDCRT` if you want 32-bit OpenSSL dependent
|
---|
85 | on the Universal CRT or
|
---|
86 | - `perl Configure VC-WIN64A-HYBRIDCRT` if you want 64-bit OpenSSL dependent
|
---|
87 | on the Universal CRT or
|
---|
88 | - `perl Configure` to let Configure figure out the platform
|
---|
89 |
|
---|
90 | 6. `nmake`
|
---|
91 |
|
---|
92 | 7. `nmake test`
|
---|
93 |
|
---|
94 | 8. `nmake install`
|
---|
95 |
|
---|
96 | For the full installation instructions, or if anything goes wrong at any stage,
|
---|
97 | check the INSTALL.md file.
|
---|
98 |
|
---|
99 | Installation directories
|
---|
100 | ------------------------
|
---|
101 |
|
---|
102 | On most Unix platforms installation directories are determined at build time via
|
---|
103 | constant defines. On Windows platforms however, installation directories are
|
---|
104 | determined via registry keys, as it is common practice to build OpenSSL and
|
---|
105 | install it to a variety of locations.
|
---|
106 |
|
---|
107 | The following keys:
|
---|
108 |
|
---|
109 | `\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\OpenSSL-<version>-<ctx>\OPENSSLDIR`
|
---|
110 | `\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\OpenSSL-<version>-<ctx>\ENGINESDIR`
|
---|
111 | `\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\OpenSSL-<version>-<ctx>\MODULESDIR`
|
---|
112 |
|
---|
113 | Can be administratively set, and openssl will take the paths found there as the
|
---|
114 | values for OPENSSLDIR, ENGINESDIR and MODULESDIR respectively.
|
---|
115 |
|
---|
116 | To enable the reading of registry keys from windows builds, add
|
---|
117 | `-DOPENSSL_WINCTX=<string>`to the Configure command line. This define is used
|
---|
118 | at build-time to construct library build specific registry key paths of the
|
---|
119 | format:
|
---|
120 | `\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432node\OpenSSL-<version>-<ctx>`
|
---|
121 |
|
---|
122 | Where `<version>` is the major.minor version of the library being
|
---|
123 | built, and `<ctx>` is the value specified by `-DOPENSSL_WINCTX`. This allows
|
---|
124 | for multiple openssl builds to be created and installed on a single system, in
|
---|
125 | which each library can use its own set of registry keys.
|
---|
126 |
|
---|
127 | Note the installer available at <https://github.com/openssl/installer> will set
|
---|
128 | these keys when the installer is run.
|
---|
129 |
|
---|
130 | A summary table of behavior on Windows platforms
|
---|
131 |
|
---|
132 | |`OSSL_WINCTX`|Registry key|OpenSSL Behavior |
|
---|
133 | |-------------|------------|------------------------------------------|
|
---|
134 | |Defined | Defined |OpenSSL Reads Paths from Registry |
|
---|
135 | |Defined | Undefined |OpenSSL returns errors on module/conf load|
|
---|
136 | |Undefined | N/A |OpenSSL uses build time defaults |
|
---|
137 |
|
---|
138 | Special notes for Universal Windows Platform builds, aka `VC-*-UWP`
|
---|
139 | -------------------------------------------------------------------
|
---|
140 |
|
---|
141 | - UWP targets only support building the static and dynamic libraries.
|
---|
142 |
|
---|
143 | - You should define the platform type to `uwp` and the target arch via
|
---|
144 | `vcvarsall.bat` before you compile. For example, if you want to build
|
---|
145 | `arm64` builds, you should run `vcvarsall.bat x86_arm64 uwp`.
|
---|
146 |
|
---|
147 | Native builds using Embarcadero C++Builder
|
---|
148 | =========================================
|
---|
149 |
|
---|
150 | This toolchain (a descendant of Turbo/Borland C++) is an alternative to MSVC.
|
---|
151 | OpenSSL currently includes an experimental 32-bit configuration targeting the
|
---|
152 | Clang-based compiler (`bcc32c.exe`) in v10.3.3 Community Edition.
|
---|
153 | <https://www.embarcadero.com/products/cbuilder/starter>
|
---|
154 |
|
---|
155 | 1. Install Perl.
|
---|
156 |
|
---|
157 | 2. Open the RAD Studio Command Prompt.
|
---|
158 |
|
---|
159 | 3. Go to the root of the OpenSSL source directory and run:
|
---|
160 | `perl Configure BC-32 --prefix=%CD%`
|
---|
161 |
|
---|
162 | 4. `make -N`
|
---|
163 |
|
---|
164 | 5. `make -N test`
|
---|
165 |
|
---|
166 | 6. Build your program against this OpenSSL:
|
---|
167 | * Set your include search path to the "include" subdirectory of OpenSSL.
|
---|
168 | * Set your library search path to the OpenSSL source directory.
|
---|
169 |
|
---|
170 | Note that this is very experimental. Support for 64-bit and other Configure
|
---|
171 | options is still pending.
|
---|
172 |
|
---|
173 | Native builds using MinGW
|
---|
174 | =========================
|
---|
175 |
|
---|
176 | MinGW offers an alternative way to build native OpenSSL, by cross compilation.
|
---|
177 |
|
---|
178 | * Usually the build is done on Windows in a GNU-like environment called MSYS2.
|
---|
179 |
|
---|
180 | MSYS2 provides GNU tools, a Unix-like command prompt,
|
---|
181 | and a UNIX compatibility layer for applications.
|
---|
182 | However, in this context it is only used for building OpenSSL.
|
---|
183 | The resulting OpenSSL does not rely on MSYS2 to run and is fully native.
|
---|
184 |
|
---|
185 | Requirement details
|
---|
186 |
|
---|
187 | - MSYS2 shell, from <https://www.msys2.org/>
|
---|
188 |
|
---|
189 | - Perl, at least version 5.10.0, which usually comes pre-installed with MSYS2
|
---|
190 |
|
---|
191 | - make, installed using `pacman -S make` into the MSYS2 environment
|
---|
192 |
|
---|
193 | - MinGW[64] compiler: `mingw-w64-i686-gcc` and/or `mingw-w64-x86_64-gcc`.
|
---|
194 | These compilers must be on your MSYS2 $PATH.
|
---|
195 | A common error is to not have these on your $PATH.
|
---|
196 | The MSYS2 version of gcc will not work correctly here.
|
---|
197 |
|
---|
198 | In the MSYS2 shell do the configuration depending on the target architecture:
|
---|
199 |
|
---|
200 | ./Configure mingw ...
|
---|
201 |
|
---|
202 | or
|
---|
203 |
|
---|
204 | ./Configure mingw64 ...
|
---|
205 |
|
---|
206 | or
|
---|
207 |
|
---|
208 | ./Configure ...
|
---|
209 |
|
---|
210 | for the default architecture.
|
---|
211 |
|
---|
212 | Apart from that, follow the Unix / Linux instructions in `INSTALL.md`.
|
---|
213 |
|
---|
214 | * It is also possible to build mingw[64] on Linux or Cygwin.
|
---|
215 |
|
---|
216 | In this case configure with the corresponding `--cross-compile-prefix=`
|
---|
217 | option. For example
|
---|
218 |
|
---|
219 | ./Configure mingw --cross-compile-prefix=i686-w64-mingw32- ...
|
---|
220 |
|
---|
221 | or
|
---|
222 |
|
---|
223 | ./Configure mingw64 --cross-compile-prefix=x86_64-w64-mingw32- ...
|
---|
224 |
|
---|
225 | This requires that you've installed the necessary add-on packages for
|
---|
226 | mingw[64] cross compilation.
|
---|
227 |
|
---|
228 | Linking native applications
|
---|
229 | ===========================
|
---|
230 |
|
---|
231 | This section applies to all native builds.
|
---|
232 |
|
---|
233 | If you link with static OpenSSL libraries, then you're expected to
|
---|
234 | additionally link your application with `WS2_32.LIB`, `GDI32.LIB`,
|
---|
235 | `ADVAPI32.LIB`, `CRYPT32.LIB` and `USER32.LIB`. Those developing
|
---|
236 | non-interactive service applications might feel concerned about
|
---|
237 | linking with `GDI32.LIB` and `USER32.LIB`, as they are justly associated
|
---|
238 | with interactive desktop, which is not available to service
|
---|
239 | processes. The toolkit is designed to detect in which context it's
|
---|
240 | currently executed, GUI, console app or service, and act accordingly,
|
---|
241 | namely whether to actually make GUI calls. Additionally, those
|
---|
242 | who wish to `/DELAYLOAD:GDI32.DLL` and `/DELAYLOAD:USER32.DLL` and
|
---|
243 | actually keep them off service process should consider implementing
|
---|
244 | and exporting from .exe image in question own `_OPENSSL_isservice` not
|
---|
245 | relying on `USER32.DLL`. E.g., on Windows Vista and later you could:
|
---|
246 |
|
---|
247 | __declspec(dllexport) __cdecl BOOL _OPENSSL_isservice(void)
|
---|
248 | {
|
---|
249 | DWORD sess;
|
---|
250 |
|
---|
251 | if (ProcessIdToSessionId(GetCurrentProcessId(), &sess))
|
---|
252 | return sess == 0;
|
---|
253 | return FALSE;
|
---|
254 | }
|
---|
255 |
|
---|
256 | If you link with OpenSSL .DLLs, then you're expected to include into
|
---|
257 | your application code a small "shim" snippet, which provides
|
---|
258 | the glue between the OpenSSL BIO layer and your compiler run-time.
|
---|
259 | See also the OPENSSL_Applink manual page.
|
---|
260 |
|
---|
261 | Hosted builds using Cygwin
|
---|
262 | ==========================
|
---|
263 |
|
---|
264 | Cygwin implements a POSIX/Unix runtime system (`cygwin1.dll`) on top of the
|
---|
265 | Windows subsystem and provides a Bash shell and GNU tools environment.
|
---|
266 | Consequently, a build of OpenSSL with Cygwin is virtually identical to the
|
---|
267 | Unix procedure.
|
---|
268 |
|
---|
269 | To build OpenSSL using Cygwin, you need to:
|
---|
270 |
|
---|
271 | * Install Cygwin, see <https://cygwin.com/>
|
---|
272 |
|
---|
273 | * Install Cygwin Perl, at least version 5.10.0
|
---|
274 | and ensure it is in the $PATH
|
---|
275 |
|
---|
276 | * Run the Cygwin Bash shell
|
---|
277 |
|
---|
278 | Apart from that, follow the Unix / Linux instructions in INSTALL.md.
|
---|
279 |
|
---|
280 | NOTE: `make test` and normal file operations may fail in directories
|
---|
281 | mounted as text (i.e. `mount -t c:\somewhere /home`) due to Cygwin
|
---|
282 | stripping of carriage returns. To avoid this, ensure that a binary
|
---|
283 | mount is used, e.g. `mount -b c:\somewhere /home`.
|
---|