yocto-第26篇-BitBake全过程(4)

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