| # Abseil CMake Build Instructions |
| |
| Abseil comes with a CMake build script ([CMakeLists.txt](../CMakeLists.txt)) |
| that can be used on a wide range of platforms ("C" stands for cross-platform.). |
| If you don't have CMake installed already, you can download it for free from |
| <http://www.cmake.org/>. |
| |
| CMake works by generating native makefiles or build projects that can |
| be used in the compiler environment of your choice. |
| |
| For API/ABI compatibility reasons, we strongly recommend building Abseil in a |
| subdirectory of your project or as an embedded dependency. |
| |
| ## Incorporating Abseil Into a CMake Project |
| |
| The recommendations below are similar to those for using CMake within the |
| googletest framework |
| (<https://github.com/google/googletest/blob/master/googletest/README.md#incorporating-into-an-existing-cmake-project>) |
| |
| ### Step-by-Step Instructions |
| |
| 1. If you want to build the Abseil tests, integrate the Abseil dependency |
| [Google Test](https://github.com/google/googletest) into your CMake project. To disable Abseil tests, you have to pass |
| `-DBUILD_TESTING=OFF` when configuring your project with CMake. |
| |
| 2. Download Abseil and copy it into a subdirectory in your CMake project or add |
| Abseil as a [git submodule](https://git-scm.com/docs/git-submodule) in your |
| CMake project. |
| |
| 3. You can then use the CMake command |
| [`add_subdirectory()`](https://cmake.org/cmake/help/latest/command/add_subdirectory.html) |
| to include Abseil directly in your CMake project. |
| |
| 4. Add the **absl::** target you wish to use to the |
| [`target_link_libraries()`](https://cmake.org/cmake/help/latest/command/target_link_libraries.html) |
| section of your executable or of your library.<br> |
| Here is a short CMakeLists.txt example of a project file using Abseil. |
| |
| ```cmake |
| cmake_minimum_required(VERSION 2.8.12) |
| project(my_project) |
| |
| set(CMAKE_CXX_FLAGS "-std=c++11 -stdlib=libc++ ${CMAKE_CXX_FLAGS}") |
| |
| if(MSVC) |
| # /wd4005 macro-redefinition |
| # /wd4068 unknown pragma |
| # /wd4244 conversion from 'type1' to 'type2' |
| # /wd4267 conversion from 'size_t' to 'type2' |
| # /wd4800 force value to bool 'true' or 'false' (performance warning) |
| add_compile_options(/wd4005 /wd4068 /wd4244 /wd4267 /wd4800) |
| add_definitions(/DNOMINMAX /DWIN32_LEAN_AND_MEAN=1 /D_CRT_SECURE_NO_WARNINGS) |
| endif() |
| |
| add_subdirectory(abseil-cpp) |
| |
| add_executable(my_exe source.cpp) |
| target_link_libraries(my_exe absl::base absl::synchronization absl::strings) |
| ``` |
| |
| ### Running Abseil Tests with CMake |
| |
| Use the `-DABSL_RUN_TESTS=ON` flag to run Abseil tests. Note that if the `-DBUILD_TESTING=OFF` flag is passed then Abseil tests will not be run. |
| |
| You will need to provide Abseil with a Googletest dependency. There are two |
| options for how to do this: |
| |
| * Use `-DABSL_USE_GOOGLETEST_HEAD`. This will automatically download the latest |
| Googletest source into the build directory at configure time. Googletest will |
| then be compiled directly alongside Abseil's tests. |
| * Manually integrate Googletest with your build. See |
| https://github.com/google/googletest/blob/master/googletest/README.md#using-cmake |
| for more information on using Googletest in a CMake project. |
| |
| For example, to run just the Abseil tests, you could use this script: |
| |
| ``` |
| cd path/to/abseil-cpp |
| mkdir build |
| cd build |
| cmake -DABSL_USE_GOOGLETEST_HEAD=ON -DABSL_RUN_TESTS=ON .. |
| make -j |
| ctest |
| ``` |
| |
| Currently, we only run our tests with CMake in a Linux environment, but we are |
| working on the rest of our supported platforms. See |
| https://github.com/abseil/abseil-cpp/projects/1 and |
| https://github.com/abseil/abseil-cpp/issues/109 for more information. |
| |
| ### Available Abseil CMake Public Targets |
| |
| Here's a non-exhaustive list of Abseil CMake public targets: |
| |
| ```cmake |
| absl::base |
| absl::algorithm |
| absl::container |
| absl::debugging |
| absl::memory |
| absl::meta |
| absl::numeric |
| absl::strings |
| absl::synchronization |
| absl::time |
| absl::utility |
| ``` |