libwebsockets/READMEs/README.build-windows.md
Andy Green 9f1d019352 CTest: migrate and deprecate existing selftest scripts
Replace the bash selftest plumbing with CTest.

To use the selftests, build with -DLWS_WITH_MINIMAL_EXAMPLES=1
and `CTEST_OUTPUT_ON_FAILURE=1 make test` or just
`make test`.

To disable tests that require internet access, also give
-DLWS_CTEST_INTERNET_AVAILABLE=0

Remove travis and appveyor scripts on master.

Remove travis and appveyor decals on README.md.
2020-05-11 15:40:13 +01:00

215 lines
6.6 KiB
Markdown

# Some notes for the windows jungle
This was how I compiled libwebsockets starting from a blank windows install
in March - April 2020. Doing this on a linux distro is way simpler and quicker
than all this!
## Notes on vm installation
### Disk size
For building you'll need 40GB+ available for the guest storage.
### Required: Windows product key
Assuming like me the first thing you do with a new laptop is install Linux over
the windows it came with, you can recover your 'windows tax' windows product key
from your device typically using `sudo strings /sys/firmware/acpi/tables/MSDM`,
and use that for your VM install.
### Required: Spice guest
To have shared clipboard, and for windows video driver to match your vm window
resolution, you must install spice guest tools inside the windows VM. It also
installs some virtio pieces you will want.
https://www.spice-space.org/download/windows/spice-guest-tools/spice-guest-tools-latest.exe
### Blood-pressure reduction: Firefox
https://www.mozilla.org/en-US/exp/firefox/
When it's up, add-ons: ublock origin, privacy badger, noscript, disable search
bar prediction
### Blood-pressure reduction: Clink
This is a hack on cmd.exe that lets it understand Ctrl-R and fixup unix-style
slashes automagically.
https://github.com/mridgers/clink/releases/download/0.4.9/clink_0.4.9_setup.exe
If you're usually using *nix, you definitely need this to keep your sanity.
### Required: cmake
CMake have a windows installer thing downloadable from here
[cmake](https://cmake.org/download/)
after that you can use `cmake` from the terminal OK.
### Required: git
Visit the canonical git site to download their windows installer thing
[git](https://git-scm.com/download/win)
**Select the install option for "extra unix commands"** so you can get `ls -l`,
`cp`, `mv` and suchlike working in cmd.exe... that's awesome, thanks git!
Afterwards you can just use `git` as normal from cmd.exe as well.
### Required: Install the "free" "community" visual studio
You can do this through "windows store" by searching for "visual studio"
I installed as little as possible, we just want the C "C++" tools... 7GB :-)
It still wouldn't link without the "mt" helper tool from the
huge windows SDK, so you have to install GB of that as well.
They don't mention it during the install, but after 30 days this "free"
"community" edition demands you open a microsoft account or it stops working.
In the install they give you the option to add a microsoft account and the
alternative is, "not now, maybe later". Compare and contrast to gcc or git or
the other FOSS projects.
### Required: OpenSSL
Ugh... I tried using prebuilts but it's unreliable and needs an unfeasible
amount of trust. So I recommend bite the bullet and build your own... that's
trivial on Linux but of course windows makes everything nasty.
At least hopefully all the "research" is done and listed out here.
#### OpenSSL build Prerequisite: install perl binary
Move the git version of perl out of the way, it won't work for OpenSSL build
```
mv /usr/bin/perl /usr/bin/perl-git
```
For windows, OpenSSL "recommends" ActiveState perl but it doesn't work for me,
complaining about stuff needed from cpan and then dying when it was installed.
"Strawberry Perl" is installed in `C:\Strawberry` and worked out the box.
http://strawberryperl.com/download/5.30.2.1/strawberry-perl-5.30.2.1-64bit.msi
The installer sets up `%PATH%` if you open a new cmd window.
#### OpenSSL build Prerequisite: NASM
Go here and click on the latest stable, download the win32 .exe
https://nasm.us/
Just install via the defaults. Then add it to the PATH temporarily...
```
$ set PATH=%PATH%;C:\Program Files (x86)\NASM
```
#### OpenSSL build setup: source VC env vars
These fix up the PATH and include dirs etc necessary for VC build in the cmd
window.
```
$ call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64
```
### OpenSSL build:
Grab openssl from git... assuming the prerequisites above went well it will
just sit there building for 30 minutes or whatever.
```
$ git clone https://github.com/openssl/openssl
$ cd openssl
$ perl Configure VC-WIN64A
$ nmake
```
Afterwards, open an Administrator mode cmd.exe, redo the msvc path and then
install the build.
```
$ cd openssl
$ call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64
$ nmake install
```
Oh another grindingly slow windows build action. Finally it's in there in
`C:\Program Files\OpenSSL`.
libraries are looking for a cert bundle at "C:\Program Files\Common Files\SSL\cert.pem"...
it's not documented or included in the zip file from the above, so...
#### Installing a cert bundle
You can get a trusted cert bundle from here
[drwetter/testssl cert bundle](https://raw.githubusercontent.com/drwetter/testssl.sh/3.1dev/etc/Microsoft.pem)
Save it into `C:\Program Files\Common Files\SSL\cert.pem` where openssl will be able to see it.
## Required: pthreads
It's amazing but after all these years windows doesn't offer pthreads compatibility
itself. Just like the many other missing POSIX bits like fork().
I downloaded the latest (2012) zip release of pthreads-win32 from here
ftp://sourceware.org/pub/pthreads-win32
Then I created a dir "C:\Program Files (x86)\pthreads", and copied the `dll`,
`include` and `lib` subdirs from the `prebuilt` folder in the zip there.
The cmake incantation to build against pthreads set up like that is
```
$ cmake .. -DLWS_HAVE_PTHREAD_H=1 -DLWS_EXT_PTHREAD_INCLUDE_DIR="C:\Program Files (x86)\pthreads\include" -DLWS_EXT_PTHREAD_LIBRARIES="C:\Program Files (x86)\pthreads\lib\x64\libpthreadGC2.a" -DLWS_WITH_MINIMAL_EXAMPLES=1
```
## Building libwebsockets
We'll clone libwebsockets then use cmake to build via vs tools
```
> git clone https://libwebsockets.org/repo/libwebsockets
> cd libwebsockets
> mkdir build
> cd build
> cmake ..
> cmake --build . --config DEBUG
```
Installing requires admin privs, I opened a second cmd window as admin and did it
there.
```
> cmake --install . --config DEBUG
```
### Hack the libs into view
The libs we built against aren't visible in the system, I don't know what
Real Windows Programmers are supposed to do about that, but I used an Admin cmd
prompt to copy them into C:\windows\system32
```
$ cp "C:\Program Files (x86)\pthreads\dll\x64\pthreadGC2.dll" "C:\Program Files\OpenSSL\bin\libcrypto-3.dll" "C:\Program Files\OpenSSL\bin\libssl-3.dll" C:\Windows\system32
```
After that you can run the test apps OK, eg
```
$ libwebsockets-test-server.exe -s
```
## Note about using paths with spaces in with cmake