xref: /aosp_15_r20/external/googletest/docs/quickstart-cmake.md (revision 481dde660366d6f317d242b6974ef1b20adb843c)
1*481dde66SAndroid Build Coastguard Worker# Quickstart: Building with CMake
2*481dde66SAndroid Build Coastguard Worker
3*481dde66SAndroid Build Coastguard WorkerThis tutorial aims to get you up and running with GoogleTest using CMake. If
4*481dde66SAndroid Build Coastguard Workeryou're using GoogleTest for the first time or need a refresher, we recommend
5*481dde66SAndroid Build Coastguard Workerthis tutorial as a starting point. If your project uses Bazel, see the
6*481dde66SAndroid Build Coastguard Worker[Quickstart for Bazel](quickstart-bazel.md) instead.
7*481dde66SAndroid Build Coastguard Worker
8*481dde66SAndroid Build Coastguard Worker## Prerequisites
9*481dde66SAndroid Build Coastguard Worker
10*481dde66SAndroid Build Coastguard WorkerTo complete this tutorial, you'll need:
11*481dde66SAndroid Build Coastguard Worker
12*481dde66SAndroid Build Coastguard Worker*   A compatible operating system (e.g. Linux, macOS, Windows).
13*481dde66SAndroid Build Coastguard Worker*   A compatible C++ compiler that supports at least C++14.
14*481dde66SAndroid Build Coastguard Worker*   [CMake](https://cmake.org/) and a compatible build tool for building the
15*481dde66SAndroid Build Coastguard Worker    project.
16*481dde66SAndroid Build Coastguard Worker    *   Compatible build tools include
17*481dde66SAndroid Build Coastguard Worker        [Make](https://www.gnu.org/software/make/),
18*481dde66SAndroid Build Coastguard Worker        [Ninja](https://ninja-build.org/), and others - see
19*481dde66SAndroid Build Coastguard Worker        [CMake Generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html)
20*481dde66SAndroid Build Coastguard Worker        for more information.
21*481dde66SAndroid Build Coastguard Worker
22*481dde66SAndroid Build Coastguard WorkerSee [Supported Platforms](platforms.md) for more information about platforms
23*481dde66SAndroid Build Coastguard Workercompatible with GoogleTest.
24*481dde66SAndroid Build Coastguard Worker
25*481dde66SAndroid Build Coastguard WorkerIf you don't already have CMake installed, see the
26*481dde66SAndroid Build Coastguard Worker[CMake installation guide](https://cmake.org/install).
27*481dde66SAndroid Build Coastguard Worker
28*481dde66SAndroid Build Coastguard Worker{: .callout .note}
29*481dde66SAndroid Build Coastguard WorkerNote: The terminal commands in this tutorial show a Unix shell prompt, but the
30*481dde66SAndroid Build Coastguard Workercommands work on the Windows command line as well.
31*481dde66SAndroid Build Coastguard Worker
32*481dde66SAndroid Build Coastguard Worker## Set up a project
33*481dde66SAndroid Build Coastguard Worker
34*481dde66SAndroid Build Coastguard WorkerCMake uses a file named `CMakeLists.txt` to configure the build system for a
35*481dde66SAndroid Build Coastguard Workerproject. You'll use this file to set up your project and declare a dependency on
36*481dde66SAndroid Build Coastguard WorkerGoogleTest.
37*481dde66SAndroid Build Coastguard Worker
38*481dde66SAndroid Build Coastguard WorkerFirst, create a directory for your project:
39*481dde66SAndroid Build Coastguard Worker
40*481dde66SAndroid Build Coastguard Worker```
41*481dde66SAndroid Build Coastguard Worker$ mkdir my_project && cd my_project
42*481dde66SAndroid Build Coastguard Worker```
43*481dde66SAndroid Build Coastguard Worker
44*481dde66SAndroid Build Coastguard WorkerNext, you'll create the `CMakeLists.txt` file and declare a dependency on
45*481dde66SAndroid Build Coastguard WorkerGoogleTest. There are many ways to express dependencies in the CMake ecosystem;
46*481dde66SAndroid Build Coastguard Workerin this quickstart, you'll use the
47*481dde66SAndroid Build Coastguard Worker[`FetchContent` CMake module](https://cmake.org/cmake/help/latest/module/FetchContent.html).
48*481dde66SAndroid Build Coastguard WorkerTo do this, in your project directory (`my_project`), create a file named
49*481dde66SAndroid Build Coastguard Worker`CMakeLists.txt` with the following contents:
50*481dde66SAndroid Build Coastguard Worker
51*481dde66SAndroid Build Coastguard Worker```cmake
52*481dde66SAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.14)
53*481dde66SAndroid Build Coastguard Workerproject(my_project)
54*481dde66SAndroid Build Coastguard Worker
55*481dde66SAndroid Build Coastguard Worker# GoogleTest requires at least C++14
56*481dde66SAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD 14)
57*481dde66SAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD_REQUIRED ON)
58*481dde66SAndroid Build Coastguard Worker
59*481dde66SAndroid Build Coastguard Workerinclude(FetchContent)
60*481dde66SAndroid Build Coastguard WorkerFetchContent_Declare(
61*481dde66SAndroid Build Coastguard Worker  googletest
62*481dde66SAndroid Build Coastguard Worker  URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
63*481dde66SAndroid Build Coastguard Worker)
64*481dde66SAndroid Build Coastguard Worker# For Windows: Prevent overriding the parent project's compiler/linker settings
65*481dde66SAndroid Build Coastguard Workerset(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
66*481dde66SAndroid Build Coastguard WorkerFetchContent_MakeAvailable(googletest)
67*481dde66SAndroid Build Coastguard Worker```
68*481dde66SAndroid Build Coastguard Worker
69*481dde66SAndroid Build Coastguard WorkerThe above configuration declares a dependency on GoogleTest which is downloaded
70*481dde66SAndroid Build Coastguard Workerfrom GitHub. In the above example, `03597a01ee50ed33e9dfd640b249b4be3799d395` is
71*481dde66SAndroid Build Coastguard Workerthe Git commit hash of the GoogleTest version to use; we recommend updating the
72*481dde66SAndroid Build Coastguard Workerhash often to point to the latest version.
73*481dde66SAndroid Build Coastguard Worker
74*481dde66SAndroid Build Coastguard WorkerFor more information about how to create `CMakeLists.txt` files, see the
75*481dde66SAndroid Build Coastguard Worker[CMake Tutorial](https://cmake.org/cmake/help/latest/guide/tutorial/index.html).
76*481dde66SAndroid Build Coastguard Worker
77*481dde66SAndroid Build Coastguard Worker## Create and run a binary
78*481dde66SAndroid Build Coastguard Worker
79*481dde66SAndroid Build Coastguard WorkerWith GoogleTest declared as a dependency, you can use GoogleTest code within
80*481dde66SAndroid Build Coastguard Workeryour own project.
81*481dde66SAndroid Build Coastguard Worker
82*481dde66SAndroid Build Coastguard WorkerAs an example, create a file named `hello_test.cc` in your `my_project`
83*481dde66SAndroid Build Coastguard Workerdirectory with the following contents:
84*481dde66SAndroid Build Coastguard Worker
85*481dde66SAndroid Build Coastguard Worker```cpp
86*481dde66SAndroid Build Coastguard Worker#include <gtest/gtest.h>
87*481dde66SAndroid Build Coastguard Worker
88*481dde66SAndroid Build Coastguard Worker// Demonstrate some basic assertions.
89*481dde66SAndroid Build Coastguard WorkerTEST(HelloTest, BasicAssertions) {
90*481dde66SAndroid Build Coastguard Worker  // Expect two strings not to be equal.
91*481dde66SAndroid Build Coastguard Worker  EXPECT_STRNE("hello", "world");
92*481dde66SAndroid Build Coastguard Worker  // Expect equality.
93*481dde66SAndroid Build Coastguard Worker  EXPECT_EQ(7 * 6, 42);
94*481dde66SAndroid Build Coastguard Worker}
95*481dde66SAndroid Build Coastguard Worker```
96*481dde66SAndroid Build Coastguard Worker
97*481dde66SAndroid Build Coastguard WorkerGoogleTest provides [assertions](primer.md#assertions) that you use to test the
98*481dde66SAndroid Build Coastguard Workerbehavior of your code. The above sample includes the main GoogleTest header file
99*481dde66SAndroid Build Coastguard Workerand demonstrates some basic assertions.
100*481dde66SAndroid Build Coastguard Worker
101*481dde66SAndroid Build Coastguard WorkerTo build the code, add the following to the end of your `CMakeLists.txt` file:
102*481dde66SAndroid Build Coastguard Worker
103*481dde66SAndroid Build Coastguard Worker```cmake
104*481dde66SAndroid Build Coastguard Workerenable_testing()
105*481dde66SAndroid Build Coastguard Worker
106*481dde66SAndroid Build Coastguard Workeradd_executable(
107*481dde66SAndroid Build Coastguard Worker  hello_test
108*481dde66SAndroid Build Coastguard Worker  hello_test.cc
109*481dde66SAndroid Build Coastguard Worker)
110*481dde66SAndroid Build Coastguard Workertarget_link_libraries(
111*481dde66SAndroid Build Coastguard Worker  hello_test
112*481dde66SAndroid Build Coastguard Worker  GTest::gtest_main
113*481dde66SAndroid Build Coastguard Worker)
114*481dde66SAndroid Build Coastguard Worker
115*481dde66SAndroid Build Coastguard Workerinclude(GoogleTest)
116*481dde66SAndroid Build Coastguard Workergtest_discover_tests(hello_test)
117*481dde66SAndroid Build Coastguard Worker```
118*481dde66SAndroid Build Coastguard Worker
119*481dde66SAndroid Build Coastguard WorkerThe above configuration enables testing in CMake, declares the C++ test binary
120*481dde66SAndroid Build Coastguard Workeryou want to build (`hello_test`), and links it to GoogleTest (`gtest_main`). The
121*481dde66SAndroid Build Coastguard Workerlast two lines enable CMake's test runner to discover the tests included in the
122*481dde66SAndroid Build Coastguard Workerbinary, using the
123*481dde66SAndroid Build Coastguard Worker[`GoogleTest` CMake module](https://cmake.org/cmake/help/git-stage/module/GoogleTest.html).
124*481dde66SAndroid Build Coastguard Worker
125*481dde66SAndroid Build Coastguard WorkerNow you can build and run your test:
126*481dde66SAndroid Build Coastguard Worker
127*481dde66SAndroid Build Coastguard Worker<pre>
128*481dde66SAndroid Build Coastguard Worker<strong>my_project$ cmake -S . -B build</strong>
129*481dde66SAndroid Build Coastguard Worker-- The C compiler identification is GNU 10.2.1
130*481dde66SAndroid Build Coastguard Worker-- The CXX compiler identification is GNU 10.2.1
131*481dde66SAndroid Build Coastguard Worker...
132*481dde66SAndroid Build Coastguard Worker-- Build files have been written to: .../my_project/build
133*481dde66SAndroid Build Coastguard Worker
134*481dde66SAndroid Build Coastguard Worker<strong>my_project$ cmake --build build</strong>
135*481dde66SAndroid Build Coastguard WorkerScanning dependencies of target gtest
136*481dde66SAndroid Build Coastguard Worker...
137*481dde66SAndroid Build Coastguard Worker[100%] Built target gmock_main
138*481dde66SAndroid Build Coastguard Worker
139*481dde66SAndroid Build Coastguard Worker<strong>my_project$ cd build && ctest</strong>
140*481dde66SAndroid Build Coastguard WorkerTest project .../my_project/build
141*481dde66SAndroid Build Coastguard Worker    Start 1: HelloTest.BasicAssertions
142*481dde66SAndroid Build Coastguard Worker1/1 Test #1: HelloTest.BasicAssertions ........   Passed    0.00 sec
143*481dde66SAndroid Build Coastguard Worker
144*481dde66SAndroid Build Coastguard Worker100% tests passed, 0 tests failed out of 1
145*481dde66SAndroid Build Coastguard Worker
146*481dde66SAndroid Build Coastguard WorkerTotal Test time (real) =   0.01 sec
147*481dde66SAndroid Build Coastguard Worker</pre>
148*481dde66SAndroid Build Coastguard Worker
149*481dde66SAndroid Build Coastguard WorkerCongratulations! You've successfully built and run a test binary using
150*481dde66SAndroid Build Coastguard WorkerGoogleTest.
151*481dde66SAndroid Build Coastguard Worker
152*481dde66SAndroid Build Coastguard Worker## Next steps
153*481dde66SAndroid Build Coastguard Worker
154*481dde66SAndroid Build Coastguard Worker*   [Check out the Primer](primer.md) to start learning how to write simple
155*481dde66SAndroid Build Coastguard Worker    tests.
156*481dde66SAndroid Build Coastguard Worker*   [See the code samples](samples.md) for more examples showing how to use a
157*481dde66SAndroid Build Coastguard Worker    variety of GoogleTest features.
158