我正在尝试编写必要的脚本,find_package
以便为一些没有 cmake 构建或至少没有导出其目标但在安装路径中的库导入目标:CMAKE_PREFIX_PATH
. 例如,对于一些导出目标的库 Foo,有生成的文件:
lib/cmake/Foo/FooTargets.cmake
lib/cmake/Foo/FooTargets-noconfig.cmake
Run Code Online (Sandbox Code Playgroud)
...以及项目提供的:
lib/cmake/Foo/FooConfig.cmake (and maybe FooConfigVersion.cmake)
Run Code Online (Sandbox Code Playgroud)
...找到依赖项,然后包含生成的 FooTargets.cmake。
似乎生成的 FooTargets.cmake 通常只包含 noconfig 版本,通过通配符:
# Load information for each installed configuration.
get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
file(GLOB CONFIG_FILES "${_DIR}/FooTargets-*.cmake")
foreach(f ${CONFIG_FILES})
include(${f})
endforeach()
Run Code Online (Sandbox Code Playgroud)
但是这些配置是指什么?什么是“无配置”?
我猜配置是指调试或发布,当这些在 CMakeLists.txt 脚本中没有区分时,它只是默认生成“noconfig”?
当一个库使用 CMake 定义构建并经历为自己构建安装包的麻烦时,将会有一个XXXConfig.cmake
.
如果库无法将其目标导出到 CMake,CMake 会尝试通过提供FindXXX.cmake
尝试定位此类库的脚本来弥补这一差距。
在文档中,FindXXX.cmake
(模块模式)首先尝试,只有当失败时才尝试使用XXXConfig.cmake
(配置模式)。但这对我来说似乎真的很倒退。
问题是,例如,我从源代码构建了 CURL,而 ConfigXXX 生成的目标名称与 FindXXX 不同,因此,在尝试使用它时,它失败了,因为 FindXXX 负责 find_package 请求并加载了与 FindXXX 不同的目标名称我所期待的。
我至少可以告诉 CMake 以相反的方式做事吗?首先是配置模式。
我知道我可以完全禁用模块模式,但我宁愿将其作为后备选项。
我尝试至少遵循现代 cmake >= 3.0 的准则,其中我不假设有关编译器的任何内容并使用基于目标的命令。
请参阅:https ://www.youtube.com/watch? v=bsXLMQ6WgIk 或搜索“ effective cmake”。
我实际上期望 FindSSE 包含一个没有源的接口目标,但带有它自己的适当的链接器标志。但它仅说明主机上是否存在 SSE 版本。
这因平台而异,例如:/arch:sse4.1 vs -msse4.1
那么我是否缺少 cmake 内部处理不同编译器的此设置的内容,或者我只需要检查平台并相应地设置 target_compile_options ?
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来完成,那么它可能适用于许多库。我猜其余的部分要么必须进行编辑,要么我就放弃并使用包含平台和架构的单独安装目录。
我想从我的网站上的客户端生成消息,并将消息发送到目标设备.使用像这样的ajax(jquery)请求很简单:
$.ajax({
url: 'https://fcm.googleapis.com/fcm/send',
type: 'POST',
contentType: "application/json",
dataType: 'json',
data: JSON.stringify({
"notification": {
"title": title,
"body": msg,
"sound": "default"
},
"to": "XXXXXXXXXXXX"
}),
beforeSend: function(xhr) {
xhr.setRequestHeader('Authorization', 'key=YYYYYYYYYY');
}
});
Run Code Online (Sandbox Code Playgroud)
但是,那么我不需要保持XXXXXXXXXXXX设备密钥,并且YYYYYYYYYY API密钥是私有的吗?如果没有,我担心人们会开始刮掉这些并从完全不相关的服务中发送垃圾邮件?