btwise 发表于 2017-10-30 09:23

关于CLOVER引导器的编译及自定义菜单安装(二)

本帖最后由 btwise 于 2017-10-31 13:19 编辑

   上一节说了标准的CLOVER编译及其打包过程,那么想自定义如何搞呢,下面一步一步来说一下。自定义安装包背景
[*]上一节中说了,buildclover的源码中有一个目录,就是我们用来自定义修改的各种资源,其他的大多是一些脚本和Ç程序的源码,不懂咱就不动它,只搞搞能看明白的地方http://101.201.65.1/content/images/2017/10/s3-1.jpghttp://101.201.65.1/content/images/2017/10/s4-1.jpghttp://101.201.65.1/content/images/2017/10/s5-1.jpg具体路径就是〜/ src / edk2 / Clover / CloverPackage / package这个下面,其中〜代表你自己的用户目录打开〜/ src / edk2 / Clover / CloverPackage / package / Resources,里面有个background.tiff ,这个就是将来安装包运行时候的背景,你可以自己设计一个符合你的,格式大小必须和之前一样,我自己的时这个样子的:http://101.201.65.1/content/images/2017/10/background.png然后下面是一个模板的模板目录,里面有三个HTML文件,打开看看就知道了,对应的时安装界面背景上得一些描述说明,介绍等等,支持简单的HTML语法,复杂的不支持,我已经试过了,还有个文件是Localizable.strings文件,这个对应的安装选项内容的字符串,当然在其他目录有对应字符串的多种语言,因为它是多语言的,根据系统语言版本自动显示语言内容,当然我们也可以强行写成中文,但是没必要!Localizable.strings的内容:
它将尝试使用有效的PBR签名启动第一个EFI / FAT32 / HFS分区(在MBR中定义,然后是GPT)。“;”boot0ss_title“=”将boot0ss安装在MBR“;”boot0ss_description“=”用于BIOS主板上的BIOS启动。boot0ss(boot0签名扫描)bootloader尝试启动第一个具有有效PBR签名的EFI / FAT32 / HFS分区(在MBR中定义,然后GPT定义)。如果没有找到分区,它将尝试引导在MBR中定义的活动分区。当您将Windows安装在同一个磁盘上时,此引导加载程序是一个不错的选择,因为Windows要使其分区处于活动状态。此选项不会激活MBR中的任何分区。“; ............-------------------------------------------------- -------------------------- 自定义安装包语言和图标
[*]打开〜/ SRC / edk2 /三叶草/ CloverPackage /包目录,里面有一个Icon.zip这个文件,就是生产的安装包对应的图标文件,具体是一个具有高分辨率结构的图标图标文件,具体如何生成,可以找百度,我用的好像是images2icon这个软件做得;然后有一个PO目录,里面是一些PO格式的文件,修改用poEdit的这个软件修改,里面对应的前面的资源文件英文对应的中文翻译,我们只需要修改zh_CN.po就可以了!
自定义安装包的内容和菜单
[*]这部分是修改安装包得关键之处,脚本采用LINUX / UNIX的SHELL脚本语法,对这些熟悉的人可能能做出更为细致的菜单内容,包括对应的脚本模块,我这方面欠缺,只看懂个大概,所以只能做一些粗矿的选项来实现!同样在〜/ src / edk2 / Clover / CloverPackage / package这个目录下,有个叫buildpkg.sh的脚本文件,用文本编辑器打开它,可以看到它的内容:
#!/ bin / bash#old = 1755 = $ {SRCROOT} /package/buildpkg.sh $ {SYMROOT} / package;#new=1756=@${SRCROOT}/package/buildpkg.sh“$(SRCROOT)” “$(SYMROOT)”“$(PKG_BUILD_DIR)”#1 = SRCROOT = $(CURDIR)#2 = SYMROOT = $(SRCROOT)/ sym#3 = PKG_BUILD_DIR = $(SYMROOT)/ package#$ 3存储内置包的路径#防止脚本做坏事情-u#中止与未设置的变量......#添加一个组choiceaddGroupChoices(){#可选参数:#--title =:强制标题#--description = <description> :强制描述#--parent = <parent>:父组选择id#--exclusive_zero_or_one_choice:组中只能选择零个或一个选项#--exclusive_one_choice:组##$ 1中只能选择一个选项选择ID .......... ...............#build core EFI folder package echo“===================== EFI folder ================= ====“packagesidentity =”$ clover_package_identity“choiceId =”EFIFolder“rm -rf $ {PKG_BUILD_DIR} / $ {choiceId} / Root / EFI mkdir -p $ {PKG_BUILD_DIR} / $ {choiceId} / Root / EFI mkdir- p $ {PKG_BUILD_DIR} / $ {choiceId} / Scripts#将partutil二进制文件作为辅助程序添加到挂载ESP上 ---noextattr --noqtn $ {SYMROOT} / utils / partutil $ {PKG_BUILD_DIR} / $ {choiceId} / Scripts / addTemplateScripts --pkg-rootdir =“$ {PKG_BUILD_DIR} / $ {choiceId}”\ --subst =“CLOVER_PACKAGE_IDENTITY = $ clover_package_identity”\ --subst =“INSTALLER_TARGET_ESP_REFID = $ installer_target_esp_refid”\ $ {choiceId} rsync -r- 排除=。svn --exclude =“*〜”--exclude ='drivers *'\ $ {SRCROOT} / CloverV2 / EFI / BOOT $ {PKG_BUILD_DIR} / $ {choiceId} / Root / EFI / rsync -r --exclude =。 svn --exclude =“*〜”--exclude ='drivers *'\ $ {SRCROOT} / CloverV2 / EFI / CLOVER $ {PKG_BUILD_DIR} / $ {choiceId} / Root / EFI / [[“$ add_ia32” 1]] && rm -rf $ {PKG_BUILD_DIR} / $ {choiceId} / Root / EFI / drivers32#config.plist rm -f $ {PKG_BUILD_DIR} / $ {choiceId} /Root/EFI/CLOVER/config.plist& / dev / null fixperms“$ {PKG_BUILD_DIR} / $ {choiceId} / Root /”packageRefId = $(getPackageRefId“$ {packagesidentity}”“$ {choiceId}”)buildpackage“$ packageRefId”“$ {choiceId}”“$ {PKG_BUILD_DIR} / $ {choiceId}“”/ EFIROOTDIR“addChoice --start-visible =”false“--start-selected =”true“--pkg-refs =”$ packageRefId“”$ {choiceId}“#结束构建EFI文件夹包#构建必需的驱动程序-x64UEFI packagesif [[-d”$ {SRCROOT} / CloverV2 / EFI / CLOVER / drivers64UEFI“ ];然后回显“=============== drivers64 UEFI mandatory ===============”packagesidentity =“$ {clover_package_identity}”。drivers64UEFI。强制本地驱动程序=($(找到“$ {SRCROOT} / CloverV2 / EFI / CLOVER / drivers64UEFI”-type f -name'* .efi'-depth 1))local driverDestDir ='/ EFIROOTDIR / EFI / CLOVER / drivers64UEFI'对于((i = 0; i <$ {#drivers [@]}; i ++))do local driver =“$ {drivers [$ i] ## * /}”local driverChoice =“$ {driver%.efi} .UEFI“ditto --noextattr --noqtn --arch i386”$ {drivers [$ i]}“”$ {PKG_BUILD_DIR} / $ {driverChoice} / Root /“find”$ {PKG_BUILD_DIR} / $ {driverChoice}“-name”.DS_Store'-exec rm -R -f {} \; 2> / dev / null fixperms“$ {PKG_BUILD_DIR} / $ {driverChoice} / Root /”packageRefId = $(getPackageRefId“$ {packagesidentity}”“$ {driverChoice}”)#添加VBoxHfs驱动程序的postinstall脚本,如果HFSPlus驱动程序存在,则将其删除“$ packageRefId”“$ {driverChoice}”“$ {PKG_BUILD_DIR} / $ {driverChoice} “$ {driverDestDir}”addChoice --start-visible =“false”--start-selected =“true”--pkg-refs =“$ packageRefId”“$ {driverChoice}”rm -R -f“$ { PKG_BUILD_DIR} / $ {driverChoice}“完成fi#结束强制驱动-x64UEFI包#build packagesmain#build meta packagemakedistributio ......2> / dev / null fixperms“$ {PKG_BUILD_DIR} / $ {driverChoice} / Root /”packageRefId = $(getPackageRefId“$ {packagesidentity}”“$ {driverChoice}”)#添加VBoxHfs驱动程序的postinstall脚本, HFSPlus driver existsbuildpackage“$ packageRefId”“$ {driverChoice}”“$ {PKG_BUILD_DIR} / $ {driverChoice}”“$ {driverDestDir}”addChoice --start-visible =“false”--start-selected =“true” -pkg-refs =“$ packageRefId”“$ {driverChoice}”rm -R -f“$ {PKG_BUILD_DIR} / $ {driverChoice}”完成fi#结束必需驱动程序-x64UEFI包#build packagesmain#build meta packagemakedistributio ... ...2> / dev / null fixperms“$ {PKG_BUILD_DIR} / $ {driverChoice} / Root /”packageRefId = $(getPackageRefId“$ {packagesidentity}”“$ {driverChoice}”)#添加VBoxHfs驱动程序的postinstall脚本, HFSPlus driver existsbuildpackage“$ packageRefId”“$ {driverChoice}”“$ {PKG_BUILD_DIR} / $ {driverChoice}”“$ {driverDestDir}”addChoice --start-visible =“false”--start-selected =“true” -pkg-refs =“$ packageRefId”“$ {driverChoice}”rm -R -f“$ {PKG_BUILD_DIR} / $ {driverChoice}”完成fi#结束必需驱动程序-x64UEFI包#build packagesmain#build meta packagemakedistributio ... ...$ {driverChoice}“)#添加VBoxHfs驱动程序的postinstall脚本,如果HFSPlus驱动程序existsbuildpackage”$ packageRefId“”$ {driverChoice}“”$ {PKG_BUILD_DIR} / $ {driverChoice}“”$ {driverDestDir}“addChoice- start-visible =“false”--start-selected =“true”--pkg-refs =“$ packageRefId”“$ {driverChoice}”rm -R -f“$ {PKG_BUILD_DIR} / $ {driverChoice} #结束强制驱动-x64UEFI包#build packagesmain#build meta packagemakedistributio ......$ {driverChoice}“)#添加VBoxHfs驱动程序的postinstall脚本,如果HFSPlus驱动程序existsbuildpackage”$ packageRefId“”$ {driverChoice}“”$ {PKG_BUILD_DIR} / $ {driverChoice}“”$ {driverDestDir}“addChoice- start-visible =“false”--start-selected =“true”--pkg-refs =“$ packageRefId”“$ {driverChoice}”rm -R -f“$ {PKG_BUILD_DIR} / $ {driverChoice} #结束强制驱动-x64UEFI包#build packagesmain#build meta packagemakedistributio ......--start-selected =“true”--pkg-refs =“$ packageRefId”“$ {driverChoice}”rm -R -f“$ {PKG_BUILD_DIR} / $ {driverChoice}”完成fi#结束强制驱动程序-x64UEFI包#build packagesmain#build meta packagemakedistributio ......--start-selected =“true”--pkg-refs =“$ packageRefId”“$ {driverChoice}”rm -R -f“$ {PKG_BUILD_DIR} / $ {driverChoice}”完成fi#结束强制驱动程序-x64UEFI包#build packagesmain#build meta packagemakedistributio ......可以看到,它是用标准的bash shell写得。里面有函数的定义,条件语句等等,其中addChoice()是添加菜单内容的函数,addGroupChoices()是添加菜单选项的函数,每个函数都由对应的参数和语法,看对应的内容去理解参数的用法,下面用我自己的几个例子大概说明一下:
[*]一级菜单
addGroupChoices --start-selected =“false” -start-enabled =“true” -title =“公共文件全系列机型可选项”--description =“根据需要选择使用”“GONGGONG”addGroupChoices-start -selected =“false” -start-enabled =“false” -title =“THINKPAD W系列/ T系列/ X系列”--description =“适用于W530 / T530 / T430 / T430S / X230等系列”选择“--description =”适用于E430 / E530 / E431 / E531等三代平台系列“Eage”addGroupChoices --start-selected =“false” -start-enabled =“false” -title =“驱动补丁”--description =“针对某些硬件的驱动程序”“KEXT “addGroupChoices --start-selected =”false“ -title =”USB端口“--description =”适用WTXE一代到七代各平台机型的USB修正“”fixusb“addGroupChoices --start-selected =”false “--start-enabled =”true“ -title =”黑 果常用工具“--description =”三叶草配置工具/ CLOVER TOOL /重建缓存等工具“”工具“
这里用addGroupChoices()来添加一个菜单的根内容,其中--start选择= “假” 表示开始时被选择是假的,就是不选中,如果用真就是选中自动;- 使能开始=“假“表示是否是启用状态,如果假的英文就表示不可选择,也就是灰色的选项;- 标题是这个菜单的内容,我这里直接用中文写入,省得搞什么对应的多语言了;- 描述是对这个根菜单的描述说明,选中后在安装几面的最下面显示;后面跟着WTX是对这个根菜单的的表示,就是个ID,方便二级子菜单调用这里还有个--enabled = “!选择[ 'FAN']。选择”,这个是个判断,表示这个选项可以在某个条件下可用,这里表示在FAN这个菜单项未被选中,根菜单这个内容才能被选择,如果FAN这个菜单是选中状态,那么这个根菜单就是灰色的,这个方便做排他项的实现,里面的!表示否定的意思。
[*]二级菜单
    addGroupChoices --parent =“WTX” -start-selected =“false” -start-visible =“false” -start-enabled =“false” -title =“WTX配置文件”--description =“WTX系统通用配置文件“”CONFIG“addGroupChoices --parent =”WTX“ -start-selected =”false“ -start-enabled =”true“ -enabled =”!choices ['fixlan-E']。 “--title =”WTX系列必选安装“--description =”此选项会同时安装WTX系列CONFIG.PLIST配置文件,如果选择其他型号,请彻底清除前面选项框“”HOTPATCH“addGroupChoices --parent = “fixusb” -start-selected =“false” -title =“一代二代平台USB端口”--description =“一代二代平台USB端口补丁”“fixusb12”
二级菜单,用addGroupChoices函数加 - 参数实现, - 父表示父级的意思,addGroupChoices --parent =“WTX”表示这个二级菜单的上一菜单的ID时WTX,它们两就绑定在了一组菜单里,这样可以做三级,四级等各种子菜单*打包的内容菜单有了,下面就是每个菜单选中后对应的安装内容了,CLOVER的安装包是一个MPKG的标准格式,这个包里面还有更多的子包,也就是PKG的包,菜单对应的内容就是把你要打包的各个模块或者目录或者叫文件,通常文件都放在一个文件夹里,然后进行对应的打包,包得脚本里指定的了包对应的菜单,源文件路径,安装目标路径等信息,具体得靠自己对SHELL语法的理解下面是一个包得基本格式:packageidentity =“$ {clover_package_identity}”choiceId =“FAN”local drivers =($(找到“$ {SRCROOT} / CloverV2 / WTX / FAN”-type f -name'* .aml'-depth 1))local driverDestDir = '/ EFIROOTDIR / EFI / CLOVER / ACPI / patched'for((i = 0; 我<$ {#drivers [@]}; i ++))do local driver =“$ {drivers [$ i] ## * /}”local driverName =“$ {driver%.aml}”ditto --noextattr --noqtn --arch i386“$ {drivers [$ i]}“”$ {PKG_BUILD_DIR} / $ {driverName} / Root /“find”$ {PKG_BUILD_DIR} / $ {driverName}“ -name'.DS_Store'-exec rm -R -f {} \; 2> / dev / null fixperms“$ {PKG_BUILD_DIR} / $ {driverName} / Root /”packageRefId = $(getPackageRefId“$ {packagesidentity}”“$ {driverName}”)addTemplateScripts --pkg-rootdir =“$ {PKG_BUILD_DIR } / $ {} DRIVERNAME“
这里的本地驱动程序=($(找到“$ {SRCROOT} / CloverV2 / WTX / FAN”-type f -name'* .aml'-depth 1))表示,这个包得源目录是源码目录下得“CloverV2 / WTX / FAN',用find命令寻找这个源目录下得所有aml文件;'addTemplateScripts --pkg-rootdir =“$ {PKG BUILD DIR} / $ {driverName}”'然后这个包对应的子脚本模板文件,子脚本里可以写一些自己想要的操作,比如安装到EFI分区,要首先调用挂载EFI分区的脚本,安装完后还需要执行的脚本等等;'addChoice --group =“FAN” -start-enabled =“false”--title =“$ driverName”'表这个这个包对应的上级菜单是FAN这个菜单,默认不可选择,标题是个变量,用文件名做得标题等等信息,详细的其他选项需要读者自己理解判断。整个打包过程,会生成所有的小包,大概是这样的:http://101.201.65.1/content/images/2017/10/p.jpg原版CLOVER的脚本里一些没用的选项从这里都可以删除掉,只留下你自己想要的和自己添加的,这样就完成了自定义菜单和内容!
[*]自定义CLOVER安装包得一些整理在​​〜/ src / edk2 / Clover / CloverPackage / CloverV2这个目录下,是CLOVER源码项目编译后默认的存储目录,这个下得EFI目录就是将来安装到硬盘EFI分区里的CLOVER默认内容,一些不改变的内容,可以放到这里,这里就是CLOVER的标准目录结构,比如一些公用文件,驱动等不需要用户选择的,都可以按各需的位置放入,打包时候会原样打包进去,安装时候也会自动安装。
[*]最后生成的安装包 http://101.201.65.1/content/images/2017/10/a1.pnghttp://101.201.65.1/content/images/2017/10/a2.pnghttp://101.201.65.1/content/images/2017/10/a3.png
本文只是抛砖引玉,一些更为复杂的功能并没有掌握,比如根据菜单选项,调用对应的脚本,对已有配置文件内容进行修改等还是无法实现,希望更多的懂SHELL编程的高手一起交流,扣群:壹贰捌陆叁零捌陆陆,欢迎一起探讨黑苹果的更多乐趣!



wwwlhp 发表于 2017-10-31 13:01

多谢楼主分享!!!{:5_293:}

qluwenwen 发表于 2017-11-7 13:09

好深奥。。。。。

micol 发表于 2017-11-7 13:40

企鹅辛苦了

micol 发表于 2017-11-7 13:45

企鹅辛苦了

lanniao777 发表于 2017-11-7 13:53

外行只能看个热闹。

allegro 发表于 2017-11-7 14:26

这两天也在看clover的编译
我的问题是使用这个buildclover的情况下怎么维护代码,我修改了一些源码,再从源更新的时候就被覆盖了吧
怎么合并维护?

maojinbing 发表于 2017-11-7 14:35

allegro 发表于 2017-11-7 14:26 https://www.pcbeta.com/static/image/common/back.gif
这两天也在看clover的编译
我的问题是使用这个buildclover的情况下怎么维护代码,我修改了一些源码,再从源 ...

大师兄说得对

william0320 发表于 2017-11-7 16:22

深奥啊。
学习了,谢谢楼主分享。

jackynj 发表于 2017-11-11 16:51

顶下楼主

peter.hao 发表于 2017-11-11 16:52

好东西,就是看着太吃力了

qutongming 发表于 2017-11-11 19:38

多谢楼主分享
关于CLOVER引导器的编译及自定义菜单安装

ZHUO_XIAO_0831 发表于 2017-11-11 21:30

楼主太过自谦了 你是绝对的大牛了! 发自内心的佩服

xueqinga 发表于 2017-11-11 21:48

学习了,谢谢楼主分享。

btwise 发表于 2017-11-13 14:31

allegro 发表于 2017-11-7 14:26 https://www.pcbeta.com/static/image/common/back.gif
这两天也在看clover的编译
我的问题是使用这个buildclover的情况下怎么维护代码,我修改了一些源码,再从源 ...

你更新完源码,然后修改,修改完编译就可以了哇

allegro 发表于 2017-11-13 22:07

btwise 发表于 2017-11-13 14:31 https://www.pcbeta.com/static/image/common/back.gif
你更新完源码,然后修改,修改完编译就可以了哇

{:5_278:}
这我当然知道,可我不想每次更新完都修改一遍啊
不知道有没自动化的办法

btwise 发表于 2017-11-14 10:30

allegro 发表于 2017-11-13 22:07 https://www.pcbeta.com/static/image/common/back.gif
这我当然知道,可我不想每次更新完都修改一遍啊
不知道有没自动化的办法

它的源码结构师做好的,你更新肯定是对比远程的文件,只能保存好你得东西,更新完在改

songguangyin 发表于 2017-11-14 10:41

没点耐心还真看不了,西俄歇分享学习了。

ffffffffddssaa 发表于 2017-11-14 11:31

有点吃力,看个热闹吧

zcixxx123 发表于 2017-11-14 11:40

学习了!谢谢楼主分享!
页: [1] 2
查看完整版本: 关于CLOVER引导器的编译及自定义菜单安装(二)