-
-
Notifications
You must be signed in to change notification settings - Fork 812
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
support finding package from cmake #1632
Comments
还是走 package() + on_fetch + add_configs + cmake 辅助脚本更好些。。还可以对现有包直接做 fetch 增强。。对上层 add_requires() 也不需要特殊配置什么,用户使用成本更低 毕竟不同包, cmake 提供的 findxxx.cmake 差异很大,放到 package() 里面更能定制化分别处理 而 add_configs 正好也能支持组件式 find 在 on_fetch 里面。。 只需要搞个 毕竟这种定制化传参对用户来说要求和成本过高,而对于包制作者,就无所谓了。 |
不过这个最近没时间搞,先排着吧 |
大体搞完了 find_package("cmake::ZLIB") 测试$ xmake l find_package cmake::ZLIB
{
links = {
"z"
},
includedirs = {
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.
15.sdk/usr/include"
},
linkdirs = {
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.
15.sdk/usr/lib"
}
}
$ xmake l find_package cmake::LibXml2
{
links = {
"xml2"
},
includedirs = {
"/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/libxml2"
},
linkdirs = {
"/usr/lib"
}
} 指定版本find_package("cmake::OpenCV", {required_version = "4.1.1"}) 指定组件find_package("cmake::Boost", {components = {"regex", "system"}}) 预设开关find_package("cmake::Boost", {components = {"regex", "system"}, presets = {Boost_USE_STATIC_LIB = true}})
设置环境变量find_package("cmake::OpenCV", {envs = {CMAKE_PREFIX_PATH = "xxx"}}) 指定自定义 FindFoo.cmake 模块脚本目录mydir/cmake_modules/FindFoo.cmake find_package("cmake::Foo", {moduledirs = "mydir/cmake_modules"}) 包依赖集成package("xxx")
on_fetch(function (package, opt)
return package:find_package("cmake::xxx", opt)
end)
package_end()
add_requires("xxx") 包依赖集成(可选组件)package("boost")
add_configs("regex", { description = "Enable regex.", default = false, type = "boolean"})
on_fetch(function (package, opt)
opt.components = {}
if package:config("regex") then
table.insert(opt.components, "regex")
end
return package:find_package("cmake::Boost", opt)
end)
package_end()
add_requires("boost", {configs = {regex = true}}) |
不过现在还有一些问题: 有些包 cmake 获取到的 links 是 Boost::regex Boost::system 这种的,不是真实库名,暂时不支持 这个怎么取到真实 lib 名呢? 有些 CMakeCache.txt 都没有这些信息 还有 win 上还没测试,仅仅测试了 macOS/linux, win上可以帮忙测试和改进下 |
这个接口可以设置preset吗? |
meson是建立了一个phony target,然后取这个target的link.txt,而不是单一个 |
preset 是啥? |
就上面说的
这样 |
这种我也想过,主要是想探测快点,搞个 target cmake 还会去额外探测各种编译器环境啥的额,生成工程文件 |
这些总是可以加参数解决的,比如设置 |
哦,各种提前设置的开关哈,有命名要求么。。Boost_xxx格式? 还是随意的? |
我加上了 find_package("cmake::Boost", {components = {"regex", "system"}, presets = {USE_STATIC_LIB = true}}) |
没有命名要求,是随意的,这里还是用全名好 |
改了 |
Boost::regex 这种我也支持了,另外 defines 的提取我也加上了。。至少 linux / macos 上应该没啥大问题了。。win 上暂时没测 |
比如查找 Qt5 的库 $ xmake l find_package cmake::Qt5Widgets
{
linkdirs = {
"/usr/lib/x86_64-linux-gnu"
},
defines = {
"QT_CORE_LIB",
"QT_GUI_LIB",
"QT_NO_DEBUG",
"QT_WIDGETS_LIB"
},
links = {
"Qt5Widgets",
"Qt5Gui",
"Qt5Core"
},
libfiles = {
"/usr/lib/x86_64-linux-gnu/libQt5Widgets.so",
"/usr/lib/x86_64-linux-gnu/libQt5Gui.so",
"/usr/lib/x86_64-linux-gnu/libQt5Core.so"
},
includedirs = {
"/usr/include/x86_64-linux-gnu/qt5",
"/usr/include/x86_64-linux-gnu/qt5/QtWidgets",
"/usr/include/x86_64-linux-gnu/qt5/QtGui",
"/usr/include/x86_64-linux-gnu/qt5/QtCore",
"/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++"
}
} |
怎样声明额外的环境变量?OpenCV_ROOT、CMAKE_PREFIX_PATH这些,我看现在的例子都是cmake内置有FindXXX.cmake的类型(zlib、libxml2、boost、qt都是),没有完全通过config查找的例子 |
另外还应该支持强制使用config查找,不用内置的FindXXX.cmake,对应语句 |
CONFIG 是用来干什么的? 强制走自己的 modules 里面的 findXXX.cmake ?那如果设置了 moduledirs 参数,我就默认启用 config 呢? |
走刚的 presets 不行么。。 |
强制走XXXConfig.cmake/XXX-config.cmake,忽略所有FindXXX.cmake,moduledirs自然也就失效了 |
不行,这个是环境变量,不是cmake变量 |
自己 presets 里面开启这个优先走 config 呢? |
这个也行 |
加上了 find_package("cmake::OpenCV", {envs = {CMAKE_PREFIX_PATH = "xxx"}}) |
windows 上也支持了,presets 之前有点问题,也修复了 |
我改进了下 #1917 直接用 find_package 还是过于底层,对于用户集成包,还是统一走 add_requires 比较好,之前虽然也有直接在 add_requires("cmake::ZLIB", {alias = "zlib", system = true})
target("test")
set_kind("binary")
add_files("src/*.c")
add_packages("zlib") add_requires("cmake::Boost", {system = true, configs = {components = {"regex", "system"},
presets = {Boost_USE_STATIC_LIB = true}})} |
你在什么场景下需要该功能?
使用cmake的find_package获取外部依赖。一来有些库默认提供cmake,并且是高度自定义的cmake,较难使用xmake package集成;二来一些cmake script可以直接从之前的库copy,无需重写+测试
这项功能meson已经提供 https://mesonbuild.com/Dependencies.html#cmake ,实现的源代码在 https://github.com/mesonbuild/meson/blob/HEAD/mesonbuild/dependencies/cmake.py ,大致思路是用cmake生成一个临时工程,然后解析CMakeCache里生成的flags。
不过xmake中引入cmake的package还不太方便,因为与系统包不同,cmake有组件系统(find_package同时找寻多个组件,最后链接的implib可能是其中某个组件;同时链接可能是${FOO_LIBRARIES}变量也可能是foo::foo target),并且cmake在find_package前往往需要一些preset variables。xmake直接
add_requires("cmake::foo")
是无法处理这么多因素的,需要设计一下描述可能的解决方案
这种方案对内置的cmake package奏效,但在比较复杂的情况下(cmake需要引入一些外部模块),在presets变量中声明外部模块会比较困难。
描述你认为的候选方案
Related issues: #1086 (comment)
The text was updated successfully, but these errors were encountered: