1.3. Simplified SDK Build using Top-Level Makefile

Overview

Inside of the Processor SDK Linux J7200 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.

NOTE: 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 Linux J7200 package.

Purpose

The Rules.make file in the top-level of the Processor SDK Linux J7200 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.

Note

When working with HS devices, please refer to A Note about building for HS devices for additional setup steps before using the top-level Makefile.

Makefile

The following sections cover the Makefile found in the top-level of the Processor SDK Linux J7200 package.

Required Host Packages

Please run the following command to install all packages required to by the makefile targets.

host# sudo apt-get install build-essential autoconf automake bison flex libssl-dev bc u-boot-tools

Compiler toolchain

On the download page, you will find links to the recommended compiler toolchains. Download and extract them into your home directory. Note that you have to download both the toolchains for ARMv8 and ARMv7. Make sure to update your PATH to include the path to toolchain.

GCC92PATH=$HOME/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin:$HOME/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin
export PATH=$GCC92PATH:$PATH

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>_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 Linux J7200 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 Linux J7200 package:

  • linux - Compiles the Linux kernel using the default tisdk_<PLATFORM>_defconfig configuration.
  • linux-dtbs - Compiles and creates the device tree blobs.
  • am-benchmarks - Builds the ARM Benchmarks for the ARCH defined in Rules.make.
  • am-sysinfo - Build the helper applications used by the system settings demos in Matrix.

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.

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
  • Clean Everything
host# make clean
  • Install Everything
host# make install
  • Build the Linux kernel
host# make linux
  • Install the Linux kernel modules
host# make linux_install
  • Build the ARM Benchmarks
host# make am-benchmarks
  • Clean the ARM Benchmarks
host# make am-benchmarks_clean
  • Install the ARM Benchmarks
host# make am-benchmarks_install
  • Build u-boot
host# make u-boot
  • Clean u-boot
host# make u-boot_clean

Installing to SD card rootfs

All the install targets copy the files in the rootfs pointed by the DESTDIR variable. By default, Rules.make points the DESTDIR to the NFS path for filesystem. If you want to install the files to the SD card, you should be able to specify different path to DESTDIR on commandline. e.g. run following for installing everything in the SD card rootfs.

host# sudo DESTDIR=/media/$USER/rootfs make install
#Replace the path to SD card rootfs partition as appropriate

Installing boot binaries

All the install targets copy the files in the rootfs pointed by the DESTDIR variable. make install command only copies the files in rootfs. If you have built either of system firmware or u-boot, you should copy these binaries in the boot partition of the SD card. e.g. run following to copy boot binaries in SD card boot partition.

host# sudo cp board-support/u-boot_build/a72/u-boot.img board-support/u-boot_build/a72/tispl.bin board-support/k3-image-gen-*/tiboot3.bin /media/$USER/boot
#Replace the path to SD card boot partition as appropriate

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.

A Note about building for HS devices

The PSDK Linux can be built for HS devices with small modifications to the steps listed above. Most steps are identical to the build and installation steps listed above for a non-HS device. In addition to the steps shown above for setting up the PSDK Linux, edit the Rules.make to choose the HS platform name and u-boot machine names as shown below.

PLATFORM=j7200-hs-evm
UBOOT_MACHINE=j7200_hs_evm_a72_config
UBOOT_MACHINE_R5=j7200_hs_evm_r5_config
  • Build and install u-boot

    Using prebuilt images of ATF (Arm Trusted Firmware), OPTEE (Open Portable Trusted Execution Environment), and MCU1_0 (Micro Controller Unit), we can quickly build binaries that can be used to boot a HS device in the same way as shown in the section above. After a successful u-boot build, the boot files that will need to be copied to the ‘BOOT’ partition in the SD card will be located below. Important Note: The files must be copied to the ‘BOOT’ partition with the same file name as shown in the commands below

    host# sudo cp board-support/k3-image-gen-*/tiboot3.bin /media/$USER/boot/tiboot3.bin
    host# sudo cp board-support/u-boot_hs_build/a72/tispl.bin_HS /media/$USER/boot/tispl.bin
    host# sudo cp board-support/u-boot_hs_build/a72/u-boot.img_HS /media/$USER/boot/u-boot.img
    #Replace the path to SD card boot partition as appropriate
    

    Note

    By default, this builds u-boot for J7200 PG2.0. To build u-boot for J7200 PG1.0, modify the UBOOT_SOC=j7200_sr2 line in the Makefile to equal j7200 and build.

  • Installing the fitImage

    If using an HS device, the fitImage will need to be installed. The fitImage is included in the prebuilt-images of the PSDK Linux. Install the fitImage using the command shown below

    host# sudo install board-support/prebuilt-images/fitImage /media/$USER/rootfs/boot/
    

To rebuild any of the prebuilt binaries for an HS device, please refer to the respective section under Foundational Components.