使用Makefile构建工具-XCOMMON系统
通用XMOS Makefile提供了对构建应用程序和源代码模块的支持。您只需在应用程序Makefile和module_build_info文件中指定构建所需的属性,即可引入模块,并在编译时使用它们。
应用程序和模块
一个应用程序由应用程序特有的源代码和来自公共代码(可选的)或二进制库的模块的源代码组成。在开发应用程序时,工作区域按照工作空间、应用程序和模块的概念进行描述。
-
工作空间
工作空间是包含多个项目的容器。
-
应用程序
应用程序是一个包含源文件和Makefile的项目,它可以构建成一个可执行文件(
.xe)。按照惯例,应用程序目录以前缀app_开头。 -
模块
模块(或者说:依赖库)是一个包含源文件或二进制库的目录。模块的源代码不能用于单独构建,但可以被应用程序使用。按照惯例,模块目录以前缀
lib_或module_开头。
工作空间结构和自动模块检测
根据你的工作空间的配置,Makefiles会在你的文件系统中搜索文件夹,找到应用程序使用的模块。
最简单的结构如下所示:
app_uac_demo1/
app_uac_demo2/
lib_i2s/
lib_i2c/
lib_usb/
lib_dsp/
lib_logging/
在这种情况下,当构建应用程序时,构建系统会在与应用程序同级的目录上寻找模块。
有时候应用程序和模块是在不同的仓库中组织的:
repo1/
app_uac_demo1/
lib_i2s/
repo2/
lib_usb/
如果Makefiles检测到包含应用程序的文件夹是一个仓库,那么Makefiles会搜索与该文件夹同一嵌套级别的所有仓库的子文件夹中的模块(在这种情况下,是repo1和repo2的子文件夹)。Makefiles会在以下情况之一成立时,将一个文件夹检测为一个仓库:
- 该文件夹有一个
.git子文件夹。- 该文件夹以
sc_,ap_,sw_,tool_或lib_为前缀。- 该文件夹包含一个名为
.xcommon_repo或xpd.xml的文件。
如果应用程序上一级目录被检测为一个仓库,但上一级目录不是,那么Makefiles将在那个层级进行搜索。例如,在以下情况下:
repo1/
examples/
app_uac_demo1/
lib_i2s/
repo2/
lib_usb/
repo1和repo2的子目录将被搜索。
除了自动搜索模块外,还可以设置环境变量XMOS_MODULE_PATH,指定Makefiles应该搜索的路径列表。如果你只想使用用户指定的搜索路径,那么可以通过将环境变量XCOMMON_DISABLE_AUTO_MODULE_SEARCH设置为1来禁用自动搜索模块功能。
一个工程中的例子
+- lib_xud
|
+- lib_i2s
|
+- sw_usb_audio
|
+-app_usb_aud_xk_316_pp
|
+-Makefile
+-src
+-bin
XMOS_MODULE_PATH = ../..
XCOMMON_DISABLE_AUTO_MODULE_SEARCH = 1
USED_MODULES = lib_xud lib_i2s
...
-
完成上面的配置后,在编译应用中的Makefile时,XCOMMON的配置为关闭自动搜索,并在Makefile的上上级目录中搜索依赖库。
-
另一种方式是在使用xmake编译时配置编译选项,例如
xmake XMOS_MODULE_PATH=../.. XCOMMON_DISABLE_AUTO_MODULE_SEARCH=1
应用程序中的Makefile
每个应用程序目录都应该包含一个名为Makefile的文件,该文件引用中包含了通用的XMOS Makefile。通用Makefile控制着构建过程,默认包含了应用程序目录及其子目录中的所有源文件。应用程序Makefile支持以下变量赋值。
-
XCC_FLAGS[_config]
用于指定在构建过程中传递给xcc的编译选项。该选项可以针对特定的构建配置config进行设置。如果不指定后缀,则该选项适用于默认的构建配置。
-
XCC_C_FLAGS[_config]
用于指定在编译
.c文件时传递给xcc的编译选项,该选项会覆盖XCC_FLAGS中的设置。该选项可以针对特定的构建配置config进行设置。如果不指定后缀,则该选项适用于默认的构建配置。 -
XCC_ASM_FLAGS[_config]
用于指定在编译
.s或.S文件时传递给xcc的编译选项,该选项会覆盖XCC_FLAGS中的设置。该选项可以针对特定的构建配置config进行设置。如果不指定后缀,则该选项适用于默认的构建配置。 -
XCC_MAP_FLAGS[_config]
用于指定在最终的链接阶段传递给xcc的编译选项,该选项会覆盖
XCC_FLAGS中的设置。该选项可以针对特定的构建配置config进行设置。如果不指定后缀,则该选项适用于默认的构建配置。 -
XCC_FLAGS_<filename>
用于指定针对某个文件名的xcc编译选项,该选项会覆盖所有构建配置中的设置。
-
VERBOSE
这个选项用于控制make系统的输出信息。如果设置为1,表示输出详细的编译过程和命令。
-
SOURCE_DIRS
这个选项用于指定应用程序目录下的子目录列表,这些子目录中的源文件会被编译。默认情况下,所有子目录都会被包含。
-
INCLUDE_DIRS
这个选项用于指定在编译过程中查找头文件的目录列表。默认情况下,所有子目录都会被包含。
-
LIB_DIRS
这个选项用于指定在链接过程中查找库文件的目录列表。默认情况下,所有子目录都会被包含。
-
EXCLUDE_FILES
这个选项用于指定一个空格分隔的源文件名(不含路径)的列表,这些文件不会被编译和链接到应用程序中。
-
USED_MODULES
这个选项用于指定一个空格分隔的模块目录的列表,这些模块会被编译和链接到应用程序中。模块目录应该总是不带完整路径,无论它们来自哪个项目,例如:
USED_MODULES = lib_i2s lib_xud -
MODULE_LIBRARIES
这个选项用于指定从提供多个库的模块中选择使用哪些库。详情请参见使用XMOS Makefiles创建二进制库。
module_build_info 文件
每个模块目录都应该包含一个名为 module_build_info 的文件,该文件用于指导应用程序如何构建模块中的文件。该文件可以包含以下几种变量,并对其进行赋值。
-
DEPENDENT_MODULES
该变量用于指定模块的依赖关系。如果一个应用程序包含了一个模块,那么它也会自动包含该模块所依赖的其他模块。
-
MODULE_XCC_FLAGS
该变量用于指定编译当前模块中的源文件时传递给 xcc 的选项。可以引用应用程序 Makefile 中的
XCC_FLAGS变量,例如:MODULE_XCC_FLAGS = $(XCC_FLAGS) -O3 -
MODULE_XCC_XC_FLAGS
如果设置了该变量,那么它的值会被传递给 xcc 作为编译当前模块中的所有
.xc文件时的选项,而不是使用MODULE_XCC_FLAGS的值。 -
MODULE_XCC_C_FLAGS
如果设置了该变量,那么它的值会被传递给 xcc 作为编译当前模块中的所有
.c文件时的选项,而不是使用MODULE_XCC_FLAGS的值。 -
MODULE_XCC_ASM_FLAGS
如果设置了该变量,那么它的值会被传递给 xcc 作为编译当前模块中的所有
.s或.S文件时的选项,而不是使用MODULE_XCC_FLAGS的值。 -
OPTIONAL_HEADERS
该变量用于指定一个特定的头文件作为可选的配置头文件。这个头文件不在模块中提供,而是由使用模块的应用程序提供。如果应用程序提供了这个文件,那么构建系统会向 xcc 传递一个特殊的宏
__filename_h_exists__。这样,模块就可以在没有提供该文件时使用默认的配置值。