cmake - ini 文件条目的预设设置
cmake - preset settings for entries from ini file
我有一个项目使用了一些第三方库。所以每次我用 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 上的条目。我觉得这很不方便,尤其是当你 link 访问很多第三方库时。
所以我想使用另一种技术:为文件中的条目预设设置 - 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 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++ 的)的函数。
感谢阅读
外部库应由以下命令之一包含
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 的第一个 运行 时才需要。
我找不到读取 ini 文件的函数,所以我只能创建一个简单的函数来为自己读取简单的 txt 文件。
- 我在 1 个文件中声明该函数供其他文件使用
"\CMake\Dependencies\CommonFunc.cmake"=14=]
#------------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)
- 下面是我的使用方法
例如:“\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" )
- 这里是设置文件
"\LibPath.txt"
OGRE_SOURCE=E:/Source/ogre
OGRE_BINARIES=E:/Source/_build/ogre
我有一个项目使用了一些第三方库。所以每次我用 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 上的条目。我觉得这很不方便,尤其是当你 link 访问很多第三方库时。
所以我想使用另一种技术:为文件中的条目预设设置 - 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 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++ 的)的函数。
感谢阅读
外部库应由以下命令之一包含
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 的第一个 运行 时才需要。
我找不到读取 ini 文件的函数,所以我只能创建一个简单的函数来为自己读取简单的 txt 文件。
- 我在 1 个文件中声明该函数供其他文件使用
"\CMake\Dependencies\CommonFunc.cmake"=14=]
#------------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()
(我需要
- 下面是我的使用方法
例如:“\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" )
- 这里是设置文件
"\LibPath.txt"
OGRE_SOURCE=E:/Source/ogre
OGRE_BINARIES=E:/Source/_build/ogre