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 installing .cmake and pkgconfig/.pc files for targets #1268

Closed
xq114 opened this issue Mar 6, 2021 · 14 comments
Closed

support installing .cmake and pkgconfig/.pc files for targets #1268

xq114 opened this issue Mar 6, 2021 · 14 comments

Comments

@xq114
Copy link
Contributor

xq114 commented Mar 6, 2021

你在什么场景下需要该功能?

使用xmake编写的库,希望其他原来使用cmake的项目也可以不做太多改动的情况下使用

描述可能的解决方案

add_rules("utils.export.cmake_import_files")

效果为install时在include、lib等文件夹外并列放一个cmake文件夹,文件夹里面放fooConfig.cmake等并通过相对路径标明此target的include/lib/syslink等信息

描述你认为的候选方案

xmake project -k cmake_import_files

缺点是不好指定特定的target,install的时候不能保证相对路径的正确

@waruqi
Copy link
Member

waruqi commented Mar 6, 2021

可以用 rule ,名字改下:

add_rules("utils.install.cmake_importfiles")

也可以导出 pkg-config pc files

add_rules("utils.install.pkgconfig_importfiles")

@waruqi waruqi added this to the v2.5.3 milestone Mar 6, 2021
@waruqi
Copy link
Member

waruqi commented Mar 22, 2021

cmake 的还没弄,我先把 pkgconfig 的加上了。。只需要添加 add_rules("utils.install.pkgconfig_importfiles") 规则。

target("test")
    set_kind("static")
    add_files("src/*.cpp")
    add_rules("utils.install.pkgconfig_importfiles")
$ xmake install -o /tmp/install
$ tree /tmp/install/
/tmp/install/├── include
└── lib
    ├── libtest.a
    └── pkgconfig
        └── test.pc

test.pc

prefix=/tmp/install
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: test
Libs: -L/tmp/install/lib -L${libdir} -ltest
Libs.private:
Cflags: -I/tmp/install/include -I${includedir}

我们也可以不用内置的规则,自己通过 after_install 定制化一些安装参数

target("test")
    set_kind("static")
    add_files("src/*.cpp")
    after_install(function (target, opt))
        import("target.action.install.pkgconfig_importfiles")(target, 
            {includedirs = {"xxx"}, linkdirs = ..., links ..., filename = "xxxx.pc"})
    end

@waruqi waruqi changed the title support generating fooConfig.cmake and fooTarget.cmake for xmake targets support installing .cmake and pkgconfig/.pc files for targets Mar 22, 2021
@waruqi
Copy link
Member

waruqi commented Mar 23, 2021

cmake 的我也加上了,不过没有详测过是否完全生效,你可以试试 @xq114

set_project("test")
target("test")
    set_kind("static")
    add_files("src/*.cpp")
    add_rules("utils.install.cmake_importfiles")

对应的包名规则:find_package("test::test") 。。。projectname::targetname


$ tree /tmp/install
/tmp/install
├── include
└── lib
    ├── cmake
    │   └── test
    │       ├── testConfig.cmake
    │       ├── testConfigVersion.cmake
    │       ├── testTargets-release.cmake
    │       └── testTargets.cmake
    ├── libtest.a

@xq114
Copy link
Contributor Author

xq114 commented Mar 23, 2021

  1. 一般来说这个文件是放在share/cmake或者lib/cmake下面而不是lib/cmake/test下面
  2. cmake文件内可以用${CMAKE_CURRENT_LIST_DIR}声明相对路径,而不是使用绝对路径 https://cmake.org/cmake/help/latest/variable/CMAKE_CURRENT_LIST_DIR.html
    或者参考 https://cmake.org/cmake/help/latest/guide/importing-exporting/index.html?highlight=cmake_current_list_dir
  3. 是否可提供选项去掉project::前缀,直接用find_package(<target>)

@xq114
Copy link
Contributor Author

xq114 commented Mar 23, 2021

绝对路径导致的问题

CMake Error at C:/Users/xq114/Projects/testc/dist/lib/cmake/lodepng/lodepngTargets.cmake:45 (set):
  Syntax error in cmake code at

    C:/Users/xq114/Projects/testc/dist/lib/cmake/lodepng/lodepngTargets.cmake:45

  when parsing string

    C:\Users\xq114\Projects\testc\dist

  Invalid character escape '\U'.

@waruqi
Copy link
Member

waruqi commented Mar 23, 2021

一般来说这个文件是放在share/cmake或者lib/cmake下面而不是lib/cmake/test下面
是否可提供选项去掉project::前缀,直接用find_package()?

我是参考了 现有的一些包的安装,ogg, libjpeg 什么的,我看都是 project::xxxx 两级命名,并且都是放在 lib/cmake/xxx 下

add_library(libjpeg-turbo::turbojpeg-static STATIC IMPORTED)

/Users/ruki/.xmake/packages//l/libogg/v1.3.4/05bd3ef519484fab9eed1d9b13064f52/lib/cmake/Ogg/OggTargets-release.cmake
/Users/ruki/.xmake/packages//l/libogg/v1.3.4/05bd3ef519484fab9eed1d9b13064f52/lib/cmake/Ogg/OggConfig.cmake
/Users/ruki/.xmake/packages//l/libogg/v1.3.4/05bd3ef519484fab9eed1d9b13064f52/lib/cmake/Ogg/OggConfigVersion.cmake
/Users/ruki/.xmake/packages//l/libogg/v1.3.4/05bd3ef519484fab9eed1d9b13064f52/lib/cmake/Ogg/OggTargets.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/bbc3030e3d9740ec9ff0a1bd1700dc34/lib/cmake/libjpeg-turbo/libjpeg-turboTargets.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/bbc3030e3d9740ec9ff0a1bd1700dc34/lib/cmake/libjpeg-turbo/libjpeg-turboConfig.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/bbc3030e3d9740ec9ff0a1bd1700dc34/lib/cmake/libjpeg-turbo/libjpeg-turboTargets-release.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/bbc3030e3d9740ec9ff0a1bd1700dc34/lib/cmake/libjpeg-turbo/libjpeg-turboConfigVersion.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/751c846dbd12437b9a6ef45db303fb17/lib/cmake/libjpeg-turbo/libjpeg-turboTargets.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/751c846dbd12437b9a6ef45db303fb17/lib/cmake/libjpeg-turbo/libjpeg-turboConfig.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/751c846dbd12437b9a6ef45db303fb17/lib/cmake/libjpeg-turbo/libjpeg-turboTargets-release.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/751c846dbd12437b9a6ef45db303fb17/lib/cmake/libjpeg-turbo/libjpeg-turboConfigVersion.cmake
/Users/ruki/.xmake/packages//l/libfreenect2/v0.2.0/0a7f97f277c446d3bcbfc7c9d958f184/lib/cmake/freenect2/freenect2Config.cmake
/Users/ruki/.xmake/packages//l/libfreenect2/v0.2.0/14fd476c12ee4531b15b9ad6e918d4d8/lib/cmake/freenect2/freenect2Config.cmake
/Users/ruki/.xmake/packages//l/libfreenect2/v0.2.0/3ecdcb9d50b44110ad83adeb15dc0708/lib/cmake/freenect2/freenect2Config.cmake
/Users/ruki/.xmake/packages//l/libfreenect2/v0.2.0/30439040a22f4fccbdabba3caa4f81d1/lib/cmake/freenect2/freenect2Config.cmake
/Users/ruki/.xmake/packages//l/libfreenect2/v0.2.0/4148585e40a04454ab0dbfad1c6b3053/lib/cmake/freenect2/freenect2Config.cmake

@waruqi
Copy link
Member

waruqi commented Mar 23, 2021

cmake文件内可以用${CMAKE_CURRENT_LIST_DIR}声明相对路径,而不是使用绝对路径 https://cmake.org/cmake/help/latest/variable/CMAKE_CURRENT_LIST_DIR.html

同样,我看现有第三方cmake工程安装的,prefixdir 等都是绝对路径,

绝对路径导致的问题

跟绝对路径没关系,是 win 上 cmake 不支持 \\ , 只能支持 / 。。我忘记转了。。即使相对路径也会有问题。。
我刚修复了。dev

@xq114
Copy link
Contributor Author

xq114 commented Mar 23, 2021

一般来说这个文件是放在share/cmake或者lib/cmake下面而不是lib/cmake/test下面
是否可提供选项去掉project::前缀,直接用find_package()?

我是参考了 现有的一些包的安装,ogg, libjpeg 什么的,我看都是 project::xxxx 两级命名,并且都是放在 lib/cmake/xxx 下

add_library(libjpeg-turbo::turbojpeg-static STATIC IMPORTED)

/Users/ruki/.xmake/packages//l/libogg/v1.3.4/05bd3ef519484fab9eed1d9b13064f52/lib/cmake/Ogg/OggTargets-release.cmake
/Users/ruki/.xmake/packages//l/libogg/v1.3.4/05bd3ef519484fab9eed1d9b13064f52/lib/cmake/Ogg/OggConfig.cmake
/Users/ruki/.xmake/packages//l/libogg/v1.3.4/05bd3ef519484fab9eed1d9b13064f52/lib/cmake/Ogg/OggConfigVersion.cmake
/Users/ruki/.xmake/packages//l/libogg/v1.3.4/05bd3ef519484fab9eed1d9b13064f52/lib/cmake/Ogg/OggTargets.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/bbc3030e3d9740ec9ff0a1bd1700dc34/lib/cmake/libjpeg-turbo/libjpeg-turboTargets.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/bbc3030e3d9740ec9ff0a1bd1700dc34/lib/cmake/libjpeg-turbo/libjpeg-turboConfig.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/bbc3030e3d9740ec9ff0a1bd1700dc34/lib/cmake/libjpeg-turbo/libjpeg-turboTargets-release.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/bbc3030e3d9740ec9ff0a1bd1700dc34/lib/cmake/libjpeg-turbo/libjpeg-turboConfigVersion.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/751c846dbd12437b9a6ef45db303fb17/lib/cmake/libjpeg-turbo/libjpeg-turboTargets.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/751c846dbd12437b9a6ef45db303fb17/lib/cmake/libjpeg-turbo/libjpeg-turboConfig.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/751c846dbd12437b9a6ef45db303fb17/lib/cmake/libjpeg-turbo/libjpeg-turboTargets-release.cmake
/Users/ruki/.xmake/packages//l/libjpeg-turbo/2.0.90/751c846dbd12437b9a6ef45db303fb17/lib/cmake/libjpeg-turbo/libjpeg-turboConfigVersion.cmake
/Users/ruki/.xmake/packages//l/libfreenect2/v0.2.0/0a7f97f277c446d3bcbfc7c9d958f184/lib/cmake/freenect2/freenect2Config.cmake
/Users/ruki/.xmake/packages//l/libfreenect2/v0.2.0/14fd476c12ee4531b15b9ad6e918d4d8/lib/cmake/freenect2/freenect2Config.cmake
/Users/ruki/.xmake/packages//l/libfreenect2/v0.2.0/3ecdcb9d50b44110ad83adeb15dc0708/lib/cmake/freenect2/freenect2Config.cmake
/Users/ruki/.xmake/packages//l/libfreenect2/v0.2.0/30439040a22f4fccbdabba3caa4f81d1/lib/cmake/freenect2/freenect2Config.cmake
/Users/ruki/.xmake/packages//l/libfreenect2/v0.2.0/4148585e40a04454ab0dbfad1c6b3053/lib/cmake/freenect2/freenect2Config.cmake

这个问题确实不大,cmake的项目也是五花八门 opencv的cmake直接放在lib下面
image
我见过的放lib/cmake的比较多,这也是官方tutorial放置的位置

用相对路径的库还是多的,这样复制粘贴到别的地方还能用,改起来也并不复杂,其实自定义的那个import路径就和CMAKE_CURRENT_LIST_DIR差不多

@xq114
Copy link
Contributor Author

xq114 commented Mar 23, 2021

另外想要发布二进制预编译包必须用相对路径

@xq114
Copy link
Contributor Author

xq114 commented Mar 23, 2021

image
摘自Eigen3Targets.cmake

@waruqi
Copy link
Member

waruqi commented Mar 23, 2021

我见过的放lib/cmake的比较多,这也是官方tutorial放置的位置

我看到的都是分两级的,用来便于管理维护 一个project 包含多个 targets 的情况。。

像 tutorial 这种通常都是简单的基础工程,就一个 target,所以可能简化成 一级了。。

另外想要发布二进制预编译包必须用相对路径

路径问题,我刚改进过了

@xq114
Copy link
Contributor Author

xq114 commented Mar 23, 2021

现在可以成功编译了

@waruqi waruqi closed this as completed Mar 23, 2021
@xq114
Copy link
Contributor Author

xq114 commented Mar 23, 2021

另外,是否考虑加一个机制支持安装到系统的xmake包?例如,两个xmake包安装到/usr/local下,在xmake中无法直接定位这两个包。而在/usr/local下面放xmake.lua当package用也不现实,会导致这两个包冲突。lib/cmake/project/xxConfig.cmake的设计思路则避开了这个问题,能去子目录找对应的cmake文件。
image

@waruqi
Copy link
Member

waruqi commented Mar 23, 2021

理论上是可以搞,但目前需求不强烈,既然走了 xmake 包,并且还是提供给 xmake 项目用,那就直接集成到 xmake-repo 仓库或者自己的仓库,然后走 add_requires集成就好了

搞成类似 lib/cmake 的方式,以后安装一个系统包,并且要兼容其他构建工具,就会变成 ,.pc/cmake/xmake 导入文件各一份,装个库,光 import files 就是一坨(如果还有其他构建工具的话),现在已经被很多人喷分裂构建生态了。。

所以,能走 xmake-repo/add_requires 尽量走这个集成,不想过于污染系统库目录,导致充斥各种 lib/xmake 文件。。

现在 cmake一家独大,当然可以这么搞,xmake也这么弄,只会被别人喷

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