Skip to content
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 mixed compilation of third-party project code with cmakelists/meson.build through package mode #1714

Closed
myuanz opened this issue Sep 28, 2021 · 7 comments

Comments

@myuanz
Copy link

myuanz commented Sep 28, 2021

现在有一个项目,使用源代码内置的方式引入了几个CMake管理的库,这几个库在XMake-repo里也有,但是此处的源代码是修改过的。

那么我要用XMake打包这个项目的话,最佳实践应该是怎么样的?子包是用XMake还是xrepo还是用CMake管理?有已有的例包可以参考吗?

image
如图即是所引入的包

@waruqi
Copy link
Member

waruqi commented Sep 28, 2021

这块还没现成的examples,大概三种方式

  1. 如果包简单,可以直接走 xmake.lua port 下引入
  2. 定义一个 phony target + on_build 里面调用 cmake 编译后,走 add_linkdirs/add_links 引入
  3. 类似 xmake-repo 远程包的方式,自己项目xmake.lua 内定义个 package() 并且在 on_install 里面走 import("package.tools.cmake").install 本地编译安装后,通过 add_requires/add_packages 来集成。

推荐使用方案3,但是也是理论上可行,我也没这么用过,set_urls 不设置是否能跳过下载(或者设置到本地目录) 我也不记得了,也许要趟坑

或者等后面几天,我有时间的时候,搞个 demo example 供参考,但是要等等。

@myuanz
Copy link
Author

myuanz commented Sep 28, 2021

好耶!

另外我在文档里只有一处看到了phony, 这个是否也能补一点文档呢?

我也感觉第三种方案比较漂亮, 我也会先尝试一下的

@waruqi
Copy link
Member

waruqi commented Sep 28, 2021

第三种方案 我需要改下代码,目前可能还有点问题 不完全支持,等后面几天好了

@waruqi
Copy link
Member

waruqi commented Sep 29, 2021

dev上初步可以了,https://github.com/xmake-io/xmake/tree/dev/tests/projects/c/library_with_cmakelists 这是example

可以直接走包模式,对内置项目的 cmake/meson/scons/autoconf 第三方项目源码进行混合编译集成。

add_rules("mode.debug", "mode.release")

package("foo")
    add_deps("cmake")
    set_sourcedir(path.join(os.scriptdir(), "foo"))
    on_install(function (package)
        local configs = {}
        table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:debug() and "Debug" or "Release"))
        table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
        import("package.tools.cmake").install(package, configs)
    end)
    on_test(function (package)
        assert(package:has_cfuncs("add", {includes = "foo.h"}))
    end)
package_end()

add_requires("foo")

target("demo")
    set_kind("binary")
    add_files("src/main.c")
    add_packages("foo")

你先试试,目前我只测试了 macos 下ok,其他平台可以帮忙测试下

├── foo
│   ├── CMakeLists.txt
│   └── src
│       ├── foo.c
│       └── foo.h
├── src
│   └── main.c
├── test.lua
└── xmake.lua

@myuanz
Copy link
Author

myuanz commented Sep 29, 2021

好,我在Windows和Manjaro测下

@waruqi
Copy link
Member

waruqi commented Sep 29, 2021

如果设置了 set_sourcedir 并且没设置 set_urls 和 add_versions ,就是本地混编模式,安装的包,还有缓存什么的都会自动切到 当前项目的 build/.packages 目录下,而不是全局存储。。

当然,自己也可以通过 set_installdir, set_cachedir 去修改

@waruqi waruqi added this to the v2.5.8 milestone Sep 29, 2021
@waruqi waruqi changed the title 封装包时的最佳实践讨论 Support mixed compilation of third-party project code such as built-in cmake through package mode Sep 29, 2021
@waruqi waruqi changed the title Support mixed compilation of third-party project code such as built-in cmake through package mode Support mixed compilation of third-party project code with cmakelists/meson.build through package mode Sep 29, 2021
@waruqi
Copy link
Member

waruqi commented Sep 29, 2021

除了 cmake 项目,像 meson/autoconf 项目也都可以走这个模式,只需要换成 import("package.tools.meson").install

具体可以参考 xmake-repo 里面的一些例子

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants