Archive dans mars 2021

[CMake] Lire un fichier de configuration.

L’idée est de générer des variables pointant sur des valeurs à partir d’un fichier texte au format .cfg/.ini.

Voici un exemple de fichier de configuration:

[python]
ma_python_path = /home/toto/dependencies/venv/bin/python3.9
ma_python_dll_path = /home/toto/dependencies/venv/lib
ma_python_dll_name = libpython3.9.so

[wx]
ma_wxpython_path = /home/toto/dependencies/wxPython
ma_wx_minor_version = 1
ma_wx_so_suffix = .so.5

Voici le script CMake qui permet de parser et de générer les variables contenu dans le fichier de configuration.

set (MA_DEPENDENCIES_DIR "${PROJECT_SOURCE_DIR}/../dependencies/")
set (MA_DEPENDENCIES_CFG_PATH "${MA_DEPENDENCIES_DIR}/dependencies.cfg")

file(STRINGS ${MA_DEPENDENCIES_CFG_PATH} MA_DEPENDENCIES_CFG_LINES)

macro(set_var _NAME _VALUE)
  set(${_NAME} "${_VALUE}")
endmacro()

foreach (_variableName ${MA_DEPENDENCIES_CFG_LINES})
    string(FIND "${_variableName}" "[" _FIND_GROUP)
    if(${_FIND_GROUP} EQUAL -1)
        string(FIND "${_variableName}" "=" _FIND_EQUAL)
        if(NOT ${_FIND_EQUAL} EQUAL -1)
            string(LENGTH "${_variableName}" _LENGTH)

            # La clef
            string(SUBSTRING "${_variableName}" 0 ${_FIND_EQUAL} _KEY)
            string(STRIP "${_KEY}" _KEY)
            string(TOUPPER "${_KEY}" _KEY)

            # La valeur
            math(EXPR _LENGTH "${_LENGTH} + 1" OUTPUT_FORMAT DECIMAL)            
            string(SUBSTRING "${_variableName}" ${_FIND_EQUAL} ${_LENGTH} _VALUE)
            string(REPLACE "=" "" _VALUE "${_VALUE}")
            string(STRIP "${_VALUE}" _VALUE)

            set_var(${_KEY} ${_VALUE})
            #message("${_KEY}:${_VALUE}")
        endif()        
    endif()
endforeach()

# on vérifie que l'une des variables du fichier de configurtion est accecible
message("${MA_PYTHON_PATH}")