blob: e49f415543d4884b0b027ced549a6a6d7e6c9578 [file] [log] [blame]
Joakim Bech8e5c5b32018-10-25 08:18:32 +02001.. _toolchains:
2
3##########
4Toolchains
5##########
6OP-TEE uses both 32bit as well as 64bit toolchains and it is even possible to
7mix them in some configurations. In theory you should be able to compile OP-TEE
8with the Arm toolchains that are coming with your Linux distribution. But
9instead of using those directly, we instead download the toolchains directly
10from Arm.
11
12Download/install
13****************
14We propose two ways to download the toolchains, both will put the toolchains
15under the same path(s).
16
Etienne Carriere50b8a172019-03-11 11:46:39 +010017Direct download
18===============
Joakim Bech8e5c5b32018-10-25 08:18:32 +020019Go the `Arm GCC download page`_ and download the "`AArch32 target with soft
20float (arm-linux-gnueabi)`" for 32bit builds and the "`AArch64 GNU/Linux target
21(aarch64-linux-gnu)`" for 64bit builds. When the downloads have finished, you
22will untar them to a location that you later on will export to your ``$PATH``.
23Here is an example
24
25.. code-block:: bash
26
27 $ mkdir -p $HOME/toolchains
28 $ cd $HOME/toolchains
29
30 # Download 32bit toolchain
31 $ wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.2-2019.01/gcc-arm-8.2-2019.01-x86_64-arm-linux-gnueabi.tar.xz
32 $ mkdir aarch32
33 $ tar xf gcc-arm-8.2-2019.01-x86_64-arm-linux-gnueabi.tar.xz -C aarch32 --strip-components=1
34
35 # Download 64bit toolchain
36 $ wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.2-2019.01/gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu.tar.xz
37 $ mkdir aarch64
38 $ tar xf gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu.tar.xz -C aarch64 --strip-components=1
39
Etienne Carriere50b8a172019-03-11 11:46:39 +010040Using build.git
41===============
Joakim Bech8e5c5b32018-10-25 08:18:32 +020042As an alternative, you can let :ref:`build`.git download them for you, but this
43of course involves getting a git that you might not otherwise use.
44
45.. code-block:: bash
46
47 $ cd $HOME
48 $ git clone https://github.com/OP-TEE/build.git
49 $ cd build
50 $ make -f toolchain.mk -j2
51
52
53Export PATH
54***********
55If you have downloaded the toolchains as described above, you should have them
56at ``$HOME/toolchains/{aarch32/aarch64}``, so now we just need to export the
57paths and then you are ready to starting compiling OP-TEE components.
58
59.. code-block:: bash
60
61 $ export PATH=$PATH:$HOME/toolchains/aarch32/bin:$HOME/toolchains/aarch64/bin
62
Joakim Bech74db0132020-02-21 15:19:07 +010063.. _llvm:
64
65LLVM / Clang
66************
Victor Chongb596bff2020-05-25 08:37:03 +010067It's possible to also compile :ref:`optee_os`.git using llvm/clang. To do that,
68you can download and extract Clang from the GitHub release page. You'll need an
69x86_64 cross-compiler capable of generating aarch64 and armv7a code **and** the
70compiler-rt libraries for these architectures (libclang_rt.*.a).
71
72Clang is configured to be able to cross-compile to all the supported
73architectures by default (see <clang path>/bin/llc --version) which is great,
74but compiler-rt is included only for the host architecture. Therefore you need
75to combine several packages into one. Please refer to this `get_clang.sh`_
76script for details on creating a llvm/clang toolchain ready to be used.
77
78Using build.git
79===============
80As an alternative, you can let :ref:`build`.git download them for you, but this
81of course involves getting a git that you might not otherwise use.
Joakim Bech74db0132020-02-21 15:19:07 +010082
83.. code-block:: bash
84
Victor Chongb596bff2020-05-25 08:37:03 +010085 $ cd $HOME
86 $ git clone https://github.com/OP-TEE/build.git
87 $ cd build
88 $ make -f toolchain.mk clang-toolchains
Joakim Bech74db0132020-02-21 15:19:07 +010089
Victor Chongb596bff2020-05-25 08:37:03 +010090The above instructions will download and install Clang in ``$HOME/clang-9.0.1``.
91
92You can also get the toolchain using your package manager or alternatively build
93it yourself, but these alternative methods risk being incomplete. For example,
94the Ubuntu clang package does not install the needed ld.lld package. The package
95also does not contain the cross-compiled compiler-rt libraries. Building by
96yourself is hard for the same reason, i.e. no cross-compiled compiler-rt
97libraries are generated.
98
Joakim Bech74db0132020-02-21 15:19:07 +010099
Joakim Bech8e5c5b32018-10-25 08:18:32 +0200100.. _Arm GCC download page: https://developer.arm.com/open-source/gnu-toolchain/gnu-a/downloads
Victor Chongb596bff2020-05-25 08:37:03 +0100101.. _get_clang.sh: https://github.com/OP-TEE/build/blob/master/get_clang.sh