LINUX.ORG.RU

CMake: прочитать версию из файла

 , ,


0

4

Доброго дня,

В корне проекта должен быть файл VERSION, из которого нужно прочитать версию для CMake (переменные PROJECT_VERSION_{MAJOR,MINOR,PATCH}). Внутренний синтаксис файла пока не определнен, по этому его можно «подогнать» под задачу.

Все было бы просто, если бы надо было читать только из CMake то проблема бы решалась простым include(${PROJECT_SOURCE_DIR}/VERSION.cmake). Но вот тут есть проблема: данный файл с версией надо еще парсить из обычного GNU/Makefile (да-да legacy, выкинуть нельзя).

Да и к тому же в этом файле еще должны быть версии для двух библиотек из проекта (итого выходит 3 комплекта по 3 переменных):

PROGRAM_VERSION_MAJOR = 1
PROGRAM_VERSION_MINOR = 0
PROGRAM_VERSION_PATCH = 3

CORELIB_VERSION_MAJOR = 2
CORELIB_VERSION_MINOR = 2
CORELIB_VERSION_PATCH = 0

CLIENTLIB_VERSION_MAJOR = 1
CLIENTLIB_VERSION_MINOR = 0
CLIENTLIB_VERSION_PATCH = 8

Так вот, подскажите какой нибудь формат файла, из которого можно просто прочитать переменные, типа:имя = значение. Не хочется писать велосипеды.

Если речь идет только о gmake, то так:

Файл version.cmake:

PROGRAM_VERSION_MAJOR = 1
PROGRAM_VERSION_MINOR = 0
PROGRAM_VERSION_PATCH = 3

Файл Makefile:

include version.cmake

all:
	echo $(PROGRAM_VERSION_MAJOR).$(PROGRAM_VERSION_MINOR).$(PROGRAM_VERSION_PATCH)

И, наконец:

> make
echo 1.0.3
1.0.3

Для cmake:

CMAKE_MINIMUM_REQUIRED(VERSION 3.0)

FILE(READ "version.cmake" tmp)
STRING(REGEX MATCHALL "[a-zA-Z0-9_]+[ ]*=[^\n]*(\n|$)" tmp_list "${tmp}")
FOREACH(tmp_x ${tmp_list})
        STRING(REGEX REPLACE "([a-zA-Z0-9_]+)[ ]*=[^\n]*(\n|$)" "\\1" tmp_nm "${tmp_x}")
        STRING(REGEX REPLACE "[a-zA-Z0-9_]+[ ]*=[ ]*([^\n]*)(\n|$)" "\\1" tmp_val "${tmp_x}")
        STRING(STRIP "${tmp_val}" ${tmp_nm})
ENDFOREACH()

MESSAGE("VERSION: ${PROGRAM_VERSION_MAJOR}.${PROGRAM_VERSION_MINOR}.${PROGRAM_VERSION_PATCH}")

> cmake .
VERSION: 1.0.3
-- Configuring done
-- Generating done

(Sorry, сначала cmake не добавил)

rymis ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.