diff --git a/README.rst b/README.rst new file mode 100644 index 0000000000000000000000000000000000000000..b566e80111187c2dae2d96cd5428f8b6f8dd9c8f --- /dev/null +++ b/README.rst @@ -0,0 +1,546 @@ +总体介绍 +^^^^^^^^ + +oebuild是openEuler Embedded孵化的一个开源项目,是为了辅助开发openEuler +Embedded项目而衍生的辅助开发工具,是openEuler +Embedded项目健康运行的一个催化剂,目前oebuild主要实现了主体框架,业务只涵盖了构建,将来会涉及到CICD,本地测试,云构建等等,oebuild的使用将不仅仅限于命令行窗口,还会搭载上层IDE来使用。yocto实现了构建的灵活性,但是做应用的定制与实现需要有较高的学习成本与环境成本,oebuild将完全摒弃这些开发羁绊,解放你的双手,只需要几个指令,即可获得你要的应用镜像,你不需要去下载代码,不需要去准备编译环境,如果你要的应用不是特有定制的,甚至不要求你去学习如何修改bb文件,一切都可以交给oebuild来做,而oebuild需要的,仅仅是一个网络而已。对,就这么简单!!! + +如何编译一个标准镜像 +^^^^^^^^^^^^^^^^^^^^ + +这里将介绍如何使用oebuild来进行基于openEuler +Embedded项目编译标准的aarch64的qemu应用 + +安装python3和pip +'''''''''''''''' + +oebuild由python语言编写而成,通过pip命令来完成安装,python3与pip的安装会根据运行系统的不同而不同,如果时ubuntu类系统,则通过如下命令安装: + +:: + + apt-get install python3 python3-pip + +如果是centos,则通过如下命令安装: + +:: + + yum install python3 python3-pip + +如果时suse,则通过如下命令安装: + +:: + + zepper install python3 python3-pip + +注1:由于版本或名称可能会有所不同,因此在各系统安装python3或pip时,请根据实际环境来安装,例如:有些系统会默认python即python3,有些系统则需要使用python-is-python3包来安装。 + +注2:如果该系统没有pip包,则可以通过离线方式来安装,预先下载pip包,然后再通过python安装,通过如下命令来完成pip的安装: + +:: + + curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py # 下载安装脚本 + python get-pip.py # python is python3 + +下载oebuild.wheel +''''''''''''''''' + +安装完pip后则可以通过以下命令来完成oebuild的安装 + +:: + + pip install oebuild + +或者点击\ `该地址 `__\ 进入oebuild二进制仓,在该仓下有最新的二进制包,运行以下命令来完成oebuild的安装 + +:: + + pip install + +oebuild会依赖一些第三方库辅助运行,因此相关的第三方库也会直接被安装,如果在安装过程中显示错误,或报第三方库安装请求失败等,请再次重新运行安装oebuild的命令即可。 + +注: +如果安装在安装oebuild时是以root用户执行,则在安装后可以直接运行,如果是以普通用户安装的,则需要注意将普通用户执行路径添加到环境变量中,可以参考以下方式来完成添加: + +1,以普通用户身份打开.bashrc + +:: + + cd ~ && vim .bashrc + +2, +在文件末尾查看是否将命令执行路径添加到环境变量中,该路径一般为\ ``/home//.local/bin``,如果没有,则将以下语句添加到文件末尾 + +:: + + export PATH=/home//.local/bin:$PATH + +在以上命令行中,\ ````\ 表示是你此时的用户名,如果不确定,则可以通过执行\ ``whoami``\ 来确定 + +3,在添加完成后保存退出,vim编辑板的保存推出按键为:先按\ ``esc``\ ,再按\ ``shift + :``, +最后输入\ ``wq``\ 然后按回车键即可 + +4,退出后还需要刷新以下环境变量,执行以下命令完成环境变量的刷新 + +:: + + source ~/.bashrc + +这样你就可以使用oebuild这个工具了,试着执行一下\ ``oebuild -h``\ ,看看能否显示oebuild的帮助信息 + +初始化oebuild目录 +''''''''''''''''' + +运行如下命令完成oebuild的初始化工作: + +:: + + oebuild init + +该操作会初始化oebuild的目录,\ ````\ 表示要初始化目录的名称 + +注:由于oebuild的运行整体依赖docker环境的运行,因此,如果你本地没有安装docker应用,则请按照oebuild给出的提示进行操作,或者按以下给出的方式完成docker的安装 + +1,确定你本机的系统类型,这里以ubuntu为例讲解,执行以下命令完成docker的安装 + +:: + + sudo apt install docker docker.io -y + +2, 添加docker用户组 + +:: + + sudo groupadd docker + +3, 将本用户添加到docker组内 + +:: + + sudo usermod -a -G docker $(whoami) + +4, 重新启动docker + +:: + + sudo systemctl-reload && systemctl restart docker + +5, 修改docker.sock读写权限 + +:: + + sudo chmod o+rw /var/run/docker.sock + +其他操作系统请参考ubuntu方式进行 + +更新oebuild运行环境 +''''''''''''''''''' + +运行如下命令来完成初期环境的准备工作: + +:: + + oebuild update + +更新工作主要有两点:一,pull相关的运行容器镜像;二,从gitee上下载yocto-meta-openeuler仓代码,如果本地没有openeuler相关容器,则在这一步执行会比较漫长,请耐心等待。 + +创建编译配置文件 +'''''''''''''''' + +运行如下命令来产生编译配置文件: + +:: + + oebuild generate + +默认配置文件对应的镜像是aarch64标准镜像 + +执行构建操作 +'''''''''''' + +执行如下命令会进入镜像构建程序: + +:: + + oebuild bitbake openeuler-image + +请耐心等待20分钟,你就可以得到一个标准的openEuler Embedded +aarch64架构的镜像 + +命令介绍 +^^^^^^^^ + +oebuild init +'''''''''''' + +目录初始化指令,主要用于初始化oebuild项目目录,运行该指令在后面需要跟要初始化的目录名,如下: + +:: + + oebuild init [directory] [-u yocto_remote_url] [-b branch] + +directory: +表示要初始化的目录名称(注意:我们无法在已经初始化的目录内再次执行初始化操作) + +yocto_remote_url:yocto-meta-openeuler的remote远程链接 + +branch:yocto-meta-openeuler的分支 + +(注意:oebuild在执行构建任务时是依赖已经适配oebuild的yocto-meta-openeuler的仓的) + +例如初始化demo目录只需要执行如下命令: + +:: + + oebuild init demo + +init命令执行后主要执行两个任务:一是创建src源码目录,创建.oebuild目录,拷贝config配置文件到.oebuild,二是如果设置了-u或-b参数,则对config文件进行相应的修改 + +初始化目录后demo的目录结构如下: + +:: + + .oebuild + config + src + +src:该目录用于存放跟编译相关的源码 + +.oebuild:目录用于存放全局性配置文件,在oebuild执行初始化后,会看到有一个config配置文件,该配置文件将在搭建编译基础环境时应用到。 + +oebuild update +'''''''''''''' + +基础环境更新指令,在执行初始化目录指令后,在执行构建环节之前必须要先执行该命令。 + +:: + + oebuild update [-t docker_tag] [-l list] [-i ignore] [-e enable] + +-t: 指更新哪个tag的容器 + +-l: 表示列出可选资源列表,目前只有docker这一项 + +-i: +表示在更新时忽略哪一项,可选的有docker与meta,docker代表容器镜像,meta代表yocto-meta-openeuler仓 + +-e: 表示在更新时使能哪一项,可选范围与解释同上 + +执行更新操作如下命令: + +:: + + oebuild update + +oebuild执行构建有两个必要的前提,一是构建需要的容器,二是主构建仓(yocto-meta-openeuler)。所以更新命令主要以这两部分展开 + +另外,如果我们有自己的oebuild适配仓,可以在\ ``config``\ 配置文件中修改(该文件在\ ``/.oebuild``\ 目录下),如果已经先执行过更新操作,然后再次执行\ ``oebuild update``\ 会将原有的\ ``yocto-meta-openeuler``\ 做备份,将在工作空间根目录下创建yocto-bak备份目录,然后将备份后的\ ``yocto-meta-openeuler``\ 移动到该目录。更改基础仓在config中的如下字段修改: + +:: + + basic_repo: + yocto_meta_openeuler: + path: yocto-meta-openeuler + remote_url: https://gitee.com/openeuler/yocto-meta-openeuler.git + branch: master + +basic_repo与yocto-meta-openeuler是两个key键,不可以更改,remote_url与branch可以更改成自己已经适配的\ ``yocto-meta-openeuler``\ 仓的参数 + +注:如果我们不输入任何参数,即直接执行\ ``oebuild update``\ ,则默认更新容器镜像和基础仓 + +oebuild generate +'''''''''''''''' + +创建配置文件指令,而该命令就是用来产生配置文件的。 + +:: + + oebuild generate [-p platform] [-f features] [-t toolchain_dir] [-d build_directory] [-l list] + +-p:cpu类型参数,全称\ ``platform``\ ,生成配置文件需要的一个参数,默认为aarch64-std + +-f:特性参数,全称\ ``feature``\ ,生成配置文件需要的一个参数,没有默认值 + +-t:外部编译链参数,全称\ ``toolchain_dir``\ ,生成配置文件需要的一个参数,没有默认值,该值表示如果我们不需要系统提供的交叉编译链而选择自己的交叉编译链,则可以选择该参数。 + +-d:初始化的编译目录,如果不设置该参数,则初始化的编译目录和-p参数保持一致 + +-l: +list参数,有两个可选范围,platform和feature,platform则会列出支持的platform列表,feature则会列出支持的feature列表 + +oebuild在构建时依赖compile.yaml配置文件来完成构建操作,创建配置文件指令已经属于构建指令内容,该操作将会检查\ ``yocto-meta-openeuler``\ 是否适配了oebuild,检查是否适配的规则便是是否在\ ``yocto-meta-openeuler``\ 根目录创建了\ ``.oebuild``\ 隐藏目录,而\ ``-p``\ 则会解析\ ``.oebuild/platform``\ 下相应的平台配置文件,\ ``-f``\ 参数则会解析\ ``.oebuild/feature``\ 下相应的配置文件,该参数是可以多值传入的,例如如下范例: + +:: + + oebuild generate -p aarch64-std -f systemd -f openeuler-qt + +则生成的构建配置文件会涵盖\ ``systemd openeuler-qt``\ 两者的特性 + +最终会在编译目录下(在执行完\ ``oebuild generate``\ 后按提示给出的路径即为编译目录)生成构建配置文件\ ``compile.yaml``,关于该配置文件的详细介绍请参考配置文件介绍中的\ ``compile.yaml``\ 。在下一步的构建流程会解析该配置文件,在此之前,用户可以根据自身特定场景环境来修改配置文件,因为按该\ ``oebuild generate``\ 指令生成的配置文件仅算作一个参考模板,目的是给用户一个最基本的模板参考用,减少用户学习的成本,使用户能够快速上手。 + +oebuild bitbake +''''''''''''''' + +构建指令,该指令会解析\ ``compile.yaml``\ (通过\ ``oebuild generate``\ 指令生成的),然后完成构建环境的初始化工作。该命令参数如下: + +-h:帮助命令,通过执行 + +:: + + oebuild bitbake -h + +来获取帮助 + +一般来说,启动后的容器挂在的目录映射关系如下: + +:: + + /src:/usr1/openeuler/src + /build/:/usr1/openeuler/build + +如果在\ ``compile.yaml``\ 中有\ ``toolchain_dir``\ 参数,即有用户自定义外部工具链,则会增加一个挂载目录,如下: + +:: + + :/usr1/openeuler/native_gcc + +oebuild upgrade +''''''''''''''' + +在线升级指令,该指令会请求远程oebuild版本信息,通过和本地oebuild版本对比来判断是否进行升级 + +由于oebuild二进制包存放在gitee仓库中,因此oebuild在升级时会先克隆最新的二进制仓到用户根目录,并以一个随机文件名命名,然后执行\ ``sudo pip install ``\ 来完成升级,在这之中会要求用户输入root密码,在完成升级后会自动删除oebuild二进制包 + +配置文件介绍 +^^^^^^^^^^^^ + +oebuild在生成后有多个配置文件,每个配置文件的作用域不同,下面将介绍各配置文件存放位置以及内容 + +config +'''''' + +oebuild在外围环境的配置文件,该配置文件存放在oebuild项目根目录下的.oebuild目录中,该配置文件结构如下: + +:: + + docker: + repo_url: swr.cn-north-4.myhuaweicloud.com/openeuler-embedded/openeuler-container + tag_map: + openEuler-22.09: '22.09' + openEuler-22.03-lts-sp1: 22.03-lts-sp1 + master: latest + basic_repo: + yocto_meta_openeuler: + path: yocto-meta-openeuler + remote_url: https://gitee.com/openeuler/yocto-meta-openeuler.git + branch: master + +**docker**: +表示构建容器相关信息,在该字段下面所列的容器镜像,在执行\ ``oebuild update``\ 后会下载相应的容器 + +​ repo_url: 表示openEuler Embedded的docker远程仓地址 + +​ tag_map: 表示每个openEuler Embedded版本对用的docker构建容器tag + +**basic_repo**:表示基础的repo仓,顾名思义,表示在构建之前是作为底座的角色存在的,在执行\ ``oebuild update``\ 时会解析config配置文件,然后下载相应的构建代码仓 + +​ yocto-meta-openeuler: 目前oebuild唯一的基础仓 + +​ path: 该仓下载的路径名称 + +​ remote_url: 该仓的远程地址 + +​ branch: 该仓的分支 + +.env +'''' + +编译目录配置文件结构如下: + +:: + + container: + remote: xxxxxxxxxxxx + branch: xxxxxxxxxxxx + short_id: xxxxxxxxxx + volumns: + - /xxxxxxxxxxx + - /xxxxxxxxxxx + +container:表示容器相关配置信息 + +​ remote: 表示\ ``yocto-meta-openeuler``\ 远程url + +​ branch: 表示\ ``yocto-meta-openeuler``\ 分支信息 + +​ short_id: 表示容器ID + +​ volumns: 表示容器挂在的目录映射 + +oebuild在执行构建过程中,会解析\ ``.env``\ 配置文件,通过对比环境中的其他参数确定是否重新创建一个新的容器还是启用旧容器,比对的内容包括(remote,branch,volumns)只有这三个参数与要构建的对应参数一致,才会继续拉起旧容器,否则就会创建一个新的容器。另外oebuild也会检查设置的short_id对用的容器是否存在,不存在也会创建一个新的容器。在创建新的容器后,新的配置信息会重新写入到\ ``.env``\ 中 + +compile.yaml +'''''''''''' + +构建配置文件,该配置文件结构如下: + +:: + + platform: aarch64-std + machine: qemu-aarch64 + toolchain_type: EXTERNAL_TOOLCHAIN_aarch64 + sdk_dir: + toolchain_dir: + repos: + yocto-poky: + url: https://gitee.com/openeuler/yocto-poky.git + path: yocto-poky + refspec: openEuler-22.09 + + yocto-meta-openembedded: + url: https://gitee.com/openeuler/yocto-meta-openembedded.git + path: yocto-meta-openembedded + refspec: dev_hardknott + + yocto-meta-ros: + url: https://gitee.com/openeuler/yocto-meta-ros.git + path: yocto-meta-ros + refspec: dev_hardknott + local_conf: | + - xxx + - xxx + layers: + - xxx + - xxxx + +platform:表示cpu架构, + +machine:表示机器类型 + +toolchain_type: 表示编译链类型 + +sdk_dir: 保留字段 + +toolchain_dir:表示自定义外部编译链路径,如果在\ ``oebuild generate``\ 设置了该参数\ ``-t``\ ,则会在\ ``compile.yaml``\ 存在该字段 + +repos: 表示在初始化构建环境时需要用到的仓 + +​ url: 表示仓的远程地址 + +​ path: 表示仓在本地的地址 + +​ refspec:表示仓的版本分支 + +local_conf:local.conf替换内容,该值在oebuild执行完oe_init后将替换\ ``build/conf/local.conf``\ 中匹配到的内容 + +layers: +meta层,该值在oebuild执行完oe_init后将通过调用\ ``bitbake-layers add-layer``\ 来添加meta层 + +开发者帮助 +^^^^^^^^^^ + +oebuild项目欢迎广大爱好开发者参与贡献oebuild的发展,为了使开发者更快更好的参与到oebuild的开发工作中来,我们专门写了如下指导。 + +oebuild目录介绍 +''''''''''''''' + +打开oebuild仓我们可以看到,oebuild一级目录有如下内容: + +:: + + docs + src + .gitignore + MANIFEST.in + README.md + setup.py + +docs:文档目录,该目录用于存放关于oebuild的介绍性信息 + +src:核心源码目录,我们真正运行oebuild的核心源码就存放在这里,后续介绍关于参与开发oebuild的详细流程将会详细介绍该目录内容 + +.gitignore:git提交忽略的文件,在该文件中通过设置的内容可以在git提交时自动忽略 + +MANIFEST.in:该文件为pip在打包时包含额外文件的配置文件,在该文件中的内容将在执行python打包时按规则进行包含 + +README.md:简要介绍性文件 + +setup.py:python打包入口文件 ,我们最终要打包wheel包就要通过该文件来完成 + +如何使用setup.py进行调试或打包 +'''''''''''''''''''''''''''''' + +在我们完成相关的开发性工作并进行调试时,将通过setup.py内的相关设置来完成该工作 + +打开setup.py文件,我们可以看到其内容如下: + +:: + + # Copyright 2018 Open Source Foundries Limited. + # Copyright (c) 2020, Nordic Semiconductor ASA + # + # SPDX-License-Identifier: Apache-2.0 + + import os + + import setuptools + + SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) + os.chdir(SCRIPT_DIR) + + with open('README.md', 'r') as f: + long_description = f.read() + + with open('src/oebuild/version.py', 'r') as f: + __version__ = None + exec(f.read()) + assert __version__ is not None + + version = os.environ.get('OEBUILD_VERSION', __version__) + + setuptools.setup( + name='oebuild', + version=version, + author='alichinese', + author_email='', + description='', + long_description=long_description, + # http://docutils.sourceforge.net/FAQ.html#what-s-the-official-mime-type-for-restructuredtext-data + long_description_content_type="text/x-rst", + url='', + packages=setuptools.find_packages(where='src'), + package_dir={'': 'src'}, + include_package_data=True, + classifiers=[ + 'Programming Language :: Python :: 3', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: POSIX :: Linux', + ], + install_requires=[ + 'setuptools', + 'packaging', + 'PyYaml', + 'docker', + 'GitPython', + 'colorama', + 'ruamel.yaml' + ], + python_requires='>=3.8', + entry_points={'console_scripts': ('oebuild = oebuild.app.main:main',)}, + ) + +可以看到引入的模块儿有\ ``setuptools``,这个是打包的核心模块儿,关于其他的介绍我们暂且不管,因为对于开发者来说几乎没改动,这里我们着重介绍以下\ ``install_requires``\ ,该设置从字面意思理解就是依赖的必要安装,也就是说oebuild运行要依赖的第三方库,如果我们在后续的oebuild开发过程中有一些其他库的依赖,则需要在这里添加。 + +在进入oebuild目录后,我们可以执行以下命令进入调试状态: + +:: + + pip install -e . + +注:以上命令的运行如果以普通用户运行,需要先确认是否将本地执行路径添加到环境变量\ ``PATH``\ 中,如果以root用户运行则不需要考虑,这样我们可以直接运行oebuild相关指令 + +这样在后续开发与调试过程中,我们可以随时改代码随时生效 + +src源码介绍 +''''''''''' + +正在完善中… diff --git a/setup.py b/setup.py index bad987e3fb2c5b7ead03ee6f1f9edf9302c1951a..6f9a917d59ae575fb8d1ea1a51ff13f233955ffa 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ import setuptools SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) os.chdir(SCRIPT_DIR) -with open('README.md', 'r') as f: +with open('README.rst', 'r') as f: long_description = f.read() with open('src/oebuild/version.py', 'r') as f: diff --git a/src/oebuild/app/conf/plugins.yaml b/src/oebuild/app/conf/plugins.yaml index 78d45ccd76d485dc8e149b68fe82c7999476a979..7b48bb21c1bf5d656c8cb540bd6111ea06299bed 100644 --- a/src/oebuild/app/conf/plugins.yaml +++ b/src/oebuild/app/conf/plugins.yaml @@ -11,6 +11,3 @@ plugins: - name: bitbake class: Bitbake path: plugins/bitbake/bitbake.py -- name: upgrade - class: Upgrade - path: plugins/upgrade/upgrade.py \ No newline at end of file diff --git a/src/oebuild/app/conf/upgrade.yaml b/src/oebuild/app/conf/upgrade.yaml deleted file mode 100644 index a5c4339e5aed9422a9ce5fa29b9255c2490a1e9d..0000000000000000000000000000000000000000 --- a/src/oebuild/app/conf/upgrade.yaml +++ /dev/null @@ -1,3 +0,0 @@ -remote_url: https://gitee.com/alichinese/oebuild-bin.git -branch: master -ver_file: version \ No newline at end of file diff --git a/src/oebuild/app/plugins/generate/generate.py b/src/oebuild/app/plugins/generate/generate.py index 9940ee3fdc76d53ac3d12068b3870d318d8b174a..ca23d7a1679a816637432205e4a6769ae60b7993 100644 --- a/src/oebuild/app/plugins/generate/generate.py +++ b/src/oebuild/app/plugins/generate/generate.py @@ -62,7 +62,13 @@ class Generate(OebuildCommand): parser.add_argument('-s', dest='sstate_cache', help=''' - this param is for sstate_cache directory + this param is for SSTATE_MIRRORS + ''' + ) + + parser.add_argument('-s_dir', dest='sstate_dir', + help=''' + this param is for SSTATE_DIR ''' ) @@ -96,6 +102,11 @@ class Generate(OebuildCommand): ''' ) + parser.add_argument('-dt', '--datetime', dest = "is_datetime", action = "store_true", + help=''' + this param is add DATETIME to local.conf, the value is getting current time + ''') + parser.add_argument('-b_in', dest='build_in', choices=[BUILD_IN_DOCKER, BUILD_IN_HOST], default = BUILD_IN_DOCKER, help=''' This parameter marks the mode at build time, and is built in the container by docker @@ -184,7 +195,8 @@ class Generate(OebuildCommand): toolchain_dir= self.toolchain_dir, build_in=build_in, sstate_cache= self.sstate_cache, - tmp_dir = self.tmp_dir + tmp_dir = self.tmp_dir, + is_datetime=args.is_datetime )) log.info("=============================================") diff --git a/src/oebuild/app/plugins/upgrade/upgrade.py b/src/oebuild/app/plugins/upgrade/upgrade.py deleted file mode 100644 index 7cbda832a05766592a75eafd1cd98df080f2c6b3..0000000000000000000000000000000000000000 --- a/src/oebuild/app/plugins/upgrade/upgrade.py +++ /dev/null @@ -1,96 +0,0 @@ -''' -Copyright (c) 2023 openEuler Embedded -oebuild is licensed under Mulan PSL v2. -You can use this software according to the terms and conditions of the Mulan PSL v2. -You may obtain a copy of Mulan PSL v2 at: - http://license.coscl.org.cn/MulanPSL2 -THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -See the Mulan PSL v2 for more details. -''' - -import textwrap -import argparse -import pathlib -import os -import getpass -import shutil - -import requests - -from oebuild.command import OebuildCommand -import oebuild.util as oebuild_util -from oebuild.ogit import OGit -from oebuild.my_log import MyLog as log - -class Upgrade(OebuildCommand): - ''' - the command for oebuild upgrade - ''' - def __init__(self): - super().__init__( - 'upgrade', - 'the command to upgrade oebuild', - textwrap.dedent('''\ - you can run this command to upgrade oebuild -''' - )) - - def do_add_parser(self, parser_adder): - parser = self._parser( - parser_adder, - usage=''' - - %(prog)s -''') - - return parser - - def do_run(self, args: argparse.Namespace, unknown = None): - ''' - Implement the online upgrade function by comparing - the local version and the remote version, and perform - the online upgrade function if there is inconsistency. - The upgrade method is to download the remote oebuild - binary warehouse locally, then execute 'pip install *.whl', - and then delete the local binary warehouse - ''' - args.parse_args(unknown) - - upgrade_conf_dir = oebuild_util.get_upgrade_yaml_dir() - upgrade_conf = oebuild_util.read_yaml(pathlib.Path(upgrade_conf_dir)) - ver_url = os.path.join(upgrade_conf['remote_url'], - 'raw', - upgrade_conf['branch'], - upgrade_conf['ver_file']) - response = requests.get(url=ver_url, timeout=5) - if response.status_code == 200: - log.info("the oebuild is latest version") - else: - log.err("download faild") - return - - version = oebuild_util.get_oebuild_version() - if version != response.content.decode(): - self.download_binary(upgrade_conf['remote_url'], upgrade_conf['branch']) - - def download_binary(self, remote_url, branch): - ''' - download oebuild binary package and install it - ''' - while True: - random_str = oebuild_util.generate_random_str(6) - random_repo_dir = os.path.join('/home',getpass.getuser(), random_str) - if os.path.exists(random_repo_dir): - continue - break - ogit = OGit(repo_dir=random_repo_dir, remote_url=remote_url, branch= branch) - ogit.clone_or_pull_repo() - - for f_name in os.listdir(random_repo_dir): - if f_name.endswith("whl"): - oebuild_file = f_name - os.system(f"pip install {os.path.join(random_repo_dir,oebuild_file)}") - if os.path.exists(random_repo_dir): - shutil.rmtree(random_repo_dir) diff --git a/src/oebuild/docker_proxy.py b/src/oebuild/docker_proxy.py index 7c9022df3560dec0f7d6d3eeeae05dbacc22c4ca..48b2c70e22ee985422fc05749c559ce54124c2fa 100644 --- a/src/oebuild/docker_proxy.py +++ b/src/oebuild/docker_proxy.py @@ -255,7 +255,7 @@ class DockerProxy: return container, res.output - def container_run_simple(self, image:str, volumes: list): + def container_run_simple(self, image:str, volumes: list, network="host"): ''' it's just create a tty docker container to do some thing next ''' @@ -263,6 +263,7 @@ class DockerProxy: image=image, command="bash", volumes=volumes, + network_mode=network, detach=True, tty=True ) diff --git a/src/oebuild/local_conf.py b/src/oebuild/local_conf.py index ef3241e7d7859f790163c9fc48de53ce98f46f66..4cf9a51e8a697ab233acd3ce529d6c74028401be 100644 --- a/src/oebuild/local_conf.py +++ b/src/oebuild/local_conf.py @@ -34,6 +34,7 @@ NATIVESDK_SYSROOT = "sysroots/x86_64-pokysdk-linux" OPENEULER_SP_DIR = "OPENEULER_SP_DIR" NATIVESDK_ENVIRONMENT = "environment-setup-x86_64-pokysdk-linux" SSTATE_MIRRORS = "SSTATE_MIRRORS" +SSTATE_DIR = "SSTATE_DIR" TMP_DIR = "TMPDIR" NATIVE_GCC_DIR = '/usr1/openeuler/native_gcc' @@ -106,12 +107,10 @@ class LocalConf: # replace toolchain if parse_compile.toolchain_dir is not None: - replace_toolchain_str = parse_compile.toolchain_type + ' = "' if parse_compile.build_in == BUILD_IN_DOCKER: - replace_toolchain_str += NATIVE_GCC_DIR + '"' + replace_toolchain_str = f'{parse_compile.toolchain_type} = "{NATIVE_GCC_DIR}"' else: - replace_toolchain_str += parse_compile.toolchain_dir - replace_toolchain_str += '"' + replace_toolchain_str = f'{parse_compile.toolchain_type} = "{parse_compile.toolchain_dir}"' content = match_and_replace( pre=parse_compile.toolchain_type, new_str=replace_toolchain_str, @@ -124,7 +123,7 @@ class LocalConf: nativesdk_sys_dir = os.path.join(parse_compile.nativesdk_dir, NATIVESDK_SYSROOT) content = match_and_replace( pre=NATIVESDK_DIR_NAME, - new_str=NATIVESDK_DIR_NAME + ' = "' + nativesdk_sys_dir + '"', + new_str=f'{NATIVESDK_DIR_NAME} = "{nativesdk_sys_dir}"', content=content ) @@ -145,7 +144,15 @@ class LocalConf: new_str= f"file://.* file://{parse_compile.sstate_cache}/PATH" content = match_and_replace( pre=SSTATE_MIRRORS, - new_str= SSTATE_MIRRORS + ' = "' + new_str + '"', + new_str = f'{SSTATE_MIRRORS} = "{new_str}"', + content=content + ) + + # replace sstate_dir + if parse_compile.sstate_dir is not None: + content = match_and_replace( + pre=SSTATE_DIR, + new_str = f'{SSTATE_DIR} = "{parse_compile.sstate_dir}"', content=content ) @@ -153,14 +160,12 @@ class LocalConf: if parse_compile.tmp_dir is not None: content = match_and_replace( pre=TMP_DIR, - new_str= TMP_DIR + ' = "' + parse_compile.tmp_dir + '"', + new_str = f'{TMP_DIR} = "{parse_compile.tmp_dir}"', content=content ) content = self.match_lib_param(content=content) - content = self._match_lib(parse_compile=parse_compile, content=content) - content = self.replace_param(parse_compile=parse_compile, content=content) with open(local_dir, 'w', encoding="utf-8") as r_f: @@ -170,31 +175,16 @@ class LocalConf: ''' add params LIBC, TCMODE-LIBC, crypt ''' - new_content = '' - for line in content.split('\n'): - ret = re.match('^(LIBC)', line.strip()) - if ret is not None: - continue - ret = re.match('^(TCMODE-LIBC)', line.strip()) - if ret is not None: - continue - ret = re.match('^(crypt)', line.strip()) - if ret is not None: - continue - new_content = new_content + line + '\n' - return new_content - - def _match_lib(self, parse_compile: ParseCompile, content: str): - if parse_compile.toolchain_dir is not None and 'musl' in parse_compile.toolchain_dir: - content = content + 'LIBC = "musl"\n' - content = content + 'TCMODE-LIBC = "musl"\n' - content = content + 'crypt = "musl"\n' - content.replace('aarch64-openeuler-linux-gnu', 'aarch64-openeuler-linux-musl') - else: - content = content + 'LIBC = "glibc"\n' - content = content + 'TCMODE-LIBC = "glibc-external"\n' - content = content + 'crypt = "libxcrypt-external"\n' - content.replace('aarch64-openeuler-linux-musl', 'aarch64-openeuler-linux-gnu') + lib_param_list = { + "LIBC": "glibc", + "TCMODE-LIBC": "glibc-external", + "crypt": "libxcrypt-external"} + + for key, value in lib_param_list.items(): + content = match_and_replace( + pre = key, + new_str = f'{key} = "{value}"', + content = content) return content def replace_param(self, parse_compile: ParseCompile, content:str): @@ -206,7 +196,7 @@ class LocalConf: if ret is not None: content = match_and_add(line, content) continue - ret = re.match(r'^([A-Z0-9_]+)([a-z_/]+)(\s)', line) + ret = re.match(r'^([A-Z0-9a-z_-]+)(\s)', line) if ret is not None: content = match_and_replace(ret.group(), line, content) continue diff --git a/src/oebuild/parse_compile.py b/src/oebuild/parse_compile.py index b8a0e05bbb6efb60152b916bcadfdaeefdaa4181..d1f678b8de225da510c4b6288d0808d7fa1319df 100644 --- a/src/oebuild/parse_compile.py +++ b/src/oebuild/parse_compile.py @@ -33,6 +33,8 @@ class Compile(PlatformTemplate): sstate_cache: str + sstate_dir: str + tmp_dir: str class BaseParseCompileError(ValueError): @@ -78,6 +80,7 @@ class ParseCompile: toolchain_dir=None if 'toolchain_dir' not in data else data['toolchain_dir'], nativesdk_dir=None if 'nativesdk_dir' not in data else data['nativesdk_dir'], sstate_cache=None if 'sstate_cache' not in data else data['sstate_cache'], + sstate_dir=None if 'sstate_dir' not in data else data['sstate_dir'], tmp_dir=None if 'tmp_dir' not in data else data['tmp_dir'], not_use_repos=False if 'not_use_repos' not in data else data['not_use_repos'], repos=None if "repos" not in data else ParseTemplate.parse_oebuild_repo(data['repos']), @@ -155,6 +158,13 @@ class ParseCompile: ''' return self.compile.sstate_cache + @property + def sstate_dir(self): + ''' + return attr of sstate_cache + ''' + return self.compile.sstate_dir + @property def tmp_dir(self): ''' diff --git a/src/oebuild/parse_template.py b/src/oebuild/parse_template.py index 4dd85037095757cd6b0730fd0aee3e32bb8768ec..29f2c74a5007e03d529e6e956b755c7ceb495ba7 100644 --- a/src/oebuild/parse_template.py +++ b/src/oebuild/parse_template.py @@ -14,6 +14,7 @@ from dataclasses import dataclass from typing import Dict import pathlib import os +import time from ruamel.yaml.scalarstring import LiteralScalarString @@ -167,7 +168,8 @@ class ParseTemplate: toolchain_dir = None, build_in: str = BUILD_IN_DOCKER, sstate_cache = None, - tmp_dir = None): + tmp_dir = None, + is_datetime = False): ''' first param common yaml ''' @@ -225,6 +227,12 @@ class ParseTemplate: if feature.local_conf is not None: local_conf = LiteralScalarString(feature.local_conf + local_conf) + if is_datetime: + now_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) + datetime_str = LiteralScalarString(f'DATETIME = "{now_time}"') + print(datetime_str) + local_conf = LiteralScalarString(local_conf + datetime_str) + compile_conf = { 'build_in': build_in, 'platform': self.platform_template.platform, diff --git a/src/oebuild/version.py b/src/oebuild/version.py index dbe2c45d10808cd830f2b604babd857d077659b8..c0c53a970c401e33b0192a6cff4e4648df376afe 100644 --- a/src/oebuild/version.py +++ b/src/oebuild/version.py @@ -10,4 +10,4 @@ MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details. ''' -__version__ = '0.0.1' +__version__ = '0.0.6'