Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

使用Makefile构建工具-XCOMMON系统

通用XMOS Makefile提供了对构建应用程序和源代码模块的支持。您只需在应用程序Makefilemodule_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会搜索与该文件夹同一嵌套级别的所有仓库的子文件夹中的模块(在这种情况下,是repo1repo2的子文件夹)。Makefiles会在以下情况之一成立时,将一个文件夹检测为一个仓库:

  • 该文件夹有一个.git子文件夹。
  • 该文件夹以sc_, ap_, sw_, tool_lib_为前缀。
  • 该文件夹包含一个名为.xcommon_repoxpd.xml的文件。

如果应用程序上一级目录被检测为一个仓库,但上一级目录不是,那么Makefiles将在那个层级进行搜索。例如,在以下情况下:

repo1/
examples/
app_uac_demo1/
lib_i2s/
repo2/
lib_usb/

repo1repo2的子目录将被搜索。

除了自动搜索模块外,还可以设置环境变量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
sw_usb_audio/app_usb_aud_xk_316_pp/Makefile
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__。这样,模块就可以在没有提供该文件时使用默认的配置值。