mirror of
https://github.com/google/googletest.git
synced 2025-12-06 16:57:00 +08:00
docs/quickstart-cmake.md: add subsection for find_package and FetchContent + update gtest_force_shared_crt comments
This commit is contained in:
parent
79219e26e0
commit
2946125d8e
@ -42,10 +42,62 @@ $ mkdir my_project && cd my_project
|
|||||||
```
|
```
|
||||||
|
|
||||||
Next, you'll create the `CMakeLists.txt` file and declare a dependency on
|
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;
|
GoogleTest. There are many ways to express dependencies in the CMake ecosystem
|
||||||
in this quickstart, you'll use the
|
but the two most common methods are
|
||||||
[`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
|
1. Using the [`find_package`](https://cmake.org/cmake/help/latest/command/find_package.html)
|
||||||
|
command
|
||||||
|
2. Using the [`FetchContent`](https://cmake.org/cmake/help/latest/module/FetchContent.html)
|
||||||
|
CMake module
|
||||||
|
|
||||||
|
We will cover both methods in their [respective](#using-find_package)
|
||||||
|
[subsections](#using-FetchContent) as each has their
|
||||||
|
advantages and disadvantages.
|
||||||
|
|
||||||
|
### Using `find_package`
|
||||||
|
|
||||||
|
One very common scenario is when you would like to consume a
|
||||||
|
standalone GoogleTest installation, e.g. one built and installed from source
|
||||||
|
locally, or one provided by a system package manager (e.g. APT, etc. on
|
||||||
|
Debian-like systems). In this case,
|
||||||
|
[`find_package`](https://cmake.org/cmake/help/latest/command/find_package.html)
|
||||||
|
is the better fit.
|
||||||
|
|
||||||
|
We can write a simple `CMakeLists.txt` as follows, using `find_package` in
|
||||||
|
[config mode](https://cmake.org/cmake/help/latest/command/find_package.html#search-modes):
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
cmake_minimum_required(VERSION 3.14)
|
||||||
|
project(my_project)
|
||||||
|
|
||||||
|
# GoogleTest requires at least C++14
|
||||||
|
set(CMAKE_CXX_STANDARD 14)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
# Since CMake 3.20 CONFIG can be omitted as the FindGTest find module will
|
||||||
|
# prefer the upstream (provided by Google Test) GTestConfig.cmake is available
|
||||||
|
find_package(GTest 1.15.0 REQUIRED CONFIG)
|
||||||
|
```
|
||||||
|
|
||||||
|
A custom installation root can be specified using `GTEST_ROOT` as an environment
|
||||||
|
or CMake cache variable as mentioned in the
|
||||||
|
[`FindGTest` docs](https://cmake.org/cmake/help/latest/module/FindGTest.html#cache-variables).
|
||||||
|
|
||||||
|
### Using `FetchContent`
|
||||||
|
|
||||||
|
Another common scenario is when one wants to absolutely ensure all dependencies
|
||||||
|
use the same compile and link flags by building all of them from source with
|
||||||
|
the same settings used by the project. There may be additional requirements such
|
||||||
|
as allowing tracking of upstream changes as they flow into these dependencies'
|
||||||
|
source trees.
|
||||||
|
|
||||||
|
In this case
|
||||||
|
[`FetchContent`](https://cmake.org/cmake/help/latest/module/FetchContent.html)
|
||||||
|
is the tool of choice, allowing one to download a specific source checkout into
|
||||||
|
their project build tree and then build it as a vendored component within the
|
||||||
|
project.
|
||||||
|
|
||||||
|
So to do this, in your project directory (`my_project`), create a
|
||||||
`CMakeLists.txt` with the following contents:
|
`CMakeLists.txt` with the following contents:
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
@ -61,8 +113,13 @@ FetchContent_Declare(
|
|||||||
googletest
|
googletest
|
||||||
URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
|
URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
|
||||||
)
|
)
|
||||||
# For Windows: Prevent overriding the parent project's compiler/linker settings
|
# Windows: Ensure C runtime linkage uses CMake defaults (shared C runtime).
|
||||||
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
# This can be omitted if you would like to use Google Test's preference of
|
||||||
|
# linking against static C runtime for static Google Test builds, shared C
|
||||||
|
# runtime for shared Google Test library builds.
|
||||||
|
if(MSVC)
|
||||||
|
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
||||||
|
endif()
|
||||||
FetchContent_MakeAvailable(googletest)
|
FetchContent_MakeAvailable(googletest)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -103,14 +160,8 @@ To build the code, add the following to the end of your `CMakeLists.txt` file:
|
|||||||
```cmake
|
```cmake
|
||||||
enable_testing()
|
enable_testing()
|
||||||
|
|
||||||
add_executable(
|
add_executable(hello_test hello_test.cc)
|
||||||
hello_test
|
target_link_libraries(hello_test PRIVATE GTest::gtest_main)
|
||||||
hello_test.cc
|
|
||||||
)
|
|
||||||
target_link_libraries(
|
|
||||||
hello_test
|
|
||||||
GTest::gtest_main
|
|
||||||
)
|
|
||||||
|
|
||||||
include(GoogleTest)
|
include(GoogleTest)
|
||||||
gtest_discover_tests(hello_test)
|
gtest_discover_tests(hello_test)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user