Using the XCOMMON build system#
The common XMOS Makefile provides support for building applications and
source code modules. You need only specify the required properties of the build
in Application Makefiles and module_build_info
files.
Applications and Modules#
An application is made up of source code unique to the application and, optionally, source code from modules of common code or binary libraries. When developing an application, the working area is described in terms of workspaces, applications and modules.
- Workspace
A workspace is a container for several projects.
- Applications
An application is a project containing source files and a Makefile that builds into a single executable (
.xe
) file. By convention application directories start with the prefixapp_
.- Modules
A module is a directory containing source files and/or binary libraries. The source does not build to anything by itself but can be used by applications. By convention module directories start with the prefix
module_
.
Workspace structure and automatic module detection#
Depending on the configuration of your workspace the Makefiles will search folders on your file system to find modules used by an application.
The simplest structure is shown below:
app_avb_demo1/
app_avb_demo2/
module_avb1/
module_avb2/
module_xtcp/
module_zeroconf/
module_ethernet/
In this case when building the applications, the build system will find the modules on the same directory level as the applications.
Sometimes applications and modules are organized in separate repositories:
repo1/
app_avb_demo1/
module_avb1/
repo2/
module_zeroconf/
If the Makefiles detect that the folder containing the application is
a repository then the Makefiles will search the sub-folders of all
repositories at the same nesting level for modules (in this case the
sub-folders of repo1
and repo2
). The Makefiles will detect a
folder as a repository if one of the following conditions hold:
The folder has a
.git
sub-folder.The folder starts with the prefix
sc_
,ap_
,sw_
,tool_
orlib_
.The folder contains a file called
.xcommon_repo
orxpd.xml
.
If the folder above the application is detected as a repository but the folder above that is then the Makefiles will search at that level. So in the following case:
repo1/
examples/
app_avb_demo1/
module_avb1/
repo2/
module_zeroconf/
The sub-folders of repo1
and repo2
will be searched.
In addition to the automatic searching for modules, the environment
variable XMOS_MODULE_PATH
can be set to a list of paths that the
Makefiles should search. If you just want to solely use the user specified
search path then the automatic searching for modules
can be disabled by setting the environment variable
XCOMMON_DISABLE_AUTO_MODULE_SEARCH
to 1
.
The Application Makefile#
Every application directory should contain a file named Makefile
that includes the common XMOS Makefile. The common Makefile controls the build,
by default including all source files within the application directory and its
sub-directories. The application Makefile supports the following variable
assignments.
- XCC_FLAGS[_config]#
Specifies the flags passed to xcc during the build. This option sets the flags for the particular build configuration config. If no suffix is given, it sets the flags for the default build configuration.
- XCC_C_FLAGS[_config]#
If set, these flags are passed to xcc instead of
XCC_FLAGS
for all.c
files. This option sets the flags for the particular build configuration config. If no suffix is given, it sets the flags for the default build configuration.
- XCC_ASM_FLAGS[_config]#
If set, these flags are passed to xcc instead of
XCC_FLAGS
for all.s
or.S
files. This option sets the flags for the particular build configuration config. If no suffix is given, it sets the flags for the default build configuration.
- XCC_MAP_FLAGS[_config]#
If set, these flags are passed to xcc for the final link stage instead of
XCC_FLAGS
. This option sets the flags for the particular build configuration config. If no suffix is given, it sets the flags for the default build configuration.
- XCC_FLAGS_<filename>#
Overrides the flags passed to xcc for the filename specified. This option overrides the flags for all build configurations.
- VERBOSE#
If set to 1, enables verbose output from the make system.
- SOURCE_DIRS#
Specifies the list of directories, relative to the application directory, that have their contents compiled. By default all directories are included.
- INCLUDE_DIRS#
Specifies the directories to look for include files during the build. By default all directories are included.
- LIB_DIRS#
Specifies the directories to look for libraries to link into the application during the build. By default all directories are included.
- EXCLUDE_FILES#
Specifies a space-separated list of source file names (not including their path) that are not compiled into the application.
- USED_MODULES#
Specifies a space-separated list of module directories that are compiled into the application. The module directories should always be given without their full path irrespective of which project they come from, for example:
USED_MODULES = module_xtcp module_ethernet
- MODULE_LIBRARIES#
This option specifies a list of preferred libraries to use from modules that specify more than one. See Using XMOS Makefiles to create binary libraries for details.
The module_build_info file#
Each module directory should contain a file named module_build_info
.
This file informs an application how to build the files
within the module if the application includes the module in its build.
It can optionally contain several of the following variable assignments.
- DEPENDENT_MODULES#
Specifies the dependencies of the module. When an application includes a module it will also include all its dependencies.
- MODULE_XCC_FLAGS#
Specifies the options to pass to xcc when compiling source files from within the current module. The definition can reference the
XCC_FLAGS
variable from the application Makefile, for example:MODULE_XCC_FLAGS = $(XCC_FLAGS) -O3
- MODULE_XCC_XC_FLAGS#
If set, these flags are passed to xcc instead of
MODULE_XCC_FLAGS
for all.xc
files within the module.
- MODULE_XCC_C_FLAGS#
If set, these flags are passed to xcc instead of
MODULE_XCC_FLAGS
for all.c
files within the module.
- MODULE_XCC_ASM_FLAGS#
If set, these flags are passed to xcc instead of
MODULE_XCC_FLAGS
for all.s
or.S
files within the module.
- OPTIONAL_HEADERS#
Specifies a particular header file to be an optional configuration header. This header file does not exist in the module but is provided by the application using the module. The build system will pass the a special macro
__filename_h_exists__
to xcc if the application has provided this file. This allows the module to provide default configuration values if the file is not provided.