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