cmake - 为ini文件中的条目预设设置

时间:2017-10-28 03:59:10

标签: cmake cmake-gui

我有一个使用某些第三方库的项目。因此,每次使用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可以从文件设置配置,但是这需要用-Cmysettings.cmake来激活cmake,但是我想用CMake GUI自动启动它 - 只需编辑文件并点击生成CMake GUI中的按钮。所以我想更具体地提出这个问题: 在我的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(C ++)的函数。

感谢您阅读

2 个答案:

答案 0 :(得分:0)

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

ng-if="($index+8) % 8 == 4"

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

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

答案 1 :(得分:0)

我找不到读取ini文件的函数,所以我能做的就是创建一个简单的函数,为自己读取简单的txt文件。

  1. 我在1文件中声明该函数以供其他文件使用
  2. “\ 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()
    

    (我需要this answer的帮助来编写这个函数:p)

    1. 以下是我如何使用
    2. 例如:“\ 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. 这是设置文件
      2. “\ LibPath.txt”

        OGRE_SOURCE=E:/Source/ogre
        OGRE_BINARIES=E:/Source/_build/ogre