Buildroot中的samba4编译
通常来说,在【buildroot】中编译各种各样的软件,只需要【make menuconfig】配置一下就好,比较省心。
因此抱着这种心情,我勾选了【samba4】这个选项(项目需要),像往常一样,勾选成功保存后便继续做其它事情,没有再理会编译过程。
问题1:很长时间过后,看到编译出错,我的第一反应是,可能又是网络下载【samba4-4.6.6】包的时候,下载不下来了吧,确实“如我所愿”,它又双叒叕下载不下来了,长期作为“手动挡”,已经习惯了。
解决1:将打印信息输出,复制【samba4-4.6.6.tar.gz】的下载地址,手动下载压缩包,然后复制到【buildroot/dl】中,继续编译。
问题2:原本以为【samba4】不会再有问题了,谁能想到堂堂【Buildroot】编译软件的编译过程竟然出错了,仔细看了一下错误。
解决2:
先去看一下这个出错的源码。
从这复杂的if与endif中可以看出,【RPCSVC_YP_PROT】应该是个可选项,所以第一想法是去确认一下,自己的文件系统中是否有这个。
这里提到的是【rpcsvc/yp_prot.h】这个文件,既然找不到文件,那就尝试找一下前面的目录【rpcsvc】,【samba4】中没有找到该目录,那就扩大范围,去【buildroot/output/host】里面找,果然,找到了,如图所示。
可以看出这个路径是属于【aarch64-buildroot-linux-gnu】底下的,由于这是【RTK1296】的【交叉编译工具链】的名字,那不免就会想要去【交叉编译工具链】下面搜索一下这个目录。
猜想的不错,缺失的文件就是【交叉编译工具链】里面的,因此首先想办法让交叉编译工具链里面有这个,这时候去厂家提供的【openWrt】里面去寻找线索,没有什么进展。
一筹莫展之际,退一步想问题,既然确实的文件是一个【*.h】文件,因此不存在【交叉编译】的问题,那就尝试去有samba服务的【编译服务器】里面寻找线索。
最终在【编译服务器】里面找到了这个文件【/usr/include/rpcsvc/yp_prot.h】,这下好办了,把缺少的文件拿过去应该就可以了,但是事实却不是这样的,尝试了很久,这个编译错误依然存在,而且转念一想,这个文件即使真的生效了,万一版本不符,里面的内容不一样不还是有问题吗?
再次陷入沉思,既然文件拿过去不行,那就大胆尝试一下
直接给禁掉了,再次编译,没想到的是,编译过了,没有再次出现这个错误,生活真是充满意外。
问题3:
继续编译,再次出现问题,如图。
解决3:
去看一下源码,如图所示。
按照刚才的经验来说,这种时候解决问题的最好方式是找到这个宏定义对应的数值是多少,然后直接将数值写入来替代这个宏定义,这是影响最小的方式,也是解决这个问题最好的办法。
那么,哪里可以找到这个宏定义呢?
samba源码中没有找到这个宏定义,【buildroot/output/host】里面也没有,交叉编译工具链里面仍然没有,最后的希望,去【编译服务器】找,找到了。
根据源码的宏定义数值,做出了如下修改,如图所示。
这样修改完成后,继续编译,没有再出现问题。
直到编译结束,samba4-4.6.6的交叉编译没有再出现问题,后续尝试在板子上运行了一下,没有什么问题。
问题4:
但是至此,移植samba的问题并没有完全解决,因为这是项目中的一部分,总不能以后编译的时候全部依靠文档或者口述来解决这个编译问题吧。因此,考虑到给【samba4-4.6.6】打补丁包。
解决4:
首先到【buildroot/package】目录下寻找【samba4】,如图所示。
可以看到有补丁文件【*.patch】,这个文件其实就是后续会打到【buildroot/output/build/samba-$version】里面的补丁,就以【0001】这个补丁为例,如图所示。
这是这个补丁的全部内容,可以看出,里面的写法与【git】提交记录非常相似,因此可以模拟这种写法,写一个补丁,如图所示。
可以看到,一共两个提交,分别是解决之前两个问题时候修改的代码内容,也很简单,但是要注意空格问题,不然会编译不过。将补丁包自己命名并开始编译,等待编译的途中,我去看了一下补丁包的效果,去【buildroot/output/build/samba-$version】里面查看代码打补丁情况,全部生效了。
结语:至此,samba4-4.6.6的交叉编译算是圆满结束了。其实解决samba交叉编译的问题时,过程远不止这些,也有尝试过多个版本,也走过很多弯路,但是功夫不负有心人,最终的结果是圆满的。