yocto系列讲解 (变量篇) 63 - SRC_URI和SRC_DIR的区别

By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎订阅!
你的喜欢就是我写作的动力!

返回总目录 Yocto开发讲解系列 - 总目录

SRC_URI变量

该变量在 bb 文件中用于获取本地或者远程源代码,构建过程 do_fetch 通过该变量获取源码。 SRC_URI 可以指定多个源码或者文件,是一个文件列表。

SRC_DIR

这个变量可以用来指定实际构建过程中源码的目录位置。

应用场景

我们假设有这样一个应用场景:

tree abcdir/
	configure.ac
	Makefile.am
	abc.c
	abc.h
	xyzdir/
		configure.ac
		Makefile.am
		xyz.c
		xyz.h	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在上面的本地 abcdir 项目的目录中存在一个子项目 xyzdir xyzdir 可以独立构建,但是依赖 abcdir 目录中的abc.h头文件。
该项目这种组织形式是不推荐的,但是确实有这种项目。
那么我们该如何写 xyzdir 这个项目的recipe bb文件呢?

一般我们会这么写 xyzdir_git.bb 文件指定 SRC_URI 的语句如下:

# xyzdir_git.bb
FILESPATH =+ "${THISDIR}/your-dir/:"
SRC_URI = "file://abcdir/xyzdir/"
  • 1
  • 2
  • 3

写好后我们开始编译,但是在编译阶段会出现一个错误,就是找不到 abc.h 头文件。

我们通过查看构建目录中:

build]$ ls tmp/work/xxx-poky-linux-gnueabi/xyzdir/git-r0/abcdir/
xyzdir/
  • 1
  • 2

发现这个 abcdir 目录下只有 xyzdir 目录,没有任何 abc.c abc.h 等文件,这自然是找不到 abc.h 头文件。
那么我们就应该修正SRC_URI变量语句:

# xyzdir_git.bb
FILESPATH =+ "${THISDIR}/your-dir/:"
SRC_URI = "file://abcdir/"
  • 1
  • 2
  • 3

但是这种语句会带来一个新的问题,就是我们实际要构建的是 abcdir/xyzdir 目录中的代码,而不是 abcdir 目录中的代码,那应该如何处理呢?
正确的做法应该是使用 SRC_DIR 变量来指定构建项目的实际路径:

# xyzdir_git.bb
FILESPATH =+ "${THISDIR}/your-dir/:"
SRC_URI = "file://abcdir/"
SRC_DIR = "file://abcdir/xyzdir/"
  • 1
  • 2
  • 3
  • 4

这样一来就可以正确编译了。如下所示:

build]$ ls tmp/work/xxx-poky-linux-gnueabi/xyzdir/git-r0/abcdir/
configure.ac
Makefile.am
abc.c
abc.h
xyzdir/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

即有 abc.h 也有 xyzdir 目录,而且构建的时候也知道是在 abcdir 目录中构建。

感谢阅读!您的点赞加收藏就是我持续更新的动力!