1.1.4. SDK Build using Makefile
Overview
Inside of the Processor SDK package, there is a top-level Makefile that can be used to build some of the sub-components found within the SDK. This Makefile uses the Rules.make file and gives an example of how the various components can be built and the parameters to use.
The source code is available at TexasInstruments/ti-tisdk-makefile
Caution
You should not call this makefile with the “environment-setup” script sourced. The sub-component Makefiles will handle sourcing this script where appropriate, but some make targets such as the Linux kernel make target do not work properly when this script is already sourced.
Rules.make
The following sections cover the Rules.make file found in the top-level of the Processor SDK package.
Purpose
The Rules.make file in the top-level of the Processor SDK package is used not only by the top-level Makefile, but also by many of the sub-component Makefiles to gain access to common shared variables and settings. The next section covers the main variables defined in the Rules.make file.
Variables Defined
PLATFORM - This represents the machine name of the device supported by the SDK. This machine name has a direct correlation to the machine definition in the Arago project build system. The PLATFORM variable can be used by component Makefiles to make decisions on a per-machine basis.
ARCH - This represents the architecture family of the machine. This can be used by component Makefiles to change settings such as mtune values in CFLAGS based on the architecture of the PLATFORM.
UBOOT_MACHINE - This us used when building u-boot to configure the u-boot sources for the correct device.
TI_SDK_PATH - This points to the top-level of the SDK. This is the same directory where the Rules.make file itself is located.
DESTDIR - This points to the base installation directory that applications/drivers should be installed to. This is usually the root of a target file system but can be changed to point anywhere.
LINUX_DEVKIT_PATH - This points to the linux-devkit directory. This directory is the base directory containing the cross-compiler and cross-libraries as well as the environment-setup script used by many component Makefiles to source additional variable settings.
CROSS_COMPILE - This setting represents the CROSS_COMPILE prefix to be used when invoking the cross-compiler. Many components such as the Linux kernel use the variable CROSS_COMPILE to prepend the proper prefix to commands such as gcc to invoke the ARM cross-compiler.
ENV_SETUP - This points to the environment-setup script in the linux-devkit directory used by many components to configure for a cross-compilation build.
LINUXKERNEL_INSTALL_DIR - This points to the location of the Linux kernel sources, which is used by components such as out-of-tree kernel drivers to find the Linux kernel Makefiles and headers.
Makefile
The following sections cover the Makefile found in the top-level of the Processor SDK package. The Processor SDK can be installed either on a Linux host or inside a docker container that is hosted on ghcr.io/texasinstruments.
1.1.4.1. Steps to follow inside a Docker Container
The SD card you wish to create is inserted into the host system and has a size sufficiently large (16GB or larger) to hold at least the bootloaders, kernel and root file system.
Follow this to understand the Makefile usage.
1.1.4.2. Steps to follow on Linux Host
Required Host Packages
Please run the following command to install all packages required by the makefile targets.
host# sudo apt-get install build-essential autoconf automake bison flex libmpc-dev libmpcdec6 libmpc3 libmpcdec-dev libssl-dev bc u-boot-tools swig python3 python3-pip
Following pip packages are also needed for jailhouse & binman in u-boot targets
host# pip3 install jsonschema pyelftools PyYAML Mako yamllint
Target Types
For each of the targets discussed below the following target type are defined
<target> - This is the build target which will compile the release version of the component.
<target>_stage - This target will copy the component to <TISDK_path>/board-support/built-images folder.
<target>_install - This target will install the component to the location pointed to by DESTDIR.
<target>_clean - This target will clean the component.
Top-Level Targets
The Processor SDK package provides the following targets by default, which will invoke the corresponding component targets:
all
- This will call the build target for each component defined in the Makefile.install
- This will call the install target for each component defined in the Makefile.clean
- This will call the clean target for each component defined in the Makefile.
Common Targets
The following targets are common to all platforms in Processor SDK package:
linux
- Compiles the Linux kernel using the default tisdk_<PLATFORM>_defconfig configuration.linux-dtbs
- Compiles and creates the device tree blobs.u-boot
- This target will build both u-boot and the u-boot SPL (MLO) binaries used in newer versions of u-boot. This actually provides a u-boot and u-boot-spl target in the Makefile.
Additional Targets
Depending on the capabilities and software available for a given device additional targets may also be defined. You can find the list of all the targets by looking at the all target as described in the **Top-Level Targets** section above. Some devices will have following additional targets:
arm-benchmarks
- Build the ARM Benchmarkscryptodev
- Build module for cryptographic hardware accelerators.
Along with these targets, there might be additional targets for different external kernel modules. This list is different for each platform.
Usage Examples
The following examples demonstrate how to use the top-level Makefile for some common tasks. All of the examples below assume that you are calling the Makefile from the top-level of the SDK.
Build Everything
host# make all
Clean Everything
host# make clean
Install Everything
host# make install
Build Linux kernel and Fitimage
host# make linux
Copy FitImage, Linux Kernel Image and boot-binaries to built-images folder
host# make linux_stage
Install Linux kernel modules and Fitimage to SD card rootfs
host# make linux_install To install in SD card directly: host# sudo DESTDIR=/media/$USER/rootfs make linux_install
Clean Linux
host# make linux_clean
Build the ARM Benchmarks
host# make arm-benchmarks
Clean the ARM Benchmarks
host# make arm-benchmarks_clean
Install the ARM Benchmarks
host# sudo make arm-benchmarks_install
Build u-boot
host# make u-boot
Build A53
host# make u-boot-a53
Build R5
host# make u-boot-r5
Copy boot-binaries to built-images folder
host# make u-boot_stage
Install boot-binaries to SD card boot partition
host# sudo DESTDIR=/media/$USER/boot make u-boot_install
Clean u-boot
host# make u-boot_clean
Installing boot binaries
All the install targets copy the files in the rootfs pointed by the DESTDIR variable. Run following commands to copy boot binaries in SD card boot partition.
For GP
#Replace the path to SD card boot partition as appropriate
host# sudo cp board-support/built-images/u-boot.img /media/$USER/boot/u-boot.img
host# sudo cp board-support/built-images/tispl.bin /media/$USER/boot/tispl.bin
host# sudo cp board-support/built-images/tiboot3-am64x-gp-evm.bin /media/$USER/boot/tiboot3.bin
For HS-FS
#Replace the path to SD card boot partition as appropriate
host# sudo cp board-support/built-images/u-boot.img /media/$USER/boot/u-boot.img
host# sudo cp board-support/built-images/tispl.bin /media/$USER/boot/tispl.bin
host# sudo cp board-support/built-images/tiboot3-am64x_sr2-hs-fs-evm.bin /media/$USER/boot/tiboot3.bin
For HS-SE
#Replace the path to SD card boot partition as appropriate
host# sudo cp board-support/built-images/u-boot.img /media/$USER/boot/u-boot.img
host# sudo cp board-support/built-images/tispl.bin /media/$USER/boot/tispl.bin
host# sudo cp board-support/built-images/tiboot3-am64x_sr2-hs-evm.bin /media/$USER/boot/tiboot3.bin
A Note about Out-of-tree Kernel Modules
Some drivers like the GPU drivers are delivered as modules outside of the kernel tree. If you rebuild the kernel and install it using the “make linux_install” target you will also need to rebuild the out of tree modules and install them as well. The modules_install command used by the linux_install target will remove any existing drivers before installing the new ones. This means those drivers are no longer available until they have been rebuilt against the kernel and re-installed.
A Note about the Linux Kernel Version
To simplify and accelerate rebuilding and installing the linux kernel, the file .scmversion is included in the kernel source tree to pin down the version of the kernel provided in the SDK. If upgrading the kernel sources or adding new commits, this file should be removed so that the appropriate version is built into the kernel image.