xref: /aosp_15_r20/external/cronet/third_party/protobuf/cmake/README.md (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard WorkerThis directory contains *CMake* files that can be used to build protobuf
2*6777b538SAndroid Build Coastguard Workerwith *MSVC* on *Windows*. You can build the project from *Command Prompt*
3*6777b538SAndroid Build Coastguard Workerand using an *Visual Studio* IDE.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard WorkerYou need to have [CMake](http://www.cmake.org), [Visual Studio](https://www.visualstudio.com)
6*6777b538SAndroid Build Coastguard Workerand optionally [Git](http://git-scm.com) installed on your computer before proceeding.
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard WorkerMost of the instructions will be given to the *Сommand Prompt*, but the same
9*6777b538SAndroid Build Coastguard Workeractions can be performed using appropriate GUI tools.
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard WorkerEnvironment Setup
12*6777b538SAndroid Build Coastguard Worker=================
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard WorkerOpen the appropriate *Command Prompt* from the *Start* menu.
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard WorkerFor example *x86 Native Tools Command Prompt for VS 2019*:
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker    C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional>
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard WorkerChange to your working directory:
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker    C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional>cd C:\Path\to
23*6777b538SAndroid Build Coastguard Worker    C:\Path\to>
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard WorkerWhere *C:\Path\to* is path to your real working directory.
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard WorkerCreate a folder where protobuf headers/libraries/binaries will be installed after built:
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker    C:\Path\to>mkdir install
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard WorkerIf *cmake* command is not available from *Command Prompt*, add it to system *PATH* variable:
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker    C:\Path\to>set PATH=%PATH%;C:\Program Files (x86)\CMake\bin
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard WorkerIf *git* command is not available from *Command Prompt*, add it to system *PATH* variable:
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker    C:\Path\to>set PATH=%PATH%;C:\Program Files\Git\cmd
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard WorkerOptionally, you will want to download [ninja](https://ninja-build.org/) and add it to your *PATH* variable.
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker    C:\Path\to>set PATH=%PATH%;C:\tools\ninja
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard WorkerGood. Now you are ready to continue.
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard WorkerGetting Sources
46*6777b538SAndroid Build Coastguard Worker===============
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard WorkerYou can get the latest stable source packages from the release page:
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker    https://github.com/protocolbuffers/protobuf/releases/latest
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard WorkerFor example: if you only need C++, download `protobuf-cpp-[VERSION].tar.gz`; if
53*6777b538SAndroid Build Coastguard Workeryou need C++ and Java, download `protobuf-java-[VERSION].tar.gz` (every package
54*6777b538SAndroid Build Coastguard Workercontains C++ source already); if you need C++ and multiple other languages,
55*6777b538SAndroid Build Coastguard Workerdownload `protobuf-all-[VERSION].tar.gz`.
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard WorkerOr you can use git to clone from protobuf git repository.
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Worker     C:\Path\to> mkdir src & cd src
60*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src> git clone -b [release_tag] https://github.com/protocolbuffers/protobuf.git
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard WorkerWhere *[release_tag]* is a git tag like *v3.0.0-beta-1* or a branch name like *main*
63*6777b538SAndroid Build Coastguard Workerif you want to get the latest code.
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard WorkerGo to the project folder:
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src> cd protobuf
68*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src\protobuf>
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard WorkerRemember to update any submodules if you are using git clone (you can skip this
71*6777b538SAndroid Build Coastguard Workerstep if you are using a release .tar.gz or .zip package):
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker```console
74*6777b538SAndroid Build Coastguard WorkerC:\Path\to\src\protobuf> git submodule update --init --recursive
75*6777b538SAndroid Build Coastguard Worker```
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard WorkerGood. Now you are ready for *CMake* configuration.
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard WorkerCMake Configuration
80*6777b538SAndroid Build Coastguard Worker===================
81*6777b538SAndroid Build Coastguard Worker
82*6777b538SAndroid Build Coastguard Worker*CMake* supports a lot of different
83*6777b538SAndroid Build Coastguard Worker[generators](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7.html)
84*6777b538SAndroid Build Coastguard Workerfor various native build systems.
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard WorkerOf most interest to Windows programmers are the following:
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker* [Makefile](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7.html#makefile-generators).
89*6777b538SAndroid Build Coastguard Worker  This generates NMake Makefiles for Visual Studio. These work, but they are rather slow.
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker* [Visual Studio](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7.html#visual-studio-generators)
92*6777b538SAndroid Build Coastguard Worker  This generates a Visual Studio solution for the project.
93*6777b538SAndroid Build Coastguard Worker
94*6777b538SAndroid Build Coastguard Worker* [Ninja](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#ninja-generator)
95*6777b538SAndroid Build Coastguard Worker  This uses the external tool [Ninja](https://ninja-build.org/) to build. It is the fastest solution available.
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard WorkerNote that as of Visual Studio 2015, Visual Studio includes
98*6777b538SAndroid Build Coastguard Worker[support for opening directly CMake-based projects](https://docs.microsoft.com/en-us/cpp/build/cmake-projects-in-visual-studio).
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard WorkerIt is considered good practice not to build CMake projects in the source tree but in a separate folder.
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard WorkerCreate a temporary *build* folder and change your working directory to it:
103*6777b538SAndroid Build Coastguard Worker
104*6777b538SAndroid Build Coastguard Worker     mkdir C:\Path\to\build\protobuf
105*6777b538SAndroid Build Coastguard Worker     cd C:\Path\to\build\protobuf
106*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf>
107*6777b538SAndroid Build Coastguard Worker
108*6777b538SAndroid Build Coastguard WorkerThe *Makefile* and *Ninja* generators can build the project in only one configuration, so you need to build
109*6777b538SAndroid Build Coastguard Workera separate folder for each configuration.
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard WorkerTo start using a *Release* configuration via the *NMmake* generator:
112*6777b538SAndroid Build Coastguard Worker
113*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf>mkdir release & cd release
114*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf\release>cmake -G "NMake Makefiles" ^
115*6777b538SAndroid Build Coastguard Worker     -DCMAKE_BUILD_TYPE=Release ^
116*6777b538SAndroid Build Coastguard Worker     -DCMAKE_INSTALL_PREFIX=C:\Path\to\install ^
117*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src\protobuf
118*6777b538SAndroid Build Coastguard Worker
119*6777b538SAndroid Build Coastguard WorkerIt will generate a *NMake* *Makefile* in the current directory.
120*6777b538SAndroid Build Coastguard Worker
121*6777b538SAndroid Build Coastguard WorkerTo use *Debug* configuration using *Ninja*:
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf>mkdir debug & cd debug
124*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf\debug>cmake -G "Ninja" ^
125*6777b538SAndroid Build Coastguard Worker     -DCMAKE_BUILD_TYPE=Debug ^
126*6777b538SAndroid Build Coastguard Worker     -DCMAKE_INSTALL_PREFIX=C:\Path\to\install ^
127*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src\protobuf
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard WorkerIt will generate *Ninja* build scripts in current directory.
130*6777b538SAndroid Build Coastguard Worker
131*6777b538SAndroid Build Coastguard WorkerThe *Visual Studio* generator is multi-configuration: it will generate a single *.sln* file that can be used for both *Debug* and *Release*:
132*6777b538SAndroid Build Coastguard Worker
133*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf>mkdir solution & cd solution
134*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf\solution>cmake -G "Visual Studio 16 2019" ^
135*6777b538SAndroid Build Coastguard Worker     -DCMAKE_INSTALL_PREFIX=C:\Path\to\install ^
136*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src\protobuf
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard WorkerIt will generate *Visual Studio* solution file *protobuf.sln* in current directory.
139*6777b538SAndroid Build Coastguard Worker
140*6777b538SAndroid Build Coastguard WorkerUnit Tests
141*6777b538SAndroid Build Coastguard Worker----------
142*6777b538SAndroid Build Coastguard Worker
143*6777b538SAndroid Build Coastguard WorkerUnit tests are being built along with the rest of protobuf. The unit tests require Google Mock (now a part of Google Test).
144*6777b538SAndroid Build Coastguard Worker
145*6777b538SAndroid Build Coastguard WorkerA copy of [Google Test](https://github.com/google/googletest) is included as a Git submodule in the `third-party/googletest` folder.
146*6777b538SAndroid Build Coastguard Worker(You do need to initialize the Git submodules as explained above.)
147*6777b538SAndroid Build Coastguard Worker
148*6777b538SAndroid Build Coastguard WorkerAlternately, you may want to use protobuf in a larger set-up, you may want to use that standard CMake approach where
149*6777b538SAndroid Build Coastguard Workeryou build and install a shared copy of Google Test.
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard WorkerAfter you've built and installed your Google Test copy, you need add the following definition to your *cmake* command line
152*6777b538SAndroid Build Coastguard Workerduring the configuration step: `-Dprotobuf_USE_EXTERNAL_GTEST=ON`.
153*6777b538SAndroid Build Coastguard WorkerThis will cause the standard CMake `find_package(GTest REQUIRED)` to be used.
154*6777b538SAndroid Build Coastguard Worker
155*6777b538SAndroid Build Coastguard Worker[find_package](https://cmake.org/cmake/help/latest/command/find_package.html) will search in a default location,
156*6777b538SAndroid Build Coastguard Workerwhich on Windows is *C:\Program Files*. This is most likely not what you want. You will want instead to search for
157*6777b538SAndroid Build Coastguard WorkerGoogle Test in your project's root directory (i.e. the same directory you've passed to `CMAKE_INSTALL_PREFIX` when
158*6777b538SAndroid Build Coastguard Workerbuilding Google Test). For this, you need to set the `CMAKE_PREFIX_PATH` CMake variable. (There are other ways in CMake,
159*6777b538SAndroid Build Coastguard Workersee the [manual](https://cmake.org/cmake/help/latest/command/find_package.html) for details.)
160*6777b538SAndroid Build Coastguard Worker
161*6777b538SAndroid Build Coastguard WorkerFor example:
162*6777b538SAndroid Build Coastguard Worker
163*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf>mkdir solution & cd solution
164*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf\solution>cmake -G "Visual Studio 16 2019" ^
165*6777b538SAndroid Build Coastguard Worker     -DCMAKE_INSTALL_PREFIX=C:\Path\to\install ^
166*6777b538SAndroid Build Coastguard Worker     -DCMAKE_PREFIX_PATH=C:\Path\to\my_big_project ^
167*6777b538SAndroid Build Coastguard Worker     -Dprotobuf_USE_EXTERNAL_GTEST=ON ^
168*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src\protobuf
169*6777b538SAndroid Build Coastguard Worker
170*6777b538SAndroid Build Coastguard WorkerIn most cases, `CMAKE_PREFIX_PATH` and `CMAKE_INSTALL_PREFIX` will point to the same directory.
171*6777b538SAndroid Build Coastguard Worker
172*6777b538SAndroid Build Coastguard WorkerTo disable testing completely, you need to add the following argument to you *cmake* command line: `-Dprotobuf_BUILD_TESTS=OFF`.
173*6777b538SAndroid Build Coastguard Worker
174*6777b538SAndroid Build Coastguard WorkerFor example:
175*6777b538SAndroid Build Coastguard Worker
176*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf\solution>cmake -G "Visual Studio 16 2019" ^
177*6777b538SAndroid Build Coastguard Worker     -DCMAKE_INSTALL_PREFIX=C:\Path\to\install ^
178*6777b538SAndroid Build Coastguard Worker     -Dprotobuf_BUILD_TESTS=OFF ^
179*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src\protobuf
180*6777b538SAndroid Build Coastguard Worker
181*6777b538SAndroid Build Coastguard WorkerCompiling
182*6777b538SAndroid Build Coastguard Worker=========
183*6777b538SAndroid Build Coastguard Worker
184*6777b538SAndroid Build Coastguard WorkerThe standard way to compile a *CMake* project is `cmake --build <directory>`.
185*6777b538SAndroid Build Coastguard Worker
186*6777b538SAndroid Build Coastguard Worker
187*6777b538SAndroid Build Coastguard WorkerNote that if your generator supports multiple configurations, you will probably want to specify which one to build:
188*6777b538SAndroid Build Coastguard Worker
189*6777b538SAndroid Build Coastguard Worker     cmake --build C:\Path\to\build\protobuf\solution --config Release
190*6777b538SAndroid Build Coastguard Worker
191*6777b538SAndroid Build Coastguard WorkerYou can also run directly the build tool you've configured:
192*6777b538SAndroid Build Coastguard Worker
193*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf\release>nmake
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Workeror
196*6777b538SAndroid Build Coastguard Worker
197*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf\debug>ninja
198*6777b538SAndroid Build Coastguard Worker
199*6777b538SAndroid Build Coastguard WorkerAnd wait for the compilation to finish.
200*6777b538SAndroid Build Coastguard Worker
201*6777b538SAndroid Build Coastguard WorkerIf you prefer to use the IDE:
202*6777b538SAndroid Build Coastguard Worker
203*6777b538SAndroid Build Coastguard Worker  * Open the generated protobuf.sln file in Microsoft Visual Studio.
204*6777b538SAndroid Build Coastguard Worker  * Choose "Debug" or "Release" configuration as desired.
205*6777b538SAndroid Build Coastguard Worker  * From the Build menu, choose "Build Solution".
206*6777b538SAndroid Build Coastguard Worker
207*6777b538SAndroid Build Coastguard WorkerAnd wait for the compilation to finish.
208*6777b538SAndroid Build Coastguard Worker
209*6777b538SAndroid Build Coastguard WorkerTesting
210*6777b538SAndroid Build Coastguard Worker=======
211*6777b538SAndroid Build Coastguard Worker
212*6777b538SAndroid Build Coastguard WorkerTo run unit-tests, first you must compile protobuf as described above.
213*6777b538SAndroid Build Coastguard WorkerThen run:
214*6777b538SAndroid Build Coastguard Worker
215*6777b538SAndroid Build Coastguard Worker     C:\Path\to\protobuf\cmake\build\release>ctest --progress --output-on-failure
216*6777b538SAndroid Build Coastguard Worker
217*6777b538SAndroid Build Coastguard WorkerYou can also build the `check` target (not idiomatic CMake usage, though):
218*6777b538SAndroid Build Coastguard Worker
219*6777b538SAndroid Build Coastguard Worker     C:\Path\to\protobuf\cmake\build\release>cmake --build . --target check
220*6777b538SAndroid Build Coastguard Worker
221*6777b538SAndroid Build Coastguard Workeror
222*6777b538SAndroid Build Coastguard Worker
223*6777b538SAndroid Build Coastguard Worker    C:\Path\to\build\protobuf\release>ninja check
224*6777b538SAndroid Build Coastguard Worker
225*6777b538SAndroid Build Coastguard WorkerYou can also build project *check* from Visual Studio solution.
226*6777b538SAndroid Build Coastguard WorkerYes, it may sound strange, but it works.
227*6777b538SAndroid Build Coastguard Worker
228*6777b538SAndroid Build Coastguard WorkerYou should see output similar to:
229*6777b538SAndroid Build Coastguard Worker
230*6777b538SAndroid Build Coastguard Worker     Running main() from gmock_main.cc
231*6777b538SAndroid Build Coastguard Worker     [==========] Running 1546 tests from 165 test cases.
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard Worker     ...
234*6777b538SAndroid Build Coastguard Worker
235*6777b538SAndroid Build Coastguard Worker     [==========] 1546 tests from 165 test cases ran. (2529 ms total)
236*6777b538SAndroid Build Coastguard Worker     [  PASSED  ] 1546 tests.
237*6777b538SAndroid Build Coastguard Worker
238*6777b538SAndroid Build Coastguard WorkerTo run specific tests, you need to pass some command line arguments to the test program itself:
239*6777b538SAndroid Build Coastguard Worker
240*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf\release>tests.exe --gtest_filter=AnyTest*
241*6777b538SAndroid Build Coastguard Worker     Running main() from gmock_main.cc
242*6777b538SAndroid Build Coastguard Worker     Note: Google Test filter = AnyTest*
243*6777b538SAndroid Build Coastguard Worker     [==========] Running 3 tests from 1 test case.
244*6777b538SAndroid Build Coastguard Worker     [----------] Global test environment set-up.
245*6777b538SAndroid Build Coastguard Worker     [----------] 3 tests from AnyTest
246*6777b538SAndroid Build Coastguard Worker     [ RUN      ] AnyTest.TestPackAndUnpack
247*6777b538SAndroid Build Coastguard Worker     [       OK ] AnyTest.TestPackAndUnpack (0 ms)
248*6777b538SAndroid Build Coastguard Worker     [ RUN      ] AnyTest.TestPackAndUnpackAny
249*6777b538SAndroid Build Coastguard Worker     [       OK ] AnyTest.TestPackAndUnpackAny (0 ms)
250*6777b538SAndroid Build Coastguard Worker     [ RUN      ] AnyTest.TestIs
251*6777b538SAndroid Build Coastguard Worker     [       OK ] AnyTest.TestIs (0 ms)
252*6777b538SAndroid Build Coastguard Worker     [----------] 3 tests from AnyTest (1 ms total)
253*6777b538SAndroid Build Coastguard Worker
254*6777b538SAndroid Build Coastguard Worker     [----------] Global test environment tear-down
255*6777b538SAndroid Build Coastguard Worker     [==========] 3 tests from 1 test case ran. (2 ms total)
256*6777b538SAndroid Build Coastguard Worker     [  PASSED  ] 3 tests.
257*6777b538SAndroid Build Coastguard Worker
258*6777b538SAndroid Build Coastguard WorkerNote that the tests must be run from the source folder.
259*6777b538SAndroid Build Coastguard Worker
260*6777b538SAndroid Build Coastguard WorkerIf all tests are passed, safely continue.
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard WorkerInstalling
263*6777b538SAndroid Build Coastguard Worker==========
264*6777b538SAndroid Build Coastguard Worker
265*6777b538SAndroid Build Coastguard WorkerTo install protobuf to the *install* folder you've specified in the configuration step, you need to build the `install` target:
266*6777b538SAndroid Build Coastguard Worker
267*6777b538SAndroid Build Coastguard Worker     cmake --build C:\Path\to\build\protobuf\solution --config Release --target install
268*6777b538SAndroid Build Coastguard Worker
269*6777b538SAndroid Build Coastguard WorkerOr if you prefer:
270*6777b538SAndroid Build Coastguard Worker
271*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf\release>nmake install
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard Workeror
274*6777b538SAndroid Build Coastguard Worker
275*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\protobuf\debug>ninja install
276*6777b538SAndroid Build Coastguard Worker
277*6777b538SAndroid Build Coastguard WorkerYou can also build project *INSTALL* from Visual Studio solution.
278*6777b538SAndroid Build Coastguard WorkerIt sounds not so strange and it works.
279*6777b538SAndroid Build Coastguard Worker
280*6777b538SAndroid Build Coastguard WorkerThis will create the following folders under the *install* location:
281*6777b538SAndroid Build Coastguard Worker  * bin - that contains protobuf *protoc.exe* compiler;
282*6777b538SAndroid Build Coastguard Worker  * include - that contains C++ headers and protobuf *.proto files;
283*6777b538SAndroid Build Coastguard Worker  * lib - that contains linking libraries and *CMake* configuration files for *protobuf* package.
284*6777b538SAndroid Build Coastguard Worker
285*6777b538SAndroid Build Coastguard WorkerNow you can if needed:
286*6777b538SAndroid Build Coastguard Worker  * Copy the contents of the include directory to wherever you want to put headers.
287*6777b538SAndroid Build Coastguard Worker  * Copy protoc.exe wherever you put build tools (probably somewhere in your PATH).
288*6777b538SAndroid Build Coastguard Worker  * Copy linking libraries libprotobuf[d].lib, libprotobuf-lite[d].lib, and libprotoc[d].lib wherever you put libraries.
289*6777b538SAndroid Build Coastguard Worker
290*6777b538SAndroid Build Coastguard WorkerTo avoid conflicts between the MSVC debug and release runtime libraries, when
291*6777b538SAndroid Build Coastguard Workercompiling a debug build of your application, you may need to link against a
292*6777b538SAndroid Build Coastguard Workerdebug build of libprotobufd.lib with "d" postfix.  Similarly, release builds should link against
293*6777b538SAndroid Build Coastguard Workerrelease libprotobuf.lib library.
294*6777b538SAndroid Build Coastguard Worker
295*6777b538SAndroid Build Coastguard WorkerDLLs vs. static linking
296*6777b538SAndroid Build Coastguard Worker=======================
297*6777b538SAndroid Build Coastguard Worker
298*6777b538SAndroid Build Coastguard WorkerStatic linking is now the default for the Protocol Buffer libraries.  Due to
299*6777b538SAndroid Build Coastguard Workerissues with Win32's use of a separate heap for each DLL, as well as binary
300*6777b538SAndroid Build Coastguard Workercompatibility issues between different versions of MSVC's STL library, it is
301*6777b538SAndroid Build Coastguard Workerrecommended that you use static linkage only.  However, it is possible to
302*6777b538SAndroid Build Coastguard Workerbuild libprotobuf and libprotoc as DLLs if you really want.  To do this,
303*6777b538SAndroid Build Coastguard Workerdo the following:
304*6777b538SAndroid Build Coastguard Worker
305*6777b538SAndroid Build Coastguard Worker  * Add an additional flag `-Dprotobuf_BUILD_SHARED_LIBS=ON` when invoking cmake
306*6777b538SAndroid Build Coastguard Worker  * Follow the same steps as described in the above section.
307*6777b538SAndroid Build Coastguard Worker  * When compiling your project, make sure to `#define PROTOBUF_USE_DLLS`.
308*6777b538SAndroid Build Coastguard Worker
309*6777b538SAndroid Build Coastguard WorkerWhen distributing your software to end users, we strongly recommend that you
310*6777b538SAndroid Build Coastguard Workerdo NOT install libprotobuf.dll or libprotoc.dll to any shared location.
311*6777b538SAndroid Build Coastguard WorkerInstead, keep these libraries next to your binaries, in your application's
312*6777b538SAndroid Build Coastguard Workerown install directory.  C++ makes it very difficult to maintain binary
313*6777b538SAndroid Build Coastguard Workercompatibility between releases, so it is likely that future versions of these
314*6777b538SAndroid Build Coastguard Workerlibraries will *not* be usable as drop-in replacements.
315*6777b538SAndroid Build Coastguard Worker
316*6777b538SAndroid Build Coastguard WorkerIf your project is itself a DLL intended for use by third-party software, we
317*6777b538SAndroid Build Coastguard Workerrecommend that you do NOT expose protocol buffer objects in your library's
318*6777b538SAndroid Build Coastguard Workerpublic interface, and that you statically link protocol buffers into your
319*6777b538SAndroid Build Coastguard Workerlibrary.
320*6777b538SAndroid Build Coastguard Worker
321*6777b538SAndroid Build Coastguard WorkerZLib support
322*6777b538SAndroid Build Coastguard Worker============
323*6777b538SAndroid Build Coastguard Worker
324*6777b538SAndroid Build Coastguard WorkerIf you want to include GzipInputStream and GzipOutputStream
325*6777b538SAndroid Build Coastguard Worker(google/protobuf/io/gzip_stream.h) in libprotobuf, you will need to do a few
326*6777b538SAndroid Build Coastguard Workeradditional steps.
327*6777b538SAndroid Build Coastguard Worker
328*6777b538SAndroid Build Coastguard WorkerObtain a copy of the zlib library.  The pre-compiled DLL at zlib.net works.
329*6777b538SAndroid Build Coastguard WorkerYou need prepare it:
330*6777b538SAndroid Build Coastguard Worker
331*6777b538SAndroid Build Coastguard Worker  * Make sure zlib's two headers are in your `C:\Path\to\install\include` path
332*6777b538SAndroid Build Coastguard Worker  * Make sure zlib's linking libraries (*.lib file) is in your
333*6777b538SAndroid Build Coastguard Worker    `C:\Path\to\install\lib` library path.
334*6777b538SAndroid Build Coastguard Worker
335*6777b538SAndroid Build Coastguard WorkerYou can also compile it from source by yourself.
336*6777b538SAndroid Build Coastguard Worker
337*6777b538SAndroid Build Coastguard WorkerGetting sources:
338*6777b538SAndroid Build Coastguard Worker
339*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src>git clone -b v1.2.8 https://github.com/madler/zlib.git
340*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src>cd zlib
341*6777b538SAndroid Build Coastguard Worker
342*6777b538SAndroid Build Coastguard WorkerCompiling and Installing:
343*6777b538SAndroid Build Coastguard Worker
344*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src\zlib>mkdir C:\Path\to\build\zlib & cd C:\Path\to\build\zlib
345*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\zlib>mkdir release & cd release
346*6777b538SAndroid Build Coastguard Worker     C:\Path\to\build\zlib\release>cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Release ^
347*6777b538SAndroid Build Coastguard Worker     -DCMAKE_INSTALL_PREFIX=C:\Path\to\install C:\Path\to\src\zlib
348*6777b538SAndroid Build Coastguard Worker     C:\Path\to\src\zlib\build\release>cmake --build . --target install
349*6777b538SAndroid Build Coastguard Worker
350*6777b538SAndroid Build Coastguard WorkerYou can make *debug* version or use *Visual Studio* generator also as before for the
351*6777b538SAndroid Build Coastguard Workerprotobuf project.
352*6777b538SAndroid Build Coastguard Worker
353*6777b538SAndroid Build Coastguard WorkerNow add *bin* folder from *install* to system *PATH*:
354*6777b538SAndroid Build Coastguard Worker
355*6777b538SAndroid Build Coastguard Worker     C:\Path\to>set PATH=%PATH%;C:\Path\to\install\bin
356*6777b538SAndroid Build Coastguard Worker
357*6777b538SAndroid Build Coastguard WorkerYou need reconfigure protobuf with flag `-Dprotobuf_WITH_ZLIB=ON` when invoking cmake.
358*6777b538SAndroid Build Coastguard Worker
359*6777b538SAndroid Build Coastguard WorkerNote that if you have compiled ZLIB yourself, as stated above,
360*6777b538SAndroid Build Coastguard Workerfurther disable the option `-Dprotobuf_MSVC_STATIC_RUNTIME=OFF`.
361*6777b538SAndroid Build Coastguard Worker
362*6777b538SAndroid Build Coastguard WorkerIf it reports NOTFOUND for zlib_include or zlib_lib, you might haven't put
363*6777b538SAndroid Build Coastguard Workerthe headers or the .lib file in the right directory.
364*6777b538SAndroid Build Coastguard Worker
365*6777b538SAndroid Build Coastguard WorkerIf you already have ZLIB library and headers at some other location on your system then alternatively you can define following configuration flags to locate them:
366*6777b538SAndroid Build Coastguard Worker
367*6777b538SAndroid Build Coastguard Worker     -DZLIB_INCLUDE_DIR=<path to dir containing zlib headers>
368*6777b538SAndroid Build Coastguard Worker     -DZLIB_LIB=<path to dir containing zlib>
369*6777b538SAndroid Build Coastguard Worker
370*6777b538SAndroid Build Coastguard WorkerBuild and testing protobuf as usual.
371*6777b538SAndroid Build Coastguard Worker
372*6777b538SAndroid Build Coastguard WorkerNotes on Compiler Warnings
373*6777b538SAndroid Build Coastguard Worker==========================
374*6777b538SAndroid Build Coastguard Worker
375*6777b538SAndroid Build Coastguard WorkerThe following warnings have been disabled while building the protobuf libraries
376*6777b538SAndroid Build Coastguard Workerand compiler.  You may have to disable some of them in your own project as
377*6777b538SAndroid Build Coastguard Workerwell, or live with them.
378*6777b538SAndroid Build Coastguard Worker
379*6777b538SAndroid Build Coastguard Worker* C4244 - Conversion from 'type1' to 'type2', possible loss of data.
380*6777b538SAndroid Build Coastguard Worker* C4251 - 'identifier' : class 'type' needs to have dll-interface to be used by
381*6777b538SAndroid Build Coastguard Worker  clients of class 'type2'
382*6777b538SAndroid Build Coastguard Worker* C4267 - Conversion from 'size_t' to 'type', possible loss of data.
383*6777b538SAndroid Build Coastguard Worker* C4305 - 'identifier' : truncation from 'type1' to 'type2'
384*6777b538SAndroid Build Coastguard Worker* C4355 - 'this' : used in base member initializer list
385*6777b538SAndroid Build Coastguard Worker* C4800 - 'type' : forcing value to bool 'true' or 'false' (performance warning)
386*6777b538SAndroid Build Coastguard Worker* C4996 - 'function': was declared deprecated
387*6777b538SAndroid Build Coastguard Worker
388*6777b538SAndroid Build Coastguard WorkerC4251 is of particular note, if you are compiling the Protocol Buffer library
389*6777b538SAndroid Build Coastguard Workeras a DLL (see previous section).  The protocol buffer library uses templates in
390*6777b538SAndroid Build Coastguard Workerits public interfaces.  MSVC does not provide any reasonable way to export
391*6777b538SAndroid Build Coastguard Workertemplate classes from a DLL.  However, in practice, it appears that exporting
392*6777b538SAndroid Build Coastguard Workertemplates is not necessary anyway.  Since the complete definition of any
393*6777b538SAndroid Build Coastguard Workertemplate is available in the header files, anyone importing the DLL will just
394*6777b538SAndroid Build Coastguard Workerend up compiling instances of the templates into their own binary.  The
395*6777b538SAndroid Build Coastguard WorkerProtocol Buffer implementation does not rely on static template members being
396*6777b538SAndroid Build Coastguard Workerunique, so there should be no problem with this, but MSVC prints warning
397*6777b538SAndroid Build Coastguard Workernevertheless.  So, we disable it.  Unfortunately, this warning will also be
398*6777b538SAndroid Build Coastguard Workerproduced when compiling code which merely uses protocol buffers, meaning you
399*6777b538SAndroid Build Coastguard Workermay have to disable it in your code too.
400