a) ARM Development Studio 2022 for ARM/AARCH64.
- Install MSYS2.
- Install ARM DS2022. Change the default installation path C:\ArmStudio.
- Launch MSYS2 -> MSYS2 MINGW64.
- Install cmake and make, with
pacman -S mingw-w64-x86_64-cmake
andpacman -S make
. - Setup build environment
export PATH=$PATH:/c/ArmStudio/sw/ARMCompiler6.18/bin export CC=/c/ArmStudio/sw/ARMCompiler6.18/bin/armclang.exe export ARM_PRODUCT_DEF=/c/ArmStudio/sw/mappings/gold.elmap export ARMLMD_LICENSE_FILE=<license file>
- Apply below work around for Windows ARM DS2022 build
- Add set(CMAKE_SYSTEM_ARCH "armv8-a") on the top of
C:\msys64\mingw64\share\cmake\Modules\Compiler\ARMClang.cmake
. The CMAKE_SYSTEM_ARCH is the target arch. - Change
set(libs ${libs} ws2_32)
to#set(libs ${libs} ws2_32)
inlibspdm\os_stub\mbedtlslib\mbedtls\library\CMakeLists.txt
. ws2_32 is the socket lib, and the armclang does not support it.
- Add set(CMAKE_SYSTEM_ARCH "armv8-a") on the top of
- Implement the TBD features.
libspdm_sleep
andlibspdm_get_random_number_64
need to be implemented before it can run on a real system.
a) ARM Development Studio 2022 for ARM/AARCH64.
- Follow the Arm Development Studio Getting Started Guide to install Linux version.
- Setup build environment
echo 'export PATH=$PATH:/opt/arm/developmentstudio-2022.1/sw/ARMCompiler6.18/bin' | sudo tee -a ~/.bashrc echo 'export ARM_PRODUCT_DEF=/opt/arm/developmentstudio-2022.1/sw/mappings/gold.elmap' | sudo tee -a ~/.bashrc echo 'export ARMLMD_LICENSE_FILE=<license file>' | sudo tee -a ~/.bashrc source ~/.bashrc
- Implement the TBD features.
libspdm_sleep
andlibspdm_get_random_number_64
need to be implemented before it can run on a real system.
b) ARM GNU.
- Download 11.2-2022.02: GNU/Linux target (arm-none-linux-gnueabihf, aarch64-none-linux-gnu), and unzip it.
- Add <tool_path>/bin to the $PATH environment. For example:
echo 'export PATH=~/gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf/bin:$PATH' | sudo tee -a ~/.bashrc echo 'export PATH=~/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH' | sudo tee -a ~/.bashrc source ~/.bashrc
- Download 11.2-2022.02: GNU/Linux target (arm-none-eabi, aarch64-none-elf), and unzip it.
- Add <tool_path>/bin to the $PATH environment. For example:
echo 'export PATH=~/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin:$PATH' | sudo tee -a ~/.bashrc echo 'export PATH=~/gcc-arm-11.2-2022.02-x86_64-aarch64-none-elf/bin:$PATH' | sudo tee -a ~/.bashrc source ~/.bashrc
d) ARM GCC for ARM only
sudo apt-get install gcc-arm-linux-gnueabi
e) AARCH64 GCC for AARCH64 only
sudo apt-get install gcc-aarch64-linux-gnu
a) RISCV XPACK.
- Download xPack GNU RISC-V Embedded GCC v12.2.0-1(xpack-riscv-none-elf-gcc-12.1.0-2-linux-x64.tar.gz), and unzip it.
- Add <tool_path>/bin to the $PATH environment. For example:
echo 'export PATH=~/xpack-riscv-none-elf-gcc-12.2.0-1/bin:$PATH' | sudo tee -a ~/.bashrc source ~/.bashrc
- Test install successfully. Use
riscv-none-elf-gcc --version
, then the successful install can seeriscv-none-elf-gcc (xPack GNU RISC-V Embedded GCC x86_64) 12.1.0
.
b) RISCV GNU
- Download the compiler
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
- Compile for riscv64
cd riscv-gnu-toolchain ./configure --prefix=/opt/riscv sudo make linux sudo ln -s /opt/riscv/bin/* /usr/bin
- Compile for riscv32
cd riscv-gnu-toolchain ./configure --prefix=/opt/riscv32 --with-arch=rv32gc --with-abi=ilp32d sudo make linux sudo ln -s /opt/riscv32/bin/* /usr/bin
c) RISCV64 GCC for RISCV64 only
sudo apt-get install gcc-riscv64-linux-gnu
d) RISCV NONE
-
Use a GCC compiler configured for building baremetal (not Linux) binaries. This is supported by any modern Linux distro.
-
On Arch it can be installed with
sudo pacman -Syu riscv32-elf-binutils riscv32-elf-newlib riscv64-elf-binutils riscv64-elf-gcc riscv64-elf-newlib
a) ARC GNU.
- Download ARC GNU.
sudo apt-get install -y texinfo byacc flex libncurses5-dev zlib1g-dev libexpat1-dev texlive build-essential git wget gawk bison xz-utils make python3 rsync locales mkdir arc_gnu cd arc_gnu git clone https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain.git git clone https://github.com/foss-for-synopsys-dwc-arc-processors/binutils-gdb.git binutils git clone https://github.com/foss-for-synopsys-dwc-arc-processors/gcc.git git clone --reference binutils https://github.com/foss-for-synopsys-dwc-arc-processors/binutils-gdb.git gdb git clone https://github.com/foss-for-synopsys-dwc-arc-processors/newlib.git git clone https://github.com/wbx-github/uclibc-ng.git # For For Linux uClibc toolchain git clone https://github.com/foss-for-synopsys-dwc-arc-processors/glibc.git # For Linux glibc toolchain git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux
- Build tool chain.
cd toolchain ./build-all.sh --no-elf32 --cpu hs38 --install-dir $INSTALL_ROOT # This command will build toolchain for arc HS Linux development, for other arc cores refer to https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/blob/arc-releases/README.md sudo ln -s /<work_dir>/arc_gnu/toolchain/bin/* /usr/bin
a) NIOS2 GNU.
- Follow the NIOS II document.
For ARM DS2022 build (arm or aarch64) on Windows, Launch MSYS2 -> MSYS2 MINGW64
command prompt.
cd libspdm
mkdir build
cd build
cmake -G"MSYS Makefiles" -DARCH=<arm|aarch64> -DTOOLCHAIN=ARM_DS2022 -DTARGET=<Debug|Release> -DCRYPTO=<mbedtls|openssl> ..
make copy_sample_key
make
Example CMake commands:
cmake -G"MSYS Makefiles" -DARCH=arm -DTOOLCHAIN=ARM_DS2022 -DTARGET=Debug -DCRYPTO=mbedtls ..
cmake -G"MSYS Makefiles" -DARCH=aarch64 -DTOOLCHAIN=ARM_DS2022 -DTARGET=Release -DCRYPTO=mbedtls ..
Note: make -j
can be used to accelerate the build.
For ARM DS2022 build (arm or aarch64) on Linux,
cd libspdm
mkdir build
cd build
cmake -DARCH=<arm|aarch64> -DTOOLCHAIN=ARM_DS2022 -DTARGET=<Debug|Release> -DCRYPTO=<mbedtls|openssl> ..
make copy_sample_key
make
Example CMake commands:
cmake -DARCH=arm -DTOOLCHAIN=ARM_DS2022 -DTARGET=Debug -DCRYPTO=mbedtls ..
cmake -DARCH=aarch64 -DTOOLCHAIN=ARM_DS2022 -DTARGET=Release -DCRYPTO=mbedtls ..
Note: make -j
can be used to accelerate the build.
For ARM_GNU toolchain GNU/Linux target (arm-none-linux-gnueabihf, aarch64-none-linux-gnu) build on Linux,
cd libspdm
mkdir build
cd build
cmake -DARCH=<arm|aarch64> -DTOOLCHAIN=ARM_GNU -DTARGET=<Debug|Release> -DCRYPTO=<mbedtls|openssl> ..
make copy_sample_key
make
Example CMake commands:
cmake -DARCH=arm -DTOOLCHAIN=ARM_GNU -DTARGET=Debug -DCRYPTO=mbedtls ..
cmake -DARCH=aarch64 -DTOOLCHAIN=ARM_GNU -DTARGET=Release -DCRYPTO=mbedtls ..
Note: make -j
can be used to accelerate the build.
For ARM_GNU_BARE_METAL toolchain GNU/Linux target (arm-none-eabi, aarch64-none-elf) build on Linux,
cd libspdm
mkdir build
cd build
cmake -DARCH=<arm|aarch64> -DMARCH=<armv4t|...|armv7e-m...|iwmmxt2> -DTOOLCHAIN=ARM_GNU_BARE_METAL -DTARGET=<Debug|Release> -DCRYPTO=<mbedtls|openssl> -DISABLE_LTO=<1>..
make copy_sample_key
make
Note that the DMARCH
option is passed directly as a compiler option. As per man arm-none-eabi-gcc
, the following options are allowed:
Permissible names are: armv4t, armv5t, armv5te, armv6, armv6j, armv6k, armv6kz, armv6t2, armv6z, armv6zk, armv7,
armv7-a, armv7ve, armv8-a, armv8.1-a, armv8.2-a, armv8.3-a, armv8.4-a, armv8.5-a, armv8.6-a, armv9-a, armv7-r,
armv8-r, armv6-m, armv6s-m, armv7-m, armv7e-m, armv8-m.base, armv8-m.main, armv8.1-m.main, armv9-a, iwmmxt and
iwmmxt2.
Example CMake commands:
cmake -DARCH=arm -DMARCH=armv7e-m -DTOOLCHAIN=ARM_GNU_BARE_METAL -DTARGET=Debug -DCRYPTO=mbedtls ..
cmake -DARCH=arm -DMARCH=armv4t -DTOOLCHAIN=ARM_GNU_BARE_METAL -DTARGET=Debug -DCRYPTO=mbedtls -DISABLE_LTO=1 ..
cmake -DARCH=aarch64 -DTOOLCHAIN=ARM_GNU_BARE_METAL -DTARGET=Release -DCRYPTO=mbedtls ..
Note: make -j
can be used to accelerate the build.
For RISCV_XPACK toolchain GNU/Linux target (riscv-none-elf-gcc-12.1.0-2-linux-x64) build on Linux, (The riscv64 arch is not supported now.)
cd libspdm
mkdir build
cd build
cmake -DARCH=<riscv32> -DTOOLCHAIN=RISCV_XPACK -DTARGET=<Debug|Release> -DCRYPTO=<mbedtls|openssl> ..
make copy_sample_key
make
Example CMake commands:
cmake -DARCH=riscv32 -DTOOLCHAIN=RISCV_XPACK -DTARGET=Debug -DCRYPTO=mbedtls ..
cmake -DARCH=riscv32 -DTOOLCHAIN=RISCV_XPACK -DTARGET=Release -DCRYPTO=mbedtls ..
Note: make -j
can be used to accelerate the build.
If the toolchain is set to NONE then it will use the native toolchain of the build environment. This is useful inside build environments such as Buildroot or OpenEmbedded.
cd libspdm
mkdir build
cd build
cmake -DARCH=<arch> -DTOOLCHAIN=NONE -DTARGET=<Debug|Release> -DCRYPTO=<mbedtls|openssl> ..
make
Supports shared libraries building and pkg-config '.pc' file generation and installation. Will generate:
- libspdm.so - main library code, all subprojects from "library" folder
- libspdm_platform.so - subprojects in the "os_stub" folder related to platform code, like memory allocation, random number generator, etc.
- libspdm_crypto.so - cryptography related code for libspdm to dynamically link to either Mbed TLS or OpenSSL shared libraries. All three libraries are required for an application that uses libspdm, but the integrator is free to implement their own versions of libspdm_platform or libspdm_crypto libraries and link with their implementations. Will install pc file and all required headers and shared libraries (except for spdm_device_secret_lib_sample which the integrator has to implement), so application developers can use 'pkg-config --libs libspdm' and 'pkg-config --cflags libspdm' to link with libspdm
To build with shared library support:
cmake -DARCH=x64 -DTOOLCHAIN=GCC -DTARGET=Release -DCRYPTO=mbedtls -DBUILD_LINUX_SHARED_LIB=ON ..
To compile and link with libspdm:
gcc `pkg-config --cflags libspdm` -c libspdm_app.c -o libspdm_app.o
gcc libspdm_app.o `pkg-config --libs libspdm` libspdm_app
Unit tests can be disable by adding -DDISABLE_TESTS=1 to CMake.
-DDISABLE_TESTS=1
The libspdm libraries can be built along with Mbed TLS to target an embedded environment. The Integrator must provide a C library and runtime, such as Newlib.
To build libspdm with Mbed TLS for RISC-V 32-bit run the following
cmake -DARCH=riscv32 -DTOOLCHAIN=RISCV_NONE -DTARGET=Debug -DCRYPTO=mbedtls -DDISABLE_TESTS=1 ..