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

manage and switch global virtual environment in xrepo env/shell #1762

Closed
xq114 opened this issue Oct 22, 2021 · 14 comments
Closed

manage and switch global virtual environment in xrepo env/shell #1762

xq114 opened this issue Oct 22, 2021 · 14 comments

Comments

@xq114
Copy link
Contributor

xq114 commented Oct 22, 2021

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

https://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html

https://docs.microsoft.com/en-us/cpp/build/reference/i-additional-include-directories?view=msvc-160

https://docs.microsoft.com/en-us/cpp/build/reference/libpath-additional-libpath?view=msvc-160

msvc使用INCLUDE和LIB环境变量来声明额外的include/link path,gcc/ld使用CPATH(C_INCLUDE_PATH+CPLUS_INCLUDE_PATH)和LIBRARY_PATH;目前xmake的虚拟环境仅设置LD_LIBRARY_PATH,确保动态库可以链接,可以更进一步设置更多的环境变量,方便简单代码块的手动编译测试,以及在xrepo environment中使用其他构建系统(e.g. Makefile)

描述可能的解决方案

toolchain为msvc时添加INCLUDE和LIB环境变量;gcc、clang、mingw等设置CPATH和LIBRARY_PATH环境变量

其他信息

  1. 当前需要显式设置toolchain=msvc才能加载到msvc的环境;但虚拟环境的进入可以保证在运行xmake config之后,此时应该已经可以取出用到的所有toolchain才对。如果有用到msvc,就加载进入msvc环境,应该可以实现的

  2. meson对此的说明:
    https://mesonbuild.com/Reference-manual_returned_compiler.html#returned-by

@waruqi
Copy link
Member

waruqi commented Oct 22, 2021

toolchain为msvc时添加INCLUDE和LIB环境变量

这两我记得原本就已经加了的。。

当前需要显式设置toolchain=msvc才能加载到msvc的环境;但虚拟环境的进入可以保证在运行xmake config之后,此时应该已经可以取出用到的所有toolchain才对。如果有用到msvc,就加载进入msvc环境,应该可以实现的

自己走 add_toolchains 配置下,也就一两行配置

@xq114
Copy link
Contributor Author

xq114 commented Oct 22, 2021

这两我记得原本就已经加了的。。

function _package_addenvs(envs, instance)

只是msvc toolchain里面加了这俩,package的没加

自己走 add_toolchains 配置下,也就一两行配置

这块不需要配置的话,想随时随地激活vs环境(例如在编译cmake项目时创建的build目录下)只需要创建一个空的xmake.lua就行,比现在简化太多了。

这块其实也可以不改,因为还有更好的做法,可以进一步搞一个全局环境配置放在<globaldir>/.xmake/environments/<env>/xmake.lua里面。参考python,实际上大家比起每个项目一个环境更需要一个所有项目统一、方便更新升级修改、容易在不同toolchain间切换的本机环境(conda一个base走天下,对比pip每个项目搞一个venv),有这个功能之后编译cmake都不需要创建空xmake.lua,直接xrepo env shell.base完事。这个做法更方便的两点,一是可以基于之前的环境创建新的环境,只要写

includes("../base/xmake.lua")
add_requires(...)

就行。这样基础环境发生更改,所有衍生环境也随之更改了。二是多人合作的项目,xmake.lua提交到云端就不用再改,用到的工具所有人在本地环境里面修改,项目和环境不再绑定在一起。之后xmake-repo支持gcc了,有人用gcc-5,有人用gcc-10,有人用gcc-11(都从xmake-repo安装),xmake.lua里面写add_requires("gcc 10.x")这个版本号写啥都不对,但每个人维护自己的venv就没问题。

@waruqi
Copy link
Member

waruqi commented Oct 22, 2021

其实就是加个 xrepo env 的全局环境管理

@waruqi waruqi changed the title set more environment variables in virtual environment manage and switch global virtual environment in xrepo env/shell Oct 22, 2021
@waruqi
Copy link
Member

waruqi commented Oct 22, 2021

include lib 我加了

添加环境配置文件

$ xrepo env --add /xxx/base.lua

删除环境配置文件

$ xrepo env --remove base

列举环境配置文件

$ xrepo env -l/--list

绑定指定环境配置文件

$ xrepo env -b base shell
$ xrepo env -b myenv shell
$ xrepo env -b base python --version
$ xrepo env -b "python 3.x" python --version

@waruqi waruqi added this to the v2.5.9 milestone Oct 22, 2021
@xq114
Copy link
Contributor Author

xq114 commented Oct 23, 2021

这里脚本xrepo.bat/ps1/sh也要改,我这边研究一下,之后提pr过来;

find_package("system::<package>")里面对头文件和库文件的搜索应该也要增加INCLUDE、LIB、CPATH、C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、LIBRARY_PATH这些环境变量的,这样可以保持和编译器的默认搜索路径一致

@waruqi
Copy link
Member

waruqi commented Oct 23, 2021

find_package 暂时不加了 先 xrepo env 用着吧

@waruqi
Copy link
Member

waruqi commented Oct 25, 2021

这个先这样吧,回头有需要改进的,可以直接pr过来~

@waruqi waruqi closed this as completed Oct 25, 2021
@xq114
Copy link
Contributor Author

xq114 commented Oct 26, 2021

遇到一个问题:目前script里面获取一些信息都是用运行xmake lua --quiet private.xrepo.action.env.info prompt这样的方式,但xmake本身没有-b选项,怎么让private.xrepo.action.env.info调用的_package_addenv()等函数正确获取到bind的值呢?

@waruqi
Copy link
Member

waruqi commented Oct 26, 2021

这个要持久化缓存当前 bind 的环境状态了,可以走 core.cache.localcachexrepo env 进入环境的时候存到本地工程缓存。然后走 env.info 里面取出来

@xq114
Copy link
Contributor Author

xq114 commented Oct 26, 2021

这个要持久化缓存当前 bind 的环境状态了,可以走 core.cache.localcachexrepo env 进入环境的时候存到本地工程缓存。然后走 env.info 里面取出来

感觉这样也不太行,同时可能有很多个shell激活不同的环境。用环境变量或许可以,如果存在对应的环境变量的话从环境变量取bind值

@waruqi
Copy link
Member

waruqi commented Oct 26, 2021

这个要持久化缓存当前 bind 的环境状态了,可以走 core.cache.localcachexrepo env 进入环境的时候存到本地工程缓存。然后走 env.info 里面取出来

感觉这样也不太行,同时可能有很多个shell激活不同的环境。用环境变量或许可以,如果存在对应的环境变量的话从环境变量取bind值

localcache 不是存在临时的fake project 里面的么,不是全局的,可以改进 _enter_project 对不同的 bind 进入不同 fake project dir

如果用户本地自己配了 xmake.lua ,那就也是本地 。。同时开多个 env 原本就不冲突,localcache 都是存在它们自己的 fake project cache

@xq114
Copy link
Contributor Author

xq114 commented Oct 26, 2021

localcache 不是存在临时的fake project 里面的么,不是全局的,可以改进 _enter_project 对不同的 bind 进入不同 fake project dir

如果用户本地自己配了 xmake.lua ,那就也是本地 。。同时开多个 env 原本就不冲突,localcache 都是存在它们自己的 fake project cache

我以为说的是当前目录的cache。cache放fake project问题在于,走script之后所有的命令都是用xmake lua接口+shell脚本完成的,bind信息一开始就无法传给xmake,更不用说创建fake project了

@xq114
Copy link
Contributor Author

xq114 commented Oct 26, 2021

把info单独提出一个文件夹来,或者运行函数的时候可以有多个参数也可以解决

@waruqi
Copy link
Member

waruqi commented Oct 26, 2021

把info单独提出一个文件夹来,或者运行函数的时候可以有多个参数也可以解决

如果只要多参的话 原本就支持,info arg1 arg2 你挨个传就行了

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