Out of tree build
剛剛上一章講解了基本套件和基本建制,這一章來講解一下如果要你有多個案子想要一起建制,而且不想要放在buildroot 的tree裡面要怎麼處理。
buildroot是使用參數『O』來控制輸出的,就像上一個例子一樣,如果你沒有指定輸出的資料夾的話,它會使用最上層的『output』,所以代表的就是『O = buildroot/output/』的意思。可以看到Makefile檔案裡面:
如果你有在建立組態時有指定『O = /path/to/directory』的話,系統就會在你指定的路徑底下建立一個『wrapper - Makefile』,就是一個子Makefile的意思。
假設我想要建立兩個案子,叫做『ra-pi2』和『ra-pi3』,所以在跟buildroot同一個層級上建立兩個資料夾,然後到『buildroot』底下去下指令,這個指令會在『ra-pi2』裡面去建立組態:
mkdir ra-pi2
mkdir ra-pi3
cd buildroot
make O=../ra-pi2/ raspberrypi2_defconfig
cd ..
『ra-pi3』的部份我們用另一種方式建立組態:cd ra-pi3
make -C ../buildroot O=$(pwd) raspberrypi3_defconfig
總而言之,兩個結果是差不多的,只是一個在來源下指令,一個是在目標下指令。以上用法也可以使用menuconfig,
eg.make O=../ra-pi2/ menuconfig
建立完之後,tree長的如下,可以看到『ra-pi2』和『ra-pi3』都有各自的Makefile:
├── buildroot
│ ├── arch
│ ├── board
│ ├── boot
│ ├── build.log
│ ├── CHANGES
│ ├── Config.in
│ ├── Config.in.legacy
│ ├── configs
│ ├── COPYING
│ ├── DEVELOPERS
│ ├── docs
│ ├── fs
│ ├── linux
│ ├── Makefile
│ ├── Makefile.legacy
│ ├── output
│ ├── package
│ ├── README
│ ├── support
│ ├── system
│ └── toolchain
├── ra-pi2
│ ├── build
│ └── Makefile
└── ra-pi3
├── build
└── Makefile
比較過兩個Makefile以後,發現兩個MAKEARGS都指到同一個路徑,其他內容也一模一樣:
Then Build
組態建置完後,就直接建置專案:
cd ra-pi2
make 2>&1 | tee build_ra2.log
cd ..
cd ra-pi3
make 2>&1 | tee build_ra3.log
建制完了以後,你就會看到輸出映像檔出現在每個案子底下的『images』:
├── ra-pi2
│ ├── build
│ ├── host
│ ├── images
│ ├── Makefile
│ ├── staging -> /home/hugh/workspace/ra-pi2/host/usr/arm-buildroot-linux-uclibcgnueabihf/sysroot
│ └── target
├── ra-pi3
├── build
├── host
├── images
├── Makefile
├── staging -> /home/hugh/workspace/ra-pi3/host/usr/arm-buildroot-linux-uclibcgnueabihf/sysroot
└── target