Welcome to the next pikoTutorial !
FetchContent module tries to be the solution to never-ending discussion about the package management in C++ (I wrote a bit about it in one of the articles of Make C++ a better place series). It’s not a package manager by itself, but it integrates natively with CMake which the big part of C++ community uses anyway.
FetchContent promises also easy integration even with legacy project, especially given the fact that it doesn’t require any propriety format of the dependency, but re-uses what is already widely used – GitHub repositories and tar.gz archives stored in project-specific artifactories.
Dependency as a GitHub repository
Let’s say I want to add my command line parsing library as a dependency to a new project. I can use FetchContent to clone the repository:
cmake_minimum_required(VERSION 3.28)
project(FetchContentExample)
# include FetchContent module
include(FetchContent)
# fetch Comlint library
FetchContent_Declare(
# specify library name
ComlintCpp
# specify GitHub repository
GIT_REPOSITORY https://github.com/pasparsw/comlint_cpp
# specify tag or commit hash
GIT_TAG v0.3
)
# make the content available
FetchContent_MakeAvailable(ComlintCpp)
# add executable target
add_executable(${PROJECT_NAME} main.cpp)
# link the fetched library
target_link_libraries(${PROJECT_NAME} PRIVATE
ComlintCpp
)The repository is downloaded to build/_deps folder and sources are available in build/_deps/comlintcpp-src folder.
Dependency as a pre-built release package
Of course, in many projects building from source is out of question because of e.g. build time. Fortunately, FetchContent allows for downloading a tar.gz files from the given URL. Comlint comes in in a form of a release package containing public headers and .so dynamic library file, so let’s use it:
minimum_required(VERSION 3.28)
project(FetchContentExample)
# include FetchContent module
include(FetchContent)
# fetch ComlintCpp library
FetchContent_Declare(
ComlintCpp
URL https://github.com/pasparsw/comlint_cpp/releases/download/v0.3/comlint_cpp_v0.3.tar.gz
)
FetchContent_MakeAvailable(ComlintCpp)
# add executable target
add_executable(${PROJECT_NAME} main.cpp)
# include headers
target_include_directories(${PROJECT_NAME} PRIVATE
${comlintcpp_SOURCE_DIR}/include
)
# link library
target_link_libraries(${PROJECT_NAME} PRIVATE
${comlintcpp_SOURCE_DIR}/libComlintCpp.so
)Read also:
- Storing your ATTiny program in…EEPROM?
- Bug of the week #12
- Sharing variable between bash scripts
- A 40-line LLM-based bash command executor in Python
- GTest and short-circuit evaluation in C++
- AI is powerful. Snippets are instant.
- From AUTOSAR to S-Core: the first C++ pub/sub implementation
- How to write Arduino Uno code with Python?
- Combining Bazel with Docker
- Running commands with timeout on Linux
- Running Python unit tests with CMake
- Thirdparty dependencies with FetchContent
- Bug of the week #11
- Combining CMake with Docker
- How to search the internet from Linux terminal?
- Folding expressions in C++
- How to derive from an enum in Python?
- Bug of the week #10
- Trying ROS2: client/server within a single container
- Make C++ a better place #4: Go as an alternative
- How to convert hex to dec in Linux terminal?
- Setting up a Python project with CMake
- Separating builds for different configs with Bazel
- Trying ROS2: pub/sub within a single container
- Bug of the week #9
- UDP multicasting with Python
- Destruction order vs thread safety in C++
- Let’s review some code: C++ #2
- Make C++ a better place #3: D as an alternative
- Registering callback using std::function in C++
- Bug of the week #8
- TCP client/server with Python
- Simple menus in Bash scripts with select
- Calling member function on a nullptr in C++
- Bug of the week #7
- Python lru_cache explained
- How to dockerize a Python application?
- Make C++ a better place #2: CppFront as an alternative
- Parameters combinations in GoogleTest
- Data transfer with curl
- Python reduce explained
- Bug of the week #6
- Custom literals in C++
- Linux and hash command
- 5 Python good practices which make life easier
- Let’s review some code: Python #1
- Make C++ a better place #1: What does better mean
- Enums vs enum class in C++
- Bug of the week #5
- UDP client/server with Python
- Hard links in Linux
- Functions calling order in unit tests in C++
- Bug of the week #4
- Yield in Python – state machines, coroutines and more
- Copy files from another branch with Git
- Make C++ a better place #0: Introduction
- 5 misconceptions about std::move in C++
- How to use xargs on Linux?
- How to test method call order with unittest in Python?
- Bug of the week #3









