當有多個recipes提供相同的命令時, update-alternatives.bbclass可以幫你做替代("alternative"), 例如,可以從busybox,binutils和elfutils中使用ar命令。 update-alternatives.bbclass會幫你重新命名,以便安裝多個package而不會發生衝突。無論安裝或隨後刪除哪些package,ar命令仍然有效。
要使用update-alternatives.bbclass,你需要為這個package定義一些變量:
ALTERNATIVE_
列出所有這個package的alternatives指令
設定name這個命令的link的路徑
ALTERNATIVE_LINK_NAME[name] = "target"
設定該package的預設priority,數值越大,priority越高
ALTERNATIVE_PRIORITY
針對特定命令另外設定priority,數值越大,priority越高
ALTERNATIVE_PRIORITY[name] = "20"
範例
brook這個package的檔案結構brook@vista:~/oe-core/meta/recipes-devtools/brook$ tree . |-- brook-1.0.0 | |-- brookbox | |-- copyright | `-- insmod `-- brook_1.0.0.bb 1 directory, 4 filesbrookbox類似busybox,後面會有多個檔案link到該檔案,而insmod是一個獨立檔案
brook_1.0.0.bb
SUMMARY = "Brook demo update-alternatives" DESCRIPTION = "This package is used for Brook to demo update-alternatives" LICENSE = "GPLv2+" LIC_FILES_CHKSUM = "file://${WORKDIR}/copyright;md5=afcc69d729fbf1d0a2af28ce44a23991 \ " SRC_URI = "file://insmod \ file://copyright \ file://brookbox \ " inherit update-alternatives ALTERNATIVE_${PN} = "insmod route reboot shutdown poweroff" ALTERNATIVE_PRIORITY = "100" ALTERNATIVE_LINK_NAME[insmod] = "${base_sbindir}/insmod" ALTERNATIVE_PRIORITY[insmod] = "50" ALTERNATIVE_LINK_NAME[route] = "${base_sbindir}/route" ALTERNATIVE_PRIORITY[route] = "50" ALTERNATIVE_LINK_NAME[reboot] = "${base_sbindir}/reboot" ALTERNATIVE_LINK_NAME[shutdown] = "${base_sbindir}/shutdown" ALTERNATIVE_PRIORITY[shutdown] = "10" ALTERNATIVE_LINK_NAME[poweroff] = "${base_sbindir}/poweroff" ALTERNATIVE_PRIORITY[poweroff] = "500" do_install () { install -d ${D}${base_sbindir} install -m 0755 ${WORKDIR}/insmod ${D}${base_sbindir}/insmod install -m 0755 ${WORKDIR}/brookbox ${D}${base_sbindir}/brook ln -s ${base_sbindir}/brook ${D}${base_sbindir}/route ln -s ${base_sbindir}/brook ${D}${base_sbindir}/reboot ln -s ${base_sbindir}/brook ${D}${base_sbindir}/shutdown ln -s ${base_sbindir}/brook ${D}${base_sbindir}/poweroff }sysvinit也同時註冊了reboot,shutdown與poweroff,其priority都是200,而這裡的priority分別為100,10,500,所以最後結果如下
brook@vista:~/oe-core/build/tmp-glibc/work/oe-linux-gnueabi/image/1.0-r0/rootfs$ ls -al sbin/|grep brook -rwxr-xr-x 1 jenkins jenkins 6 Dec 9 22:17 brook lrwxrwxrwx 1 jenkins jenkins 18 Dec 9 22:17 insmod -> /sbin/insmod.brook -rwxr-xr-x 1 jenkins jenkins 6 Dec 9 22:17 insmod.brook lrwxrwxrwx 1 jenkins jenkins 20 Dec 9 22:17 poweroff -> /sbin/poweroff.brook lrwxrwxrwx 1 jenkins jenkins 11 Dec 9 22:17 poweroff.brook -> /sbin/brook lrwxrwxrwx 1 jenkins jenkins 11 Dec 9 22:17 reboot.brook -> /sbin/brook lrwxrwxrwx 1 jenkins jenkins 17 Dec 9 22:17 route -> /sbin/route.brook lrwxrwxrwx 1 jenkins jenkins 11 Dec 9 22:17 route.brook -> /sbin/brook lrwxrwxrwx 1 jenkins jenkins 11 Dec 9 22:17 shutdown.brook -> /sbin/brook
reboot與shutdown都小於sysvinit,所以不適用brook,poweroff高於sysvinit,所以使用brook這個package提供的命令
沒有留言:
張貼留言