![如何编译 efivar?](https://linux22.com/image/6856/%E5%A6%82%E4%BD%95%E7%BC%96%E8%AF%91%20efivar%EF%BC%9F.png)
我正在尝试为我的设备编译 efivar-0.23线性FS,但是当我解压它时,运行以下命令:
make libdir="/usr/lib/" bindir="/usr/bin/" mandir="/usr/share/man/" includedir=/usr/include/" V=1 -j1
我收到错误,NVME_IOCTL_ID 未声明。我浏览了整个互联网来寻找答案,但我唯一发现的是我需要修补该文件。我找到了几个补丁,但没有任何帮助(也许我安装不正确......)。这是我尝试过的最后一个补丁:http://patchwork.openembedded.org/patch/117073/。
我已进入未解压的 efivar 目录并执行了:patch -Np1 ../efivar.patch
,但它正在执行任何操作。就好像它正在做某事,但什么也没发生。
我尝试patch < ../efivar.patch
从未解压的目录中访问,但随后系统开始询问问题......
System: File to patch:
Me: Makefile
System: patching file Makefile
Hunk #1 FAILED at 12.
1 out of 1 hunk FAILED -- saving rejects to file Makefile.rej
The next patch would delete the file efivar-drop-options-not-supported-by-lower-version-gcc.patch,
which does not exist! Assume -R? [n]
Me: y
System: patching file efivar-drop-options-not-supported-by-lower-version-gcc.patch
The next patch would delete the file efivar_0.21.bb,
which does not exist! Assume -R? [n]
Me: y
patching file efivar_0.21.bb
patching file efivar_0.23.bb
我尝试了不同的答案组合和不同的补丁。我还手动输入了需要修补的文件,以确保它包含所需的内容(因为我不确定此修补程序是否有效)。
所以基本上我和未声明的变量处于同一点,并且浪费了很多时间不知道该怎么做..有什么想法吗?
答案1
efivar
版本 0.23 需要一个补丁才能使用 4.4(以及更高版本的内核)中的内核头,因为头定义NVME_IOCTL_ID
发生了变化(它被重命名nvme.h
为nvme_ioctl.h
)。
要efivar
在您的系统上构建,您需要“重命名 linux/nvme.h 的解决方法”修补。要应用它,请进入包含源代码的目录efivar
(使用 0.23 源代码,没有任何更改),然后运行
curl https://github.com/rhinstaller/efivar/commit/3a0ae7189fe96355d64dc2daf91cf85282773c66.patch | patch -p1
然后您应该能够efivar
使用内核 4.4 标头正确构建。
鉴于您有一个头文件,此时nvme.h
您可能仍然会遇到问题。NVME_IOCTL_ID
您可以应用另一个补丁来避免完全使用它,“libefiboot:重新设计 NVME,以便我们获得正确的 EUI 并且不需要内核标头”(此补丁需要前一个补丁):
curl https://github.com/rhinstaller/efivar/commit/8910f45c27fadba0904f707e7c40ad80bf828f7e.patch | patch -p1
通过这两个补丁,efivar
无论您的内核头文件在何处(以及是否)定义了NVME_IOCTL_ID
.