应用程序相关代码
应用程序相关的源代码通常被添加到应用程序的
src
目录。如果应用程序需要添加大量的源文件,开发者可以在
src
将它们组织为子目录形式(目录深度没有限制)。开发者必须为
src
目录及其每个子目录提供相应的 Makefile 文件。
这些 Makefile 与位于应用程序顶层
~/app
下的 Makefile 有一定的区别。
应用程序相关的源代码不能使用内核所保留的符号名前缀。详细信息请参考
命名规范
.
下列需且适用于
src
目录及其子目录下的所有 Makefile。
在编译过程中,Kbuild 通过匹配应用程序的 Makefile 中的文件名来标识需要被编译到目标文件中的源文件。
编译应用程序时,未被任何 Makefile 引用的源文件不会被编译。
Makefile 不能直接引用源代码,它只能引用由源代码文件生成的目标文件(
.o
文件)。
Makefile 只能引用当前目录或者其子目录中的文件。
Makefile 可以在一行引用多个实体,但是一行中最多引用一个目录。
在
src
下面为您的源代码创建目录结构,并将源代码添加到里面。
在
src
目录下创建一个
Makefile
,并为
src
下面的每个子目录创建一个
Makefile
。
使用下面的语法添加引用:
obj-y += file1.o file2.o
使用下面的语法添加对目录的引用:
obj-y += directory_name/**
支持编译第三方库
您可以编译位于应用程序的 src 目录之外的库代码,但是需要牢记的是,应用程序代码和库代码最终会被编译为同一个应用程序二进制接口(Application Binary Interface,ABI)。对于大多数架构,都存在用于控制 ABI 的编译标志。库和应用程序的编译标志通常都是相同的。 It may also be useful for glue code to have access to Zephyr kernel header files.
为了便于集成第三方组件,Zephyr 编译系统包含了一个特殊的编译对象 —— outputexports。``outputexports``从 Zephyr 编译系统中拿取了大量临界变量(critical variables),并将它们拷贝到了 Makefile.export 中,因此三方库的编译系统可以使用这些临界变量。
推荐将下列变量用于第三方库的编译中(完整的变量列表请参考 Makefile.export):
CROSS_COMPILE,以及一些相关的约定俗成的用于调用交叉工具的变量(包括 AR、AS、CC、CXX、CPP 和 LD)。
ARCH、BOARD,以及一些用于标识 Zephyr 内核版本的变量。
需要按顺序添加到 CFLAGS``(或者 ``CXXFLAGS)的变量 KBUILD_CFLAGS、NOSTDINC_FLAGS 和 ZEPHYRINCLUDE。
所有的 Kconfig 变量,以基于 Zephyr 内核配置自动使能/禁止库代码的功能。
samples/static_lib 是用于演示这些功能的示例工程。