This is an example of how to create a Modern CMake C++ Project using ExternalProject module to include dependency(ies) as subproject(s).
This project should run on Linux, Mac and Windows.
To complexify a little, the CMake project is composed of one executable (FooApp) with the following dependencies:
gflags:
glog: gflags
zlib:
protobuf: zlib
FooApp: gflags glog zlib protobuf
note 1: All dependencies are built in static to have one standalone executable FooApp
.
note 2: glog, zlib, protobuf need patches to be use as subproject.
Thus the project layout is as follow:
CMakeLists.txt // meta CMake doing the orchestration and python packaging
cmake
├── CMakeLists.txt
├── gflags.CMakeLists.txt
├── glog.CMakeLists.txt
├── zlib.CMakeLists.txt
├── protobuf.CMakeLists.txt
patches
├── glog.patch
├── zlib.patch
├── protobuf.patch
FooApp
├── CMakeLists.txt
└── src
└── main.cpp
To build the C++ project, as usual:
cmake -H. -Bbuild
cmake --build build
CTEST_OUTPUT_ON_FAILURE=1 cmake --build build --target test
Since we want to use the CMAKE_BINARY_DIR to generate the binary package.
We want this layout (tree build --prune -P "*.a|FooApp"):
build
├── gflags-build
│ └── libgflags_nothreads.a
├── glog-build
│ └── libglog.a
├── zlib-build
│ └── libz.a
├── protobuf-build
│ └── libprotobuf.a
└── FooApp
└── FooApp
The CONTRIBUTING.md file contains instructions on how to file the Contributor License Agreement before sending any pull requests (PRs). Of course, if you're new to the project, it's usually best to discuss any proposals and reach consensus before sending your first PR.
Apache 2. See the LICENSE file for details.
This is not an official Google product, it is just code that happens to be owned by Google.