CMakeLists.txt
Adding such variables can be implemented by creating a configuration file with the extension h.in in which define directives will be defined, which will be added by constants from CMakeLists.txt in C ++. In this case, the corresponding header file will be generated.
cmake_minimum_required (VERSION 3.8)
project (VariablesProject)
# Add the variables we need
set (VERSION_MAJOR 0)
set (VERSION_MINOR 1)
set (VERSION_PATCH 0)
set (SOFT_VERSION $ {VERSION_MAJOR}. $ {VERSION_MINOR}. $ {VERSION_PATCH})
# Specify the configuration file from which the header file will be generated
configure_file (config.h.in config.h @ONLY)
add_executable ($ {PROJECT_NAME} main.cpp)
# add a directory with header files to see the generated file
include_directories ($ {CMAKE_CURRENT_BINARY_DIR})
config.h.in
The configuration file from which the header file config.h will be generated.
#ifndef CONFIG_H_IN
#define CONFIG_H_IN
#define PROJECT_NAME @ PROJECT_NAME @
#define VERSION_MAJOR "@ VERSION_MAJOR @"
#define VERSION_MINOR "@ VERSION_MINOR @"
#define VERSION_PATCH "@ VERSION_PATCH @"
#define SOFT_VERSION "@ SOFT_VERSION @"
#endif // CONFIG_H_IN
main.cpp
#include <iostream>
#include "config.h" // Add an automatically generated configuration file
int main ()
{
// Use variables from CMakeLists.txt
std :: cout << "project name:" << PROJECT_NAME << std :: endl;
std :: cout << "version:" << SOFT_VERSION << std :: endl;
std :: cout << "version major:" << VERSION_MAJOR << std :: endl;
std :: cout << "version minor:" << VERSION_MINOR << std :: endl;
std :: cout << "version patch:" << VERSION_PATCH << std :: endl;
return 0;
}
Program output
We get the following output in the console as a result.
project name: VariablesProject
version: 0.1.0
version major: 0
version minor: 1
version patch: 0
UPD
The config.h file will be generated in the build directory, if you want to create it in the source directory, write this
configure_file(config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h @ONLY)