171eb4000SDmitri TikhonovLiteSpeed QUIC (LSQUIC) Library - Building for Windows
271eb4000SDmitri Tikhonov======================================================
3eef4f2fcSDmitri Tikhonov
4eef4f2fcSDmitri TikhonovDescription
5eef4f2fcSDmitri Tikhonov-----------
6eef4f2fcSDmitri Tikhonov
7eef4f2fcSDmitri TikhonovThis document is intended to supplement the document README.md at the
871eb4000SDmitri Tikhonovroot of the distribution of the LiteSpeed QUIC (LSQUIC) Library
9eef4f2fcSDmitri Tikhonovto build the library and programs in a Windows environment.  
10eef4f2fcSDmitri Tikhonov
1171eb4000SDmitri TikhonovThe addition of Windows support to the LSQUIC was a contribution 
12eef4f2fcSDmitri Tikhonovfrom the user community and this document was based on our experiences
13eef4f2fcSDmitri Tikhonovof validating the code.  As for the overall implementation, do not hesitate
14eef4f2fcSDmitri Tikhonovto report bugs back to us.  Even better, continue to send us fixes and 
15eef4f2fcSDmitri Tikhonovimprovements - it makes the code better for everyone.
16eef4f2fcSDmitri Tikhonov
17eef4f2fcSDmitri Tikhonov
18eef4f2fcSDmitri TikhonovPreliminaries
19eef4f2fcSDmitri Tikhonov-------------
20eef4f2fcSDmitri TikhonovIt it recommended that the installer have experience with Windows development,
21eef4f2fcSDmitri TikhonovVisual Studio, and open source projects in Windows.  These instructions assume
22eef4f2fcSDmitri Tikhonova general build, primarily for 64-bit, both of a debug and a release version.
23eef4f2fcSDmitri Tikhonov
24eef4f2fcSDmitri TikhonovSome open source code required to be installed to build the code include:
25eef4f2fcSDmitri Tikhonov   - The [Git version control system executable for Windows](https://git-scm.com/download/win).
26eef4f2fcSDmitri Tikhonov   - A version of the Visual Studio development environment for Windows.  
27eef4f2fcSDmitri Tikhonov     The Windows SDK and C++ must be installed from it.  The 
28eef4f2fcSDmitri Tikhonov     [Visual Studio Community Edition](https://www.visualstudio.com/thank-you-downloading-visual-studio) will be just fine.
29eef4f2fcSDmitri Tikhonov   - [cmake for Windows](https://cmake.org/download/).  Download and install the 
30eef4f2fcSDmitri Tikhonov     version appropriate for the development/target platform (32 vs 64-bits, 
31eef4f2fcSDmitri Tikhonov     etc.).
32eef4f2fcSDmitri Tikhonov   - The Windows vcpkg package manager.  It can be cloned from [here](https://github.com/Microsoft/vcpkg).
3371eb4000SDmitri Tikhonov     Clone it at the same level to be used to clone/develop the lsquic.
34eef4f2fcSDmitri Tikhonov     The package must be compiled following the instructions on the git 
359711bfbaSLiteSpeed Tech     repository.
369711bfbaSLiteSpeed Tech   - Perform builds using the _Developer Command Prompt for Visual Studio_ instead
379711bfbaSLiteSpeed Tech     of the regular `cmd.exe`.
38eef4f2fcSDmitri Tikhonov   - Once the package manager has been built, it must be used to install
39eef4f2fcSDmitri Tikhonov     and build some open source projects.  Before doing that, an environment 
40eef4f2fcSDmitri Tikhonov     variable must be defined which specifies how the package should be built.
41eef4f2fcSDmitri Tikhonov     The easiest way would be to add it into the system environment variables
42eef4f2fcSDmitri Tikhonov     in the System applet of the Windows Control Panel.  This example assumes 
43eef4f2fcSDmitri Tikhonov     64-bit static libraries will be built, which is what is generally 
44eef4f2fcSDmitri Tikhonov     recommended:
45eef4f2fcSDmitri Tikhonov        ```
46eef4f2fcSDmitri Tikhonov        VCPKG_DEFAULT_TRIPLET=x64-windows-static
47eef4f2fcSDmitri Tikhonov        ```
48eef4f2fcSDmitri Tikhonov   - From the command line, once the variable above has been defined, install
49eef4f2fcSDmitri Tikhonov     both *zlib* and *libevent*.  Note that libevent may also automatically 
50eef4f2fcSDmitri Tikhonov     install *openssl*.  If it does not, it may need to be manually specified 
5171eb4000SDmitri Tikhonov     to properly link the lsquic executables.
52eef4f2fcSDmitri Tikhonov        ```
538573794bSMaxim Sharabayko        vcpkg install zlib:x64-windows-static
549711bfbaSLiteSpeed Tech        vcpkg install libevent:x64-windows-static
559711bfbaSLiteSpeed Tech        vcpkg integrate install
56eef4f2fcSDmitri Tikhonov        ```
579711bfbaSLiteSpeed Tech   - Clone and compile boringssl.  It can be cloned from [here](https://boringssl.googlesource.com/boringssl).
589711bfbaSLiteSpeed Tech   
59eef4f2fcSDmitri Tikhonov        ```
609711bfbaSLiteSpeed Tech        git clone https://boringssl.googlesource.com/boringssl
619711bfbaSLiteSpeed Tech        cd boringssl
62eef4f2fcSDmitri Tikhonov        cmake -DCMAKE_GENERATOR_PLATFORM=x64 --config Debug -DBUILD_SHARED_LIBS=OFF -DOPENSSL_NO_ASM=1 .
639711bfbaSLiteSpeed Tech        msbuild ALL_BUILD.vcxproj
649711bfbaSLiteSpeed Tech        set boringssl=%cd%
65eef4f2fcSDmitri Tikhonov        ```
66eef4f2fcSDmitri Tikhonov   - Visual Studio can be run, and the project opened within the boringssl
67eef4f2fcSDmitri Tikhonov     directory.  Set the solution configuration to *Debug* and the solution 
68eef4f2fcSDmitri Tikhonov     platform to *64-bit*.  Compile the project.
69eef4f2fcSDmitri Tikhonov   - Repeat the cmake and compile steps replacing *Debug* with *Release*.
70eef4f2fcSDmitri Tikhonov
7171eb4000SDmitri TikhonovMake and Compile LSQUIC
7271eb4000SDmitri Tikhonov-----------------------
73eef4f2fcSDmitri Tikhonov
749711bfbaSLiteSpeed Tech
7571eb4000SDmitri TikhonovClone lsquic:
769711bfbaSLiteSpeed Tech
77eef4f2fcSDmitri Tikhonov   ```
7871eb4000SDmitri Tikhonov   git clone https://github.com/litespeedtech/lsquic.git --recurse-submodules
7971eb4000SDmitri Tikhonov   cd lsquic
80eef4f2fcSDmitri Tikhonov   ```
81eef4f2fcSDmitri Tikhonov
829711bfbaSLiteSpeed TechConfigure the build using cmake (you can specify `Release` instead of `Debug`
839711bfbaSLiteSpeed Techto build an optimized version of the library, but that won't build tests):
849711bfbaSLiteSpeed Tech
85eef4f2fcSDmitri Tikhonov   ```
869711bfbaSLiteSpeed Tech   cmake -DCMAKE_GENERATOR_PLATFORM=x64 -DBUILD_SHARED_LIBS=OFF ^
879711bfbaSLiteSpeed Tech        -DVCPKG_TARGET_TRIPLET=x64-windows-static -DCMAKE_BUILD_TYPE=Debug ^
889711bfbaSLiteSpeed Tech        -DCMAKE_TOOLCHAIN_FILE=c:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake ^
899711bfbaSLiteSpeed Tech        -DBORINGSSL_DIR=%boringssl% .
90eef4f2fcSDmitri Tikhonov   ```
91eef4f2fcSDmitri Tikhonov
929711bfbaSLiteSpeed TechCompile everything (add `/m` flag if you have processors to spare):
93eef4f2fcSDmitri Tikhonov
94eef4f2fcSDmitri Tikhonov   ```
959711bfbaSLiteSpeed Tech   msbuild ALL_BUILD.vcxproj
96eef4f2fcSDmitri Tikhonov   ```
97eef4f2fcSDmitri Tikhonov
989711bfbaSLiteSpeed Tech`http_client.exe` should be found in the `Debug` (or `Release`) directory.
999711bfbaSLiteSpeed Tech   
1009711bfbaSLiteSpeed TechRun tests (assuming `Debug` build):
1019711bfbaSLiteSpeed Tech
1029711bfbaSLiteSpeed Tech   ```
1039711bfbaSLiteSpeed Tech   msbuild RUN_TESTS.vcxproj
1049711bfbaSLiteSpeed Tech   ```
105eef4f2fcSDmitri Tikhonov
106eef4f2fcSDmitri TikhonovHave fun,
107eef4f2fcSDmitri Tikhonov
108eef4f2fcSDmitri TikhonovLiteSpeed QUIC Team.
109eef4f2fcSDmitri Tikhonov
11071eb4000SDmitri TikhonovCopyright (c) 2017 - 2020 LiteSpeed Technologies Inc
111