parent
32ad3c8c36
commit
d4e3b8cedf
2 changed files with 158 additions and 0 deletions
@ -0,0 +1,156 @@ |
||||
# Quickstart: Building with CMake |
||||
|
||||
This tutorial aims to get you up and running with GoogleTest using CMake. If |
||||
you're using GoogleTest for the first time or need a refresher, we recommend |
||||
this tutorial as a starting point. If your project uses Bazel, see the |
||||
[Quickstart for Bazel](quickstart-bazel.md) instead. |
||||
|
||||
## Prerequisites |
||||
|
||||
To complete this tutorial, you'll need: |
||||
|
||||
* A compatible operating system (e.g. Linux, macOS, Windows). |
||||
* A compatible C++ compiler that supports at least C++11. |
||||
* [CMake](https://cmake.org/) and a compatible build tool for building the |
||||
project. |
||||
* Compatible build tools include |
||||
[Make](https://www.gnu.org/software/make/), |
||||
[Ninja](https://ninja-build.org/), and others - see |
||||
[CMake Generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html) |
||||
for more information. |
||||
|
||||
See [Supported Platforms](platforms.md) for more information about platforms |
||||
compatible with GoogleTest. |
||||
|
||||
If you don't already have CMake installed, see the |
||||
[CMake installation guide](https://cmake.org/install). |
||||
|
||||
{: .callout .note} |
||||
Note: The terminal commands in this tutorial show a Unix shell prompt, but the |
||||
commands work on the Windows command line as well. |
||||
|
||||
## Set up a project |
||||
|
||||
CMake uses a file named `CMakeLists.txt` to configure the build system for a |
||||
project. You'll use this file to set up your project and declare a dependency on |
||||
GoogleTest. |
||||
|
||||
First, create a directory for your project: |
||||
|
||||
``` |
||||
$ mkdir my_project && cd my_project |
||||
``` |
||||
|
||||
Next, you'll create the `CMakeLists.txt` file and declare a dependency on |
||||
GoogleTest. There are many ways to express dependencies in the CMake ecosystem; |
||||
in this quickstart, you'll use the |
||||
[`FetchContent` CMake module](https://cmake.org/cmake/help/latest/module/FetchContent.html). |
||||
To do this, in your project directory (`my_project`), create a file named |
||||
`CMakeLists.txt` with the following contents: |
||||
|
||||
```cmake |
||||
cmake_minimum_required(VERSION 3.14) |
||||
project(my_project) |
||||
|
||||
# GoogleTest requires at least C++11 |
||||
set(CMAKE_CXX_STANDARD 11) |
||||
|
||||
include(FetchContent) |
||||
FetchContent_Declare( |
||||
googletest |
||||
URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip |
||||
) |
||||
# For Windows: Prevent overriding the parent project's compiler/linker settings |
||||
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) |
||||
FetchContent_MakeAvailable(googletest) |
||||
``` |
||||
|
||||
The above configuration declares a dependency on GoogleTest which is downloaded |
||||
from GitHub. In the above example, `609281088cfefc76f9d0ce82e1ff6c30cc3591e5` is |
||||
the Git commit hash of the GoogleTest version to use; we recommend updating the |
||||
hash often to point to the latest version. |
||||
|
||||
For more information about how to create `CMakeLists.txt` files, see the |
||||
[CMake Tutorial](https://cmake.org/cmake/help/latest/guide/tutorial/index.html). |
||||
|
||||
## Create and run a binary |
||||
|
||||
With GoogleTest declared as a dependency, you can use GoogleTest code within |
||||
your own project. |
||||
|
||||
As an example, create a file named `hello_test.cc` in your `my_project` |
||||
directory with the following contents: |
||||
|
||||
```cpp |
||||
#include <gtest/gtest.h> |
||||
|
||||
// Demonstrate some basic assertions. |
||||
TEST(HelloTest, BasicAssertions) { |
||||
// Expect two strings not to be equal. |
||||
EXPECT_STRNE("hello", "world"); |
||||
// Expect equality. |
||||
EXPECT_EQ(7 * 6, 42); |
||||
} |
||||
``` |
||||
|
||||
GoogleTest provides [assertions](primer.md#assertions) that you use to test the |
||||
behavior of your code. The above sample includes the main GoogleTest header file |
||||
and demonstrates some basic assertions. |
||||
|
||||
To build the code, add the following to the end of your `CMakeLists.txt` file: |
||||
|
||||
```cmake |
||||
enable_testing() |
||||
|
||||
add_executable( |
||||
hello_test |
||||
hello_test.cc |
||||
) |
||||
target_link_libraries( |
||||
hello_test |
||||
gtest_main |
||||
) |
||||
|
||||
include(GoogleTest) |
||||
gtest_discover_tests(hello_test) |
||||
``` |
||||
|
||||
The above configuration enables testing in CMake, declares the C++ test binary |
||||
you want to build (`hello_test`), and links it to GoogleTest (`gtest_main`). The |
||||
last two lines enable CMake's test runner to discover the tests included in the |
||||
binary, using the |
||||
[`GoogleTest` CMake module](https://cmake.org/cmake/help/git-stage/module/GoogleTest.html). |
||||
|
||||
Now you can build and run your test: |
||||
|
||||
<pre> |
||||
<strong>my_project$ cmake -S . -B build</strong> |
||||
-- The C compiler identification is GNU 10.2.1 |
||||
-- The CXX compiler identification is GNU 10.2.1 |
||||
... |
||||
-- Build files have been written to: .../my_project/build |
||||
|
||||
<strong>my_project$ cmake --build build</strong> |
||||
Scanning dependencies of target gtest |
||||
... |
||||
[100%] Built target gmock_main |
||||
|
||||
<strong>my_project$ cd build && ctest</strong> |
||||
Test project .../my_project/build |
||||
Start 1: HelloTest.BasicAssertions |
||||
1/1 Test #1: HelloTest.BasicAssertions ........ Passed 0.00 sec |
||||
|
||||
100% tests passed, 0 tests failed out of 1 |
||||
|
||||
Total Test time (real) = 0.01 sec |
||||
</pre> |
||||
|
||||
Congratulations! You've successfully built and run a test binary using |
||||
GoogleTest. |
||||
|
||||
## Next steps |
||||
|
||||
* [Check out the Primer](primer.md) to start learning how to write simple |
||||
tests. |
||||
* [See the code samples](samples.md) for more examples showing how to use a |
||||
variety of GoogleTest features. |
Loading…
Reference in new issue