# Awesome CMake

> A curated list of awesome CMake scripts, modules, examples and others

Your contributions are highly welcome (first see CONTRIBUTING.md).

There is another file `NonModernCMake.md` with other links worth taking a look, but they use obsolete practices which are considered non-modern - like not using `target_*`-based dependency management - see `#16` and `#42` for more details.

## Contents

- Community
- Resources
- Package Management / Build Systems
- Modules
- Utility Scripts
- Toolchains
- Examples / Templates
- Other

## Community

- `#cmake` on Freenode
- `/r/cmake` on Reddit
- `/r/cpp` on Reddit
- Official Discourse Forum
- Stack Overflow

## Resources

- Latest Documentation
- FAQ
- Wiki
- Webinars
- Web Book - CGold: The Hitchhiker’s Guide to the CMake. `[BSD2]`
- Modern CMake - Modern CMake PDF and samples by the creator of cmakepp. `[MIT]`
- Tutorial - Modern CMake tutorials part1: CMake basics
- Article - Easily supporting CMake install and find_package().
- Article - Easy dependency management for C++ with CMake and Git.
- Article - Opt-in header-only libraries with CMake.
- Article - Ultimate Guide to Modern CMake.
- Article - A list of common CMake antipatterns (from 2013 but still relevant).
- Article - How to Build a CMake-Based Project.
- Article - Learn CMake’s Scripting Language in 15 Minutes.
- Article - The architecture of CMake.
- Lecture - Effective CMake - by Daniel Pfeifer, C++Now 2017.
- Article - Building Cross-Platform CUDA Applications with CMake.
- Tutorial - A step-by-step guide for understanding CMake.
- Article + Lecture - Embracing Modern CMake - by Stephen Kelly.
- Lecture - Modern CMake for Modular Design - by Mathieu Ropert, CppCon 2017.
- Article - It’s Time To Do CMake Right (one of the best articles about CMake).
- Articles - A series on CMake - by Martin Hořeňovský
  - Basic CMake usage.
  - Basic CMake, part 2: libraries.
- Lecture - Introduction to CMake - by Florent Castelli, C++ Sweden 2018.
- Article - Some nice and accurate CMake tips.
- Article - Modern CMake for Library Developers.
- Article - Effective Modern CMake: a great summary of most good practices - by Manuel Binna.
- Book - Professional CMake: A Practical Guide (paid).
- Book - Effective CMake: Practical Advice to Write Better CMake (not fully written yet).
- Web Book - An Introduction to Modern CMake.
- YouTube Series - How to CMake Good. `[CC0-1.0]`
- Lecture - More Modern CMake (slides & examples)- by Deniz Bahadir, Meeting C++ 2018.
- Lecture - Oh No! More Modern CMake (slides)- by Deniz Bahadir, Meeting C++ 2019.
- Article - Modifying the default CMake build types/flags, toolchains and patches - Oh my! - by Cristian Adam.
- Tutorial - Tutorial and Example on How to Properly Use Modern CMake.

## Package Management / Build Systems

- hunter - Cross-platform package manager for C++ (based on CMake ExternalProject). `[BSD2]`
- cget - CMake package retrieval. This can be used to download and install CMake packages. `[BOOST]`
- cppan - C++ Archive Network - C++ Package Manager based on CMake, implemented in C++14. `[APACHE2]`
- cpm - C++ Package Manager based on CMake and Git. `[MIT]`
- conan - Conan C++ Package Manager, implemented in Python and has a CMake integration backend. `[MIT]`
- fips - High-level build system/dependency management for distributed, multi-platform C/C++ projects. `[MIT]`
- Ninja - Build system that differs from others in two major respects: it is designed to have its input files generated by a higher-level build system (like CMake), and it is designed to run builds as fast as possible. `[APACHE2]`
- vcpkg - A tool to acquire and build C++ open source libraries. Uses CMake internally as a build script language. `[MIT]`
- pmm - PMM is a module for CMake that manages… package managers. `[MIT]`
- cpm - A setup-free CMake + git dependency manager. `[MIT]`

## Modules

- cmake-modules - Ryan Pavlik’s collection of CMake modules. There are a number of find modules, especially for virtual reality and physical simulation, some utility modules, and some patches or workarounds for CMake itself. `[BOOST]`
- cmake-modules - This is a collection of additional CMake modules. Most of them are from Ryan Pavlik. `[BOOST]`
- CMake - Eyescale’s common CMake modules. `[BSD3]`
- cmake-modules - CMake modules for some scientific libraries. `[BSD2]`
- cgcmake - CMake modules for common applications related to computer graphics. `[MIT]`
- FindMathematica - CMake module for Mathematica. `[MIT]`
- extra-cmake-modules - KDE’s extra modules and scripts for CMake. `[BSD3]`
- FindICU.cmake - CMake module to find International Components for Unicode (ICU) Library. `[BSD2]`
- FindTBB - CMake find module for Intel Threading Building Blocks. `[MIT]`
- FindWiX - CMake module for building Windows Installer packages with WiX toolset. `[BSD3]`
- FindIDL - CMake module for building IDL files with MIDL and generating CLR DLL using Tlbimp. `[MIT]`
- cmake-modules - hanjianwei’s CMake module collection. `[MIT]`
- YCM - Extra CMake Modules for Yet Another Robot Platform and friends. `[BSD3]`
- CMakeCM - CMake Community Modules. `[NO LICENSE]`
- Metabench - CMake module for compile-time microbenchmarks. `[BOOST]`
- Oranges - Ben Vining’s library of CMake modules and toolchains `[GPL]`

## Utility Scripts

These provide a wide range of functionality - from dealing with compiler flags to using tools. Some also contain modules.

- cotire - Cotire (compile time reducer) is a CMake module that speeds up the build process of CMake based build systems by fully automating techniques as precompiled headers and unity builds for C and C++. `[MIT]`
- ucm - For managing compiler/linker flags, collecting sources, precompiled headers, unity builds and others. `[MIT]`
- cmakepp - Enhancement Suite for the CMake Build System. `[MIT]`
- sugar - CMake tools and examples: collecting source files, warnings suppression, etc. `[BSD2]`
- DownloadProject - CMake module for downloading an external project’s source at configure time. `[MIT]`
- buildem - Modular CMake-based system that leverages ExternalProject to simplify builds. `[LICENSE]`
- coveralls-cmake - Coveralls JSON coverage generator and uploader for CMake. `[MIT]`
- compatibility - Improved version of cmake-compile-features. `[LICENSE]`
- cmake-modules - LibFindMacros development repository and other cool CMake stuff. `[LICENSE]`
- GreatCMakeCookOff - This is a repository of useful and less than useful CMake recipes. `[MIT]`
- cppcheck-target-cmake - Per-target CPPCheck for CMake. `[MIT]`
- clang-tidy-target-cmake - Add clang-tidy checks to a target using CMake. `[MIT]`
- cmake-unit - Unit testing framework for CMake. `[MIT]`
- cmake-header-language - CMake macro to determine the language of a header file. `[MIT]`
- tooling-cmake-util - Utility and common library for all polysquare CMake tools. `[MIT]`
- iwyu-target-cmake - CMake integration for include-what-you-use. `[MIT]`
- sanitizers-cmake - CMake module to enable sanitizers for binary targets. `[MIT]`
- cmake-precompiled-header - Visual Studio and GCC precompiled header macro. `[LICENSE]`
- CMakePCHCompiler - CMake precompiled headers via custom compiler extension - with reuse support! `[MIT]`
- CMake-codecov - Enables code coverage and generates coverage reports with CMake targets. `[GPL]`
- cmake-get - Get dependencies in config or script mode. `[NO LICENSE]`
- ixm - Make CMake less painful when trying to write Modern Flexible CMake. `[MIT]`
- CMakeCooking - Flexible development environments for CMake projects with external dependencies . `[APACHE2]`

## Toolchains

- dockcross - Cross compiling toolchains in Docker images. `[MIT]`
- android-cmake - CMake toolchain file and other scripts for the Android NDK. `[BSD3]`
- ios-cmake - Toolchain file and examples using CMake for iOS development. `[BSD3]`
- qt-android-cmake - For building and deploying Qt based apps on Android without QtCreator. `[LICENSE]`
- mingw-w64-cmake - CMake-based MinGW-w64 Cross Toolchain - to build Windows binaries of mpv. `[ISC]`
- cmake-avr - CMake toolchain for AVR. `[LICENSE]`
- arduino-cmake - This is the CMake project settings for the Arduino platform. `[MPL]`
- polly - Collection of CMake toolchain files and scripts for cross-platform build and CI testing. `[BSD2]`
- toolchains - For cross-compiling with CMake. They are meant to be mainly used on ArchLinux. `[NO LICENSE]`
- cmake - Collection of CMake toolchain files, mostly for static linking. `[APACHE2]`
- Arduino-CMake-Toolchain - CMake toolchain for all official and 3rd party Arduino platforms. `[MIT]`

## Examples / Templates

- cmake-init - Template for reliable, cross-platform C++ project setup using CMake. `[LICENSE]`
- android-cmake - Examples of using ruslo/hunter package manager for an Android application. `[BSD2]`
- hunter-simple - Example of downloading/installing dependencies using ruslo/hunter package manager. `[BSD2]`
- package-example - Config mode of find_package (examples for this Stack Overflow question). `[NO LICENSE]`
- minimal_cmake_example - Minimal CMake example, that covers dependencies and packaging. `[CC0-1.0]`
- cmake-example - Example project which demonstrates various CMake features. `[BSD3]`
- cmake-examples - Useful CMake examples in a tutorial format. `[MIT]`
- mini-cmake-qt - Minimal CMake template for Qt 5 projects. `[LICENSE]`
- BASIS - CMake BASIS makes it easy to create sharable software and libraries that work together. `[BSD2]`
- cpp-boilerplate - Template that aims to be a reference for modern CMake and CI. `[MIT]`
- how-to-export-cpp-library - An OS-agnostic template project for exporting either shared, static or header-only C++ library, sporting ctest and CI support, written in plain CMake with line-by-line tutorial comments. `[MIT]`
- modern-cmake-sample - Best practices and proper usage of CMake by using targets. `[NO LICENSE]`
- CMakeInstallExample - Installation example for a C++ project (Windows) with Cmake. `[NO LICENSE]`
- cpp14-project-template - A C++14 template with CI, tests, code coverage, docs and static analysis integration. `[CC0-1.0]`
- cmake_templates - Templates for creating C++ libraries and executables (including conan). `[NO LICENSE]`
- cmake_snippets - Short copy-pasteable CMake snippets. `[BSD3]`
- cmake-cookbook - A huge CMake cookbook full of recipes. `[MIT]`
- cpp-template - A template C++ repository, using CMake and Catch. `[NO LICENSE]`
- pitchfork - A set of conventions for native C and C++ projects. `[MIT]`
- cmake-examples - A collection of as simple as possible, modern CMake projects. `[MIT]`
- cpp-project - Boiler plate for C++ projects - tests, CI, coverage, docs. `[UNLICENSE]`
- ModernCppStarter - A template for modern C++ projects using CMake, CI, code coverage, clang-format, reproducible dependency management, tests using doctest and much more. `[UNLICENSE]`

## Other

- autocmake - Using a autocmake.yml file Autocmake composes CMake building blocks into a CMake project and generates CMakeLists.txt as well as a setup script, which serves as a front-end to CMakeLists.txt. `[BSD3]`
- UseLATEX - Collection of CMake macros to simplify building LaTeX files. `[BSD3]`
- scikit-build - Improved build system generator for CPython C extensions. `[MIT]`
- node-cmake - CMake-based build system for node.js native modules. `[ISC]`
- cmake-font-lock - Advanced syntax coloring support for CMake scripts inside Emacs. `[GPL]`
- autovala - Program that automatically generates CMake configuration files for your Vala project. `[GPL]`
- catkin - CMake-based build system that is used to build all packages in Robot Operating System (ROS). `[BSD3]`
- suitesparse-metis-for-windows - CMake scripts for painless usage of SuiteSparse+METIS. `[BSD3]`
- osg-3rdparty-cmake - CMake scripts for building OpenSceneGraph third party libraries. `[MIXED LICENSE]`
- cmake-d - CMake for D2. `[MIT]`
- cmakeprojectmanager2 - Enhanced CMake Project Manager plugin for Qt Creator. `[NO LICENSE]`
- cmake-lint - Check for coding style issues in CMake files. cmakelint requires Python. `[APACHE2]`
- git-cmake-format - Integrate clang-format into your CMake project hosted in a git repository. `[LICENSE]`
- configure-cmake - configure-cmake is an autotools-style configure script for CMake-based projects. `[CC0-1.0]`
- cmake-ast - Python module to reduce a CMake file to an AST. `[MIT]`
- cmake-checks-cache - CMake checks cache helper modules. `[MIT]`
- cmake_check - Static analysis (linter) for the CMake language (e.g. to enforce modern CMake rules). `[MIT]`
- cmake-language-server - CMake Language Server Protocol Implementation. `[MIT]`
- cmake-maven-plugin - CMake integration for Maven builds. `[APACHE2]`
- version-from-git - Bake git information into your binary. `[MIT]`

## License

This is released under the `Creative Commons Attribution 4.0 International` License `(CC BY 4.0)`.