Evgenii Legotckoi
10 серпня 2019 р. 04:09

Використання змінних оголошених в CMakeLists.txt всередині C++ файлів

Пропоную до розгляду варіант використання в C ++ коді змінних оголошених в CMakeLists.txt файлі.

Для початку, для чого це потрібно? Наприклад, ви хочете вказати версію програми і ще якусь службову інформацію, яка задається при складанні програми, але в той же час ви хочете використовувати цю інформацію і в вашому C++ коді? Чи можливо це зробити? Наприклад, щоб це виглядало так, як показано на малюнку.


CMakeLists.txt

Додавання таких змінних можна реалізувати через створення конфігураційного файлу з розширенням h.in в якому будуть визначені define директиви, які і додадуть констатни з CMakeLists.txt в C++. При цьому буде згенеровано відповідний заголовки.

cmake_minimum_required(VERSION 3.8)

project(VariablesProject)

# Додамо необхідні нам змінні
set (VERSION_MAJOR 0)
set (VERSION_MINOR 1)
set (VERSION_PATCH 0)
set (SOFT_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})

# Вказуємо конфігураційний файл, з якого буде згенеровано заголовки
configure_file(config.h.in config.h @ONLY)

add_executable(${PROJECT_NAME} main.cpp)

# додаємо директорію з заголовками файлами, щоб побачити згенерований файл
include_directories(${CMAKE_CURRENT_BINARY_DIR})

config.h.in

Конфігураційний файл, з якого буде згенеровано заголовки config.h .

#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" // Додаємо автоматично генерується конфігураційний файл

int main()
{
    // Используем переменые из 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;
}

Висновок програми

Отримуємо в результаті такого висновку в консолі.

project name: VariablesProject
version: 0.1.0
version major: 0
version minor: 1
version patch: 0

UPD

Файл config.h буде генеруватися в build директорії, якщо хочете його створювати в дірекеторіі вихідних кодів, то напишіть так

configure_file(config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h @ONLY)

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up