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

关于添加自定义安装包、patch及修改源代码的方法和已知问题 #1

Open
adaaaaaa opened this issue Dec 23, 2019 · 21 comments

Comments

@adaaaaaa
Copy link

  - name: 构建自定义文件结构
    run: |
      cd package
      mkdir openwrt-packages
      cd openwrt-packages
      git clone https://github.com/openwrt-develop/luci-theme-atmaterial.git
      git clone https://github.com/KFERMercer/luci-app-serverchan
      git clone https://github.com/rosywrt/luci-theme-rosy
      git clone https://github.com/apollo-ng/luci-theme-darkmatter
      git clone https://github.com/rosywrt/luci-theme-purple
      git clone https://github.com/rufengsuixing/luci-app-adguardhome.git
@tete1030
Copy link
Owner

tete1030 commented Dec 23, 2019

修改upload_feeds
https://github.com/tete1030/openwrt-fastbuild-actions/blob/master/scripts/update_feeds.sh

参见最后一行注释。
注意,如果你添加的luci-包出现po2lmo: command not found问题,这是由于你添加的包缺少依赖设置,这可能是luci-app-普遍存在的共性问题,以后会考虑怎么解决更好,目前你需要在patches目录中添加一个patch文件,patch一行:“PKG_BUILD_DEPENDS += lua/host luci-base/host ”,参考我在"sample“分支patches目录中针对luci-app-mentohust的做法:

https://github.com/tete1030/openwrt-fastbuild-actions/blob/sample/patches/005-luci-app-mentohust-depends-luci.patch

@tete1030 tete1030 added the enhancement New feature or request label Dec 23, 2019
@tete1030 tete1030 changed the title 这些怎么加进编译配置文件里?? 如何添加自定义安装包? Dec 23, 2019
@adaaaaaa
Copy link
Author

adaaaaaa commented Dec 23, 2019

哦豁,我是小白。。。你这个比@KFERMercer的要复杂一些哦。。。🤪🤪🤪

@tete1030
Copy link
Owner

tete1030 commented Dec 23, 2019

本质上都有潜在可能性出现po2lmo的问题,只是我在update_feeds.sh里把所有安装包放在package/feeds目录。你原本的是放在package/openwrt-packages 目录,可能由于名称排序靠后,让你能避免那样的依赖关系错误。

你也不用patch了,直接吧update_feeds.sh的17和18行的package/feeds改成package/openwrt-packages吧

@tete1030
Copy link
Owner

我已经把scripts/update_feeds.sh里用到的目录改成了以z为首字母的名字,似乎不再会出现po2lmo问题
0c80ea4#diff-33e6e534f25e4313d3473f89d1524e40

@tete1030 tete1030 removed the enhancement New feature or request label Dec 24, 2019
@RealKiro
Copy link

RealKiro commented Dec 26, 2019

修改upload_feeds
https://github.com/tete1030/openwrt-fastbuild-actions/blob/master/scripts/update_feeds.sh

参见最后一行注释。

@tete1030
Copy link
Owner

tete1030 commented Dec 26, 2019

修改upload_feeds
https://github.com/tete1030/openwrt-fastbuild-actions/blob/master/scripts/update_feeds.sh
参见最后一行注释。

所有的git clone可以用install_package代替,例如:
git clone https://github.com/jerrykuku/luci-theme-argon.git package/mine/luci-theme-argon_new
改成
install_package luci-theme-argon_new https://github.com/jerrykuku/luci-theme-argon.git

所有的sed命令和mv命令,可以转化成patch放在patches目录

其他的:
cd /home/runner/openwrt 以及 make defconfig
都可以删除

为什么要用patch而不允许自定义脚本直接sed和cp/mv

不同于其他项目,这个项目由于每次编译会重复利用先前的编译环境,下一次编译时存在多方面可能性会让自定义脚本的执行结果不可靠:

  1. 部分已修改的package可能会通过git pull被更新,已修改的文件可能被恢复回原状;新package会加入。这些会导致部分代码已修改,部分代码未修改
  2. 自定义脚本本身可能会更新

如果每次编译都会再次执行自定义脚本以确保你的自定义得到执行,代码可能会陷入混乱状态。

patch的好处是,已apply的patch可以不再被重复apply,可以做到相对的严格。(当然,如果你修改或删除patch,代码同样不再可靠,这时候你需要“re-create your building environment”)

@RealKiro
Copy link

所有的sed命令和mv命令,可以转化成patch放在patches目录

对于sedmvpatch该如何写?写在一个patch文件里还是分开写?

@tete1030
Copy link
Owner

如何将mv/cp命令转化成patch文件

举例 :
cp或mv orig_folder/myfile.txt new_folder/myfile.txt
注意这里new_folder/myfile.txt是相对于openwrt源码根目录而言的
myfile.txt内容:

abc
123
  1. diff -uN a_fake_file_name orig_folder/myfile.txt > 001-myfile.patch
  2. 这时候得到的001-myfile.patch内容为:
--- a_fake_file_name	1970-01-01 08:00:00.000000000 +0800
+++ orig_folder/myfile.txt 	2019-12-26 18:33:22.000000000 +0800
@@ -0,0 +1,3 @@
+abc
+123
+
  1. 将内容第一行中的“file_does_not_exists”改为new_folder/myfile.txt
  2. 将内容第二行中的“orig_folder/myfile.txt”也改为new_folder/myfile.txt
  3. 保存,并把001-myfile.patch放到patches目录内,名字中的001可以改成别的数字,如果不依赖于别的patch,也可以不改它,这是patch的执行顺序,patch会严格按从小到大数字执行patch。

多个patch可以堆放在同一个文件,也可以分开放

@tete1030
Copy link
Owner

tete1030 commented Dec 26, 2019

如何将sed转化为patch

把第一步里的命令替换为
diff -u 修改前文件名 修改后文件名 > 001-myfile.patch
然后把patch文件内的“修改前文件名”和“修改后文件名”都换成目标目录文件名

注意,所有这些步骤是在本地执行的,不是在github actions或docker内

@tete1030
Copy link
Owner

tete1030 commented Dec 27, 2019

@RealKiro 我看了下你现在编译失败的原因

2019-12-26T17:25:09.2801140Z #24 6173.  * satisfy_dependencies_for: Cannot satisfy the following dependencies for luci-app-autoreboot:
2019-12-26T17:25:09.2801462Z #24 6173.  * 	luci-theme-Argon_new * 
2019-12-26T17:25:09.2801803Z #24 6173.  * opkg_install_cmd: Cannot install package luci-app-autoreboot.

我很好奇,你尝试过其他CI编译,它们正常吗,比如Actions-Openwrt或者Openwrt-CI。如果正常,请把相应的编译日志链接发给我看一下

P.S.: 我初步怀疑是你的名称不一致所致。
你在install_package luci-theme-argon_new 时名字用的是小写。在theme.patch里用的是luci-theme-Argon_new,这里是大写。

@RealKiro
Copy link

RealKiro commented Dec 27, 2019

P.S.: 我初步怀疑是你的名称不一致所致。
你在install_package luci-theme-argon_new 时名字用的是小写。在theme.patch里用的是luci-theme-Argon_new,这里是大写。

确实是这个有错误,我更正后再试试,🙏

@RealKiro
Copy link

P.S.: 我初步怀疑是你的名称不一致所致。

感谢🙏,编译成功了

@RealKiro
Copy link

如何将mv/cp命令转化成patch文件

这样做没法和原git clone过的源码保持同步吧?要想同步必须每次git pull 重新做一份patch

@tete1030
Copy link
Owner

tete1030 commented Dec 29, 2019

其实增量编译是在你不频繁更新openwrt和packages代码的情况下比较有用和可靠,主要应对的是你想更改编译参数或想添加删除一两个功能时。如果每次都有更新openwrt本身和所有packages,很可能大量代码需要重新编译,花费的时间不一定短。

增量编译的时候默认也不会拉取最新的openwrt或packages源码,仅使用创建base builder时拉取的版本。(除非你指定了update_repoupdate_feeds)。

如果你确实每次都想更新所有源码,你的patch文件不一定需要每次更新代码时重做,只要你patch的周边代码没有经历大的变动。相对来说这确实是比较严格的补丁操作,能避免出错,但是也造成在不少情况下你需要重新生成patch。

因为,除了patch,我暂时想不到什么好的办法,能既重复利用旧编译状态,又能安全地多次重复执行自定义脚本。其实patch本身也是不够安全稳定的,现有的方法不能正确做到patch本身前后发生变化时,判断一个文件是否已经patch过。

不知你有什么好的建议

Edit:
想到一个办法,但是仍然问题多多:让docker只保存staging_dir,build和bin目录,其它的目录每次使用全新的。但是问题在于,git不恢复/保存文件本身的modified time(source),已patch文件的mod time也难以记录(除非整个目录用另一个git管理)。没有了这些time,增量编译没法发挥作用啊

@tete1030 tete1030 mentioned this issue Dec 29, 2019
@tete1030
Copy link
Owner

有一个办法。把“自定义脚本执行前的源代码”和“build,staging_dir,bin目录”分成两个docker image。这样能保留非patch文件timestamp的一致性。但是这样需要不小的改动

@tete1030 tete1030 changed the title 如何添加自定义安装包? 关于添加自定义安装包、patch及修改源代码的方法和已知问题 Dec 29, 2019
@tete1030 tete1030 pinned this issue Dec 29, 2019
@RealKiro
Copy link

RealKiro commented Jan 6, 2020

有一个办法。把“自定义脚本执行前的源代码”和“build,staging_dir,bin目录”分成两个docker image。这样能保留非patch文件timestamp的一致性。但是这样需要不小的改动

我能力不行无法给您提供帮助,但我想的是有没有可能尽量做到像本地编译那样,加一个判断:当更新或重新上传 config.diff 时从头开始拉源码编译,当只改变 scripts 或 patches 时只在原来编译过的基础上再次编译

@tete1030
Copy link
Owner

tete1030 commented Jan 6, 2020

前段花了一些功夫实现了一个方法,现在还在dev分支测试。�等测试好了就可以使用script来直接修改代码文件了。先不要尝试dev,还很乱,应该有不少bug

现在头疼的是,变化太多,以前花费了很大精力写的README几乎不适用了😂

@adaaaaaa
Copy link
Author

adaaaaaa commented Jan 6, 2020

前段花了一些功夫实现了一个方法,现在还在dev分支测试。

好的,大佬。。。继续加油,奥力给。。。🤪🤪🤪🤪🤪🤪

@zxlhhyccc
Copy link

修改upload_feeds
https://github.com/tete1030/openwrt-fastbuild-actions/blob/master/scripts/update_feeds.sh
参见最后一行注释。

貌似你没再在电报群了,这个项目你成功了吗?

@zhangguanzhang
Copy link

还有人维护吗

@tete1030
Copy link
Owner

tete1030 commented Jun 3, 2022

不再维护

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

No branches or pull requests

5 participants