joh*_*003 5 c++ multiplatform cmake
CMake安装使用目标目录,通常使用GNUInstallDirs加载目标名称的标准值。例如:
include(GNUInstallDirs)
install(TARGETS Foo
EXPORT Foo
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
Run Code Online (Sandbox Code Playgroud)
但是,它没有提供为不同平台或体系结构构建的不同路径。我一直在通过以下方式安装到项目中特定于平台的文件夹中CMAKE_INSTALL_PREFIX:
CMAKE_INSTALL_PREFIX=dist/${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}
Run Code Online (Sandbox Code Playgroud)
但是,这有一些问题:
我正在寻找一种与find_package模块模式和config模式一起使用的结构;像这样的东西:
<install_prefix>/
include/
foo/
foo.h
lib/
<PLAT x ARCH x CONFIG>/
cmake/
foo/
FooConfig.cmake
libFoo.a
Run Code Online (Sandbox Code Playgroud)
目标是:
考虑到我将在这里主要安装第三方库,如果可以通过重写GNUInstallDirs中的var来完成,那么它可能适用于许多库。我猜其余的部分要么必须进行编辑,要么我就放弃并使用包含平台和架构的单独安装目录。
如果您希望用户将一些标准目录设置为CMAKE_PREFIX_PATH,例如
/usr/local # installation prefix
Run Code Online (Sandbox Code Playgroud)
但是您的项目将内容安装到非标准的、特定于平台的子目录中,例如
/usr/local/linux/x86/ # actual root directory where things are installed
Run Code Online (Sandbox Code Playgroud)
您可以将其放入FooConfig.cmake标准子目录中:
/usr/local/lib/FooConfig.cmake
Run Code Online (Sandbox Code Playgroud)
.cmake但编写它以便从特定于平台的目录中搜索适当的内容:
# File: FooConfig.cmake
# Location: lib/
#
# This is platform-independent script.
#
# Redirect configuration to the platform-specific script <system>/<cpu>/lib/FooConfig.cmake.
include(${CMAKE_CURRENT_LIST_DIR}/../${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}/lib/FooConfig.cmake)
Run Code Online (Sandbox Code Playgroud)
*Config.cmake可以用通常的方式编写特定于平台的脚本。
所以,如果用户写
find_package(Foo)
Run Code Online (Sandbox Code Playgroud)
在设置为 的环境中Linux/x86,它将为该平台设置导入的目标。