我有一个 C++ 库的 CMake 项目(当前版本为 CMake v3.21),我正在将其移植到 macOS,并且我正在考虑将该库生成为操作系统框架 https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html.
到目前为止,我已经遵循了 CMake 的文档添加库 https://cmake.org/cmake/help/v3.21/command/add_library.html?highlight=add_library,并添加了FRAMEWORK
属性到库目标CMake 关于其 FRAMEWORK 目标属性的文档 https://cmake.org/cmake/help/v3.21/prop_tgt/FRAMEWORK.html。这似乎大部分工作,除了作为其一部分导出的头文件PUBLIC_HEADER
属性的目录结构从导出中被剥离和扁平化。
为了说明这个问题,让我们考虑以下项目树:
include
└── A
├── A.hpp
└── subA
└── SubA.hpp
src
├── A.cpp
└── SubA.cpp
以下 CMake 项目在 macOS 上编译时会生成 OSX 框架:
cmake_minimum_required(VERSION 3.21)
project(libA LANGUAGES CXX)
set(a_INCLUDES
include/A/A.hpp
include/A/subA/SubA.hpp
)
set(a_SOURCES
src/A.cpp
src/SubA.cpp
)
add_library(a
${a_INCLUDES}
${a_SOURCES}
)
set_target_properties(a
PROPERTIES
FRAMEWORK YES
PUBLIC_HEADER "${a_INCLUDES}"
)
target_include_directories(a
PUBLIC
${CMAKE_SOURCE_DIR}/include
)
然而,生成的框架扁平化了其包含的头文件的目录结构。Headers
, 如下所示:
build/a.framework
├── Headers -> Versions/Current/Headers
├── Resources -> Versions/Current/Resources
├── Versions
│ ├── A
│ │ ├── Headers
│ │ │ ├── A.hpp
│ │ │ └── SubA.hpp
│ │ ├── Resources
│ │ │ └── Info.plist
│ │ └── a
│ └── Current -> A
└── a -> Versions/Current/a
所以,我的问题是:CMake 是否支持保留作为 OSX 框架一部分提供的公共标头的目录树布局?如果是这样,我们需要在项目中做什么才能确保保留目录树布局?