blob: 5abe50441294bd3183c3d1d9f1934f7fea03f88f [file] [log] [blame] [view]
Abseil Teamd4e3b8c2021-03-22 16:39:46 -07001# Quickstart: Building with CMake
2
3This tutorial aims to get you up and running with GoogleTest using CMake. If
4you're using GoogleTest for the first time or need a refresher, we recommend
5this tutorial as a starting point. If your project uses Bazel, see the
6[Quickstart for Bazel](quickstart-bazel.md) instead.
7
8## Prerequisites
9
10To complete this tutorial, you'll need:
11
12* A compatible operating system (e.g. Linux, macOS, Windows).
Derek Mauro96f51422022-06-30 09:53:12 -070013* A compatible C++ compiler that supports at least C++14.
Abseil Teamd4e3b8c2021-03-22 16:39:46 -070014* [CMake](https://cmake.org/) and a compatible build tool for building the
15 project.
16 * Compatible build tools include
17 [Make](https://www.gnu.org/software/make/),
18 [Ninja](https://ninja-build.org/), and others - see
19 [CMake Generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html)
20 for more information.
21
22See [Supported Platforms](platforms.md) for more information about platforms
23compatible with GoogleTest.
24
25If you don't already have CMake installed, see the
26[CMake installation guide](https://cmake.org/install).
27
28{: .callout .note}
29Note: The terminal commands in this tutorial show a Unix shell prompt, but the
30commands work on the Windows command line as well.
31
32## Set up a project
33
34CMake uses a file named `CMakeLists.txt` to configure the build system for a
35project. You'll use this file to set up your project and declare a dependency on
36GoogleTest.
37
38First, create a directory for your project:
39
40```
41$ mkdir my_project && cd my_project
42```
43
44Next, you'll create the `CMakeLists.txt` file and declare a dependency on
45GoogleTest. There are many ways to express dependencies in the CMake ecosystem;
46in this quickstart, you'll use the
47[`FetchContent` CMake module](https://cmake.org/cmake/help/latest/module/FetchContent.html).
48To do this, in your project directory (`my_project`), create a file named
49`CMakeLists.txt` with the following contents:
50
51```cmake
52cmake_minimum_required(VERSION 3.14)
53project(my_project)
54
Derek Mauro96f51422022-06-30 09:53:12 -070055# GoogleTest requires at least C++14
56set(CMAKE_CXX_STANDARD 14)
Abseil Teamd4e3b8c2021-03-22 16:39:46 -070057
58include(FetchContent)
59FetchContent_Declare(
60 googletest
Dino Radakovic90171d12022-10-25 06:28:58 -070061 URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
Abseil Teamd4e3b8c2021-03-22 16:39:46 -070062)
63# For Windows: Prevent overriding the parent project's compiler/linker settings
64set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
65FetchContent_MakeAvailable(googletest)
66```
67
68The above configuration declares a dependency on GoogleTest which is downloaded
Dino Radakovic90171d12022-10-25 06:28:58 -070069from GitHub. In the above example, `03597a01ee50ed33e9dfd640b249b4be3799d395` is
Abseil Teamd4e3b8c2021-03-22 16:39:46 -070070the Git commit hash of the GoogleTest version to use; we recommend updating the
71hash often to point to the latest version.
72
73For more information about how to create `CMakeLists.txt` files, see the
74[CMake Tutorial](https://cmake.org/cmake/help/latest/guide/tutorial/index.html).
75
76## Create and run a binary
77
78With GoogleTest declared as a dependency, you can use GoogleTest code within
79your own project.
80
81As an example, create a file named `hello_test.cc` in your `my_project`
82directory with the following contents:
83
84```cpp
85#include <gtest/gtest.h>
86
87// Demonstrate some basic assertions.
88TEST(HelloTest, BasicAssertions) {
89 // Expect two strings not to be equal.
90 EXPECT_STRNE("hello", "world");
91 // Expect equality.
92 EXPECT_EQ(7 * 6, 42);
93}
94```
95
96GoogleTest provides [assertions](primer.md#assertions) that you use to test the
97behavior of your code. The above sample includes the main GoogleTest header file
98and demonstrates some basic assertions.
99
100To build the code, add the following to the end of your `CMakeLists.txt` file:
101
102```cmake
103enable_testing()
104
105add_executable(
106 hello_test
107 hello_test.cc
108)
109target_link_libraries(
110 hello_test
Alecto Irene Perez7da4a412022-03-26 21:52:05 -0600111 GTest::gtest_main
Abseil Teamd4e3b8c2021-03-22 16:39:46 -0700112)
113
114include(GoogleTest)
115gtest_discover_tests(hello_test)
116```
117
118The above configuration enables testing in CMake, declares the C++ test binary
119you want to build (`hello_test`), and links it to GoogleTest (`gtest_main`). The
120last two lines enable CMake's test runner to discover the tests included in the
121binary, using the
122[`GoogleTest` CMake module](https://cmake.org/cmake/help/git-stage/module/GoogleTest.html).
123
124Now you can build and run your test:
125
126<pre>
127<strong>my_project$ cmake -S . -B build</strong>
128-- The C compiler identification is GNU 10.2.1
129-- The CXX compiler identification is GNU 10.2.1
130...
131-- Build files have been written to: .../my_project/build
132
133<strong>my_project$ cmake --build build</strong>
134Scanning dependencies of target gtest
135...
136[100%] Built target gmock_main
137
138<strong>my_project$ cd build && ctest</strong>
139Test project .../my_project/build
140 Start 1: HelloTest.BasicAssertions
1411/1 Test #1: HelloTest.BasicAssertions ........ Passed 0.00 sec
142
143100% tests passed, 0 tests failed out of 1
144
145Total Test time (real) = 0.01 sec
146</pre>
147
148Congratulations! You've successfully built and run a test binary using
149GoogleTest.
150
151## Next steps
152
153* [Check out the Primer](primer.md) to start learning how to write simple
154 tests.
155* [See the code samples](samples.md) for more examples showing how to use a
156 variety of GoogleTest features.