By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!
BitBake全过程
继续上篇: yocto-第25篇-BitBake全过程(3)
项目编译并且输出文件已经安装到B变量指定的目录中,下面就是开始打包软件了
包的拆分
源码配置和编译、输出文件暂存后,构建系统将分析结果并将输出的包splits(拆分),比如debug版本放到一个目录中,release版本放到一个目录中,如下图所示:
图中packages-split目录下的输出文件是stripped的,执行程序或者库文件中就没有debug的信息。比如:
build]$ bitbake learnyocto -c cleanall
build]$ bitbake learnyocto
build]$ file tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/image/usr/bin/learnyocto
tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/image/usr/bin/learnyocto: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-x86-64.so.2, BuildID[sha1]=7e57bc391bf5c60319ccb75e843ff7e9e977ea15, for GNU/Linux 3.2.0, not stripped
- 1
- 2
- 3
- 4
显示"not stripped"
build]$ file tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/packages-split/learnyocto/usr/bin/learnyocto
tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/packages-split/learnyocto/usr/bin/learnyocto: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-x86-64.so.2, BuildID[sha1]=7e57bc391bf5c60319ccb75e843ff7e9e977ea15, for GNU/Linux 3.2.0, stripped
- 1
- 2
显示"stripped"
do_package和do_packagedata任务
这两个任务结合起来分析处理在D变量指定的目录中找到的文件,并根据可用的包和文件将它们拆分为子集。分析处理过程包括以下内容:去除调试符号、查看包之间的共享库依赖项以及查看包之间关系。
do_packagedata任务根据分析创建包的元数据,以便构建系统可以生成最终的包。do_populate_sysroot任务将do_install任务安装的文件的子集转移(复制)到相应的sysroot中。分析和拆分包过程的执行、暂存和中间结果使用下面几个变量:
PKGD变量
在将包拆分为单个包之前,包的目标目录。如下所示:
build]$ bitbake -e learnyocto | grep ^PKGD=
PKGD="/home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/package"
- 1
- 2
PKGDESTWORK变量
do_package任务用来保存包元数据的临时工作目录(比如pkgdata/)。如下所示:
build]$ bitbake -e learnyocto | grep ^PKGDESTWORK=
PKGDESTWORK="/home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/pkgdata"
- 1
- 2
PKGDEST变量
拆分后包的父目录(比如packages-split)。如下所示:
build]$ bitbake -e learnyocto | grep ^PKGDEST=
PKGDEST="/home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/packages-split"
- 1
- 2
PKGDATA_DIR变量
一个共享的全局状态目录,用于保存在打包过程中生成的打包元数据(packaging metadata)。打包过程从PKGDESTWORK变量指定的目录中复制元数据到PKGDATA_DIR变量指定的目录。如下所示:
build]$ bitbake -e learnyocto | grep ^PKGDATA_DIR=
PKGDATA_DIR="/home/peeta/poky/build/tmp/pkgdata/qemux86-64"
build]$ cat tmp/pkgdata/qemux86-64/learnyocto
PACKAGES: learnyocto-src learnyocto-dbg learnyocto-staticdev learnyocto-dev learnyocto-doc learnyocto-locale learnyocto
- 1
- 2
- 3
- 4
STAGING_DIR_HOST变量
recipe依赖的组件存放的sysroot路径,比如recipe-sysroot目录,如下所示:
build]$ bitbake -e learnyocto | grep ^STAGING_DIR_HOST=
STAGING_DIR_HOST="/home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/recipe-sysroot"
- 1
- 2
上面目录中有一些learnyocto项目依赖的库和头文件:
build]$ ls /home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/recipe-sysroot/usr/lib/
audit libBrokenLocale.so libitm.a libnss_db.so libstdc++.so
crt1.o libc.a libitm.so libnss_dns.so libstdc++.so.6
crti.o libc_nonshared.a libitm.so.1 libnss_files.so libstdc++.so.6.0.28
crtn.o libc.so libitm.so.1.0.0 libnss_hesiod.so libstdc++.so.6.0.28-gdb.py
gcrt1.o libdl.a libitm.spec libpthread.a libsupc++.a
libanl.a libdl.so libm-2.31.a libpthread.so libthread_db.so
libanl.so libg.a libm.a libresolv.a libutil.a
libatomic.a libgomp.a libmcheck.a libresolv.so libutil.so
libatomic.so libgomp.so libm.so librt.a Mcrt1.o
libatomic.so.1 libgomp.so.1 libmvec.a librt.so Scrt1.o
libatomic.so.1.2.0 libgomp.so.1.0.0 libmvec.so libstdc++.a x86_64-poky-linux
libBrokenLocale.a libgomp.spec libnss_compat.so libstdc++fs.a
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
可以说这个目录下的组件,尤其是库文件,后期也会整合到目标设备的文件系统中,头文件不一定在。这些库的编译架构决定了只能在目标机器上运行。
STAGING_DIR_NATIVE变量
在build相应的recipe时,需要被用到的一些组件等,这里面的组件主要是一些在build recipe的时候需要的工具,比如cmake、gcc等等工具。后期不会整合到目标设备的文件系统中的。如下所示:
build]$ bitbake -e learnyocto | grep ^STAGING_DIR_NATIVE= STAGING_DIR_NATIVE="/home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/recipe-sysroot-native"
- 1
例如该目录下的cmake和gcc工具是可以运行的:
build]$ cd /home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/recipe-sysroot-native
recipe-sysroot-native]$ find -iname cmake
./usr/lib/cmake
./usr/bin/cmake
./usr/share/cmake-3.16/completions/cmake
./usr/share/cmake
#执行cmake -v
recipe-sysroot-native]$ ./usr/bin/cmake -v
CMake Error: The source directory "/home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/recipe-sysroot-native/-v" does not exist.
Specify --help for usage, or press the help button on the CMake GUI.
recipe-sysroot-native]$ find -iname gcc
./usr/lib/x86_64-poky-linux/gcc
./usr/libexec/x86_64-poky-linux/gcc
./usr/libexec/x86_64-poky-linux/gcc/x86_64-poky-linux/9.3.0/gcc
#执行gcc -v
recipe-sysroot-native]$ ./usr/libexec/x86_64-poky-linux/gcc/x86_64-poky-linux/9.3.0/gcc -v
Using built-in specs.
COLLECT_GCC=./usr/libexec/x86_64-poky-linux/gcc/x86_64-poky-linux/9.3.0/gcc
COLLECT_LTO_WRAPPER=/home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/recipe-sysroot-native/usr/bin/x86_64-poky-linux/../../libexec/x86_64-poky-linux/gcc/x86_64-poky-linux/9.3.0/lto-wrapper
Target: x86_64-poky-linux
Configured with: ../../../../../../work-shared/gcc-9.3.0-r0/gcc-9.3.0/configure --build=x86_64-linux --host=x86_64-linux --target=x86_64-poky-linux --prefix=/host-native/usr --exec_prefix=/host-native/usr --bindir=/host-native/usr/bin/x86_64-poky-linux --sbindir=/host-native/usr/bin/x86_64-poky-linux --libexecdir=/host-native/usr/libexec/x86_64-poky-linux --datadir=/host-native/usr/share --sysconfdir=/host-native/etc --sharedstatedir=/host-native/com --localstatedir=/host-native/var --libdir=/host-native/usr/lib/x86_64-poky-linux --includedir=/host-native/usr/include --oldincludedir=/host-native/usr/include --infodir=/host-native/usr/share/info --mandir=/host-native/usr/share/man --disable-silent-rules --disable-dependency-tracking --with-libtool-sysroot=/host-native --enable-clocale=generic --with-gnu-ld --enable-shared --enable-languages=c,c++ --enable-threads=posix --disable-multilib --enable-default-pie --enable-c99 --enable-long-long --enable-symvers=gnu --enable-libstdcxx-pch --program-prefix=x86_64-poky-linux- --without-local-prefix --disable-install-libiberty --enable-lto --disable-libssp --enable-libitm --disable-bootstrap --disable-libmudflap --with-system-zlib --with-linker-hash-style=sysv --enable-linker-build-id --with-ppl=no --with-cloog=no --enable-checking=release --enable-cheaders=c_global --without-isl --with-gxx-include-dir=/not/exist/usr/include/c++/9.3.0 --with-sysroot=/not/exist --with-build-sysroot=/host --enable-poison-system-directories --with-system-zlib --disable-static --disable-nls --with-glibc-version=2.28 --enable-initfini-array --enable-__cxa_atexit
Thread model: posix
gcc version 9.3.0 (GCC)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
想想当年自己玩嵌入式的时候gcc版本还是4.x.x,现在已经9.3.0了,感慨万千~
STAGING_DIR_TARGET变量
和STAGING_DIR_HOST变量类似,recipe依赖的组件存放的sysroot路径。如下所示:
build]$ bitbake -e learnyocto | grep ^STAGING_DIR_TARGET=
STAGING_DIR_TARGET="/home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/recipe-sysroot"
- 1
- 2
FILES变量
这个变量是用来定义哪些文件会在打包阶段被使用,也就是一些recipe构建完成生成的执行文件、库、头文件或者其他一些文件,如下所示:
build]$ bitbake -e learnyocto | grep ^FILES
FILES=""
...
FILES_SOLIBSDEV="/lib/lib*.so /usr/lib/lib*.so"
FILES_learnyocto="/usr/bin/* /usr/sbin/* /usr/libexec/* /usr/lib/lib*.so.* /etc /com /var /bin/* /sbin/* /lib/*.so.* /lib/udev /usr/lib/udev /lib/udev /usr/lib/udev /usr/share/learnyocto /usr/lib/learnyocto/* /usr/share/pixmaps /usr/share/applications /usr/share/idl /usr/share/omf /usr/share/sounds /usr/lib/bonobo/servers"
FILES_learnyocto-bin="/usr/bin/* /usr/sbin/*"
FILES_learnyocto-dbg="/usr/lib/debug /usr/lib/debug-static /usr/src/debug"
FILES_learnyocto-dev="/usr/include /lib/lib*.so /usr/lib/lib*.so /usr/lib/*.la /usr/lib/*.o /usr/lib/pkgconfig /usr/share/pkgconfig /usr/share/aclocal /lib/*.o /usr/lib/learnyocto/*.la /lib/*.la /usr/lib/cmake /usr/share/cmake"
FILES_learnyocto-doc="/usr/share/doc /usr/share/man /usr/share/info /usr/share/gtk-doc /usr/share/gnome/help"
FILES_learnyocto-locale="/usr/share/locale"
FILES_learnyocto-src=""
FILES_learnyocto-staticdev="/usr/lib/*.a /lib/*.a /usr/lib/learnyocto/*.a"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
上面用到了很多的通配符,比如usr/bin/*就是在打包阶段将/usr/bin/目录下的文件都打包。
do_package_write_*任务
该任务会根据包的类型(RPM,DEB, 或者IPK)创建实际的packages,并将其放到${TMPDIR}/deploy目录下。
今天就到这里~
END