【问题标题】:cmake - preset settings for entries from ini filecmake - 为 ini 文件中的条目预设设置
【发布时间】:2017-11-13 18:04:29
【问题描述】:

我有一个使用一些第三方库的项目。所以每次我用 CMake 设置这个项目时,我都必须在 CMake 的 GUI 上设置每个条目(第三方库的路径)。我通过让 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 的 GUI 上编辑条目。我觉得这很不方便,尤其是当您链接到许多第三方库时。

所以我想使用另一种技术:文件中条目的预设设置 - CMake 从文件 PresetEntries.txt(我制作)中读取预设并将这些预设应用于条目(在文本文件而不是 CMake 的 GUI)。

这是我对这个预设文件的想法:PresetEntries.txt

OGRE_SOURCE=E:/Source/ogre

我发现CMake可以read a text file,但是如果我使用它,我必须进行字符串操作。

CMake 有 the file CMakeCache.txt 来保存 CMake GUI 上的设置,但我希望它简单一点:它应该只有需要预先设置的预设设置。

所以我想知道 CMake 是否支持文件条目的这种预设设置。

编辑: 所以我读了this question,看到CMake可以从文件中设置配置,但这需要使用-C mysettings.cmake来触发cmake,但我希望它能够自动使用CMake GUI - 只需编辑文件并点击生成按钮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文件。

我不知道有没有什么方法可以在 CMake 中使用类似于函数 GetPrivateProfileString (of C++) 的函数。

感谢阅读

【问题讨论】:

  • 为什么会丢失设置。您是否删除了构建文件夹?
  • 使用cmake-C 选项,如that question/answer 中所述。
  • @Th.Thielemann:我没有丢失设置,只是设置不再正确。例如,我将 CMake 项目移动到多台 PC 上,因此 Lib 路径在多台 PC 中不会保持不变。
  • 如果所有PC都从一个克隆/具有相同的文件夹结构,您可以尝试-C方式。
  • 抱歉 :p 但我想编辑问题以更清楚地说明我想要什么。

标签: cmake cmake-gui


【解决方案1】:

外部库应包含在以下命令之一中

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

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

只有在第一次运行 cmake 时才需要搜索外部包和库。

【讨论】:

  • 同意,这是在 CMake 中支持外部依赖项的规范方式。不过,我发现 OP 的解决方案通常很有趣,因为我正在考虑自己在 cmake 中编写一些文件解析代码
【解决方案2】:

我找不到读取ini文件的函数,所以我可以做一个简单的函数来为自己读取简单的txt文件。

  1. 我在 1 个文件中声明该函数供其他文件使用

"\CMake\Dependencies\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()

(我需要this answer 的帮助来编写这个函数: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

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多