cmake - предустановленные настройки для записей из ini файла

У меня есть проект, который использует некоторые сторонние библиотеки. Поэтому каждый раз, когда я настраиваю этот проект с помощью CMake, я должен устанавливать каждую запись (путь к сторонней библиотеке) в графическом интерфейсе CMake. Я улучшаю это, заставляя скрипт CMake угадывать путь по этому скрипту (изучите эту технику из OGRE):

# Guess the paths.
set( OGRE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/Dependencies/Ogre" CACHE STRING "Path to OGRE source code (see http://www.ogre3d.org/tikiwiki/tiki-index.php?page=CMake+Quick+Start+Guide)" )

Поэтому каждый раз, когда я устанавливаю CMake, он автоматически заполняет запись OGRE_SOURCE. Но этого недостаточно. Если источник Ogre не находится в пути

"${CMAKE_CURRENT_SOURCE_DIR}/Dependencies/Ogre"

, то мне нужно открыть и отредактировать сценарий CMake или отредактировать запись в графическом интерфейсе CMake. Я нахожу это довольно неудобным, особенно когда вы ссылаетесь на множество сторонних библиотек.

Поэтому я хочу использовать другой метод: предустановленные настройки для записей из файла - CMake считывает предустановки из файла PresetEntries.txt (который я делаю) и применяет эти предустановки к записям (намного быстрее редактировать путь в текстовом файле, чем в графическом интерфейсе CMake).

Вот мое представление об этом предустановленном файле: PresetEntries.txt

OGRE_SOURCE=E:/Source/ogre

Я обнаружил, что CMake может читать текстовый файл, но если я использую это, мне приходится выполнять манипуляции со строками.

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

Поэтому мне интересно, поддерживает ли CMake эти предустановленные настройки для записей из файла.

Редактировать: Итак, я прочитал этот вопрос и увидел, что CMake может установить конфигурацию из файла, но это требуется запустить cmake с помощью -C mysettings.cmake, но я хочу, чтобы это было автоматически с графическим интерфейсом CMake - просто отредактируйте файл и нажмите кнопку «Создать» в графическом интерфейсе CMake. Поэтому я хочу уточнить этот вопрос: в моем CMakeLists.txt должен быть такой скрипт:

# Guess the paths.
#I wanna have this function from C++
#https://msdn.microsoft.com/en-us/library/windows/desktop/ms724353%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
GetPrivateProfileString("OGRE",         #lpAppName
                        "OGRE_SOURCE",  #lpKeyName
                        "${CMAKE_CURRENT_SOURCE_DIR}/Dependencies/Ogre", #lpDefault
                        OGRE_SOURCE_VAR,#lpReturnedString
                        MAX_PATH,       #nSize, may be can reduce this variable
                        "LibPath.ini")  #lpFileName

set( OGRE_SOURCE "${OGRE_SOURCE_VAR}" CACHE STRING "Path to OGRE source code" )

В файле LibPath.ini

[OGRE]
OGRE_SOURCE = "E:/Source/ogre"

Таким образом, пользователь может выбрать, использовать файл ini или нет.

Я не знаю, могу ли я каким-либо образом использовать функцию, аналогичную функции GetPrivateProfileString (C++) в CMake.

Спасибо за чтение


person 123iamking    schedule 28.10.2017    source источник
comment
Почему сбились настройки. Вы удалили папку сборки?   -  person Th. Thielemann    schedule 28.10.2017
comment
Используйте параметр -C для cmake, как описано в этом вопросе/ответе.   -  person Tsyvarev    schedule 29.10.2017
comment
@Th.Thielemann: я не потерял настройки, они просто больше не подходят. Например, я перемещаю проект CMake на несколько компьютеров, поэтому путь к Lib не остается прежним на нескольких компьютерах.   -  person 123iamking    schedule 29.10.2017
comment
Если все компьютеры клонированы с одного или имеют одинаковую структуру папок, вы можете попробовать -C способ.   -  person Th. Thielemann    schedule 29.10.2017
comment
извините: p, но я хочу отредактировать вопрос, чтобы было более ясно, чего я хочу.   -  person 123iamking    schedule 30.10.2017


Ответы (2)


Внешние библиотеки должны быть включены одной из следующих команд

find_package(ttnlib REQUIRED HINTS /usr/local/lib/cmake)
include_directories(${ttnlib_INCLUDE_DIR})
set(EXTRA_LIBS ${EXTRA_LIBS} ${TTNLIB_LIBRARY})

or

find_library(MY_EXTERNAL_LIB name COOLSTUFF libCOOLSTUFF libCOOLSTUF.so hints /usr/local/lib) 

Поиск внешних пакетов и библиотек необходим только при первом запуске cmake.

person Th. Thielemann    schedule 28.10.2017
comment
Согласитесь, это канонический способ поддержки внешних зависимостей в CMake. Тем не менее, я нахожу решение OP в целом интересным, так как я сам собираюсь написать код для разбора файлов в cmake. - person yano; 15.01.2020

Я не могу найти функцию для чтения ini-файла, поэтому я могу создать простую функцию, которая читает простой txt-файл для себя.

  1. Я объявляю функцию в 1 файле, чтобы использовать ее в другом файле.

"\CMake\Зависимости\CommonFunc.cmake"

#------------Define function Read file------------
macro( readSettingFile KEY DEFAULT_RESULT STRING_RESULT_OUT)

    unset(STRING_RESULT)
    # Read the file
    file( READ "${CMAKE_SOURCE_DIR}/LibPath.txt" LIB_PATH_STR )

    # Set the variable "Esc" to the ASCII value 27 - basically something
    # which is unlikely to conflict with anything in the file contents.
    string(ASCII 27 Esc)

    # Turn the contents into a list of strings, each ending with an Esc.
    # This allows us to preserve blank lines in the file since CMake
    # automatically prunes empty list items during a foreach loop.
    string(REGEX REPLACE "\n" "${Esc};" LIB_PATH_LINES "${LIB_PATH_STR}")

    foreach(LINE ${LIB_PATH_LINES})
        if("${LINE}" MATCHES "${KEY}")
            #remove the key, leave the content untouch
            string(REPLACE "${KEY}" "" STRING_RESULT ${LINE})
            # Swap the appended Esc character back out in favour of a line feed
            string(REGEX REPLACE "${Esc}" "" STRING_RESULT ${STRING_RESULT})
        endif()
    endforeach()

    if("${STRING_RESULT}" STREQUAL "")
        set( STRING_RESULT ${DEFAULT_RESULT} )
    endif()


    #message( STATIC "---GTA Sa-----" "[${STRING_RESULT}]" )
endmacro()

(Мне нужна помощь от этот ответ, чтобы написать эту функцию: p)

  1. Вот как я использую

Например: "\CMake\Dependencies\Ogre.cmake"

#include common functions
include( CMake/Dependencies/CommonFunc.cmake )
#---------------Guess the paths.----------------------
#----Set OGRE_SOURCE
readSettingFile(    "OGRE_SOURCE="
                    "E:/Source/ogre"
                    STRING_RESULT
                )
set( OGRE_SOURCE "${STRING_RESULT}" CACHE STRING "Path to OGRE Source" )
#----Set OGRE_BINARIES
readSettingFile(    "OGRE_BINARIES="
                    "E:/Source/_build/ogre"
                    STRING_RESULT
                )
set( OGRE_BINARIES "${STRING_RESULT}" CACHE STRING "Path to OGRE's build folder generated by CMake" )
  1. Вот файл настроек

"\LibPath.txt"

OGRE_SOURCE=E:/Source/ogre
OGRE_BINARIES=E:/Source/_build/ogre
person 123iamking    schedule 13.11.2017