通常來說,在【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交叉編譯的問題時,過程遠不止這些,也有嘗試過多個版本,也走過很多彎路,但是功夫不負有心人,最終的結果是圓滿的。