Fuchsia Self-Hosted Build

Build Fuchsia Native Tools

  • If not already cloned, check out the gcc_none_toolchains repository.
git clone https://fuchsia.googlesource.com/third_party/gcc_none_toolchains
  • Build the Fuchsia-native tools.
cd <gcc_none_toolchains-dir>
./do-build \
	--host x86_64-fuchsia \
	--target x86_64-fuchsia \
	--sysroot <path-to-target-sysroot> \
	--strip

By default, this will leave the compiler in the x86_64-fuchsia-<gcc-ver>-native subdirectory of the current directory.

Build Fuchsia-Hosted Bare-Metal Tools

  • In the same gcc_none_toolchains repository, build the fuchsia-hosted bare-metal tools:
./do-build \
	--host x86_64-fuchsia \
	--target x86_64-none \
	--sysroot <path-to-target-sysroot> \
	--strip

By default, this will leave the compiler in the x86_64-elf-<gcc-ver>-Fuchsia-x86_64 subdirectory of the current directory.

Build GN and Ninja

  • Checkout GN and Ninja sources, if needed:
git clone https://gn.googlesource.com/gn
git clone https://fuchsia.googlesource.com/third_party/ninja
  • Follow the instructions provided in README.md of the GN and Ninja sources

Build utilities (Shouldn't be necessary)

The following utilities are required by the build scripts. As long as your build manifest included the sbase project, these should have been installed with your Fuchsia build:

uname
which
tr
find
mv
cmp
sort
basename
sed

Build Zircon

Follow standard Zircon/Fuchsia source configuration instructions. Note that you will want a minimum of zircon and sbase.

In order for gcc-built executables to run in Fuchsia, we will need the gcc runtime libraries, built for Fuchsia. They were built as part of the Fuchsia native build, but we need them to be installed into one of the standard runtime library locations on the target. One way to do this is to add the libraries to the manifest lines in zircon/kernel/engine.mk:

USER_MANIFEST_LINES += lib/libgcc_s.so.1=<path-to-gcc>/x86_64-fuchsia-6.3.0-native/lib/libgcc_s.so.1
USER_MANIFEST_LINES += lib/libgcc_s.so=<path-to-gcc>/x86_64-fuchsia-6.3.0-native/lib/libgcc_s.so
USER_MANIFEST_LINES += lib/libstdc++.so=<path-to-gcc>/x86_64-fuchsia-6.3.0-native/lib/libstdc++.so

Follow the standard Zircon/Fuchsia build instructions, and run the resulting image on the desired target.

Copy Files Onto Target

Create a new empty directory in the target environment (for this example, we‘ll use /data). For your own sanity, this should be persistent storage of some sort. For this example, we’ll use the following /data subdirectories:

bin             Directory for miscellaneous tools not provided in Fuchsia or Zircon
gcc             Native gcc installation
gcc-bare-metal  Fuchsia-hosted bare-metal tools
zircon         The Zircon source files
sysroot         The sysroot of the installed Fuchsia
  • Netcp all native gcc files into /data/gcc
cd <gcc-install-dir>/x86_64-fuchsia-<gcc-ver>-native
for filename in `find . -type f`
do
  echo "Copying $filename"
  netcp "$filename" ":/data/gcc/$filename"
done
  • Netcp all bare-metal gcc files into /data/gcc-bare-metal
cd <gcc-install-dir>/x86_64-elf-gcc-<gcc-ver>-Fuchsia-x86_64
for filename in `find . -type f`
do
  echo "Copying $filename"
  netcp "$filename" ":/data/gcc-bare-metal/$filename"
done
  • Netcp gn and ninja to /data/bin
netcp <gn-build-dir>/gn :/data/bin
netcp <ninja-build-dir>/ninja :/data/bin
  • Copy the zircon source code onto the target, either using netcp or a mounted image, or git. Note that if you are using the same source tree as was used to build the target image, you'll want to remove any modifications to kernel/engine.mk that were made for previous steps (or update them to reflect the target location of these files), otherwise the build will fail when trying to generate the bootfs image.
cd <path-to-zircon>
for filename in `find . -name .git -prune \
                        -o -path "./build-*" -prune \
                        -o -path "./prebuilt*" \
                        -o -type f -print`
do
  echo "Copying $filename" 
  netcp $filename :/data/zircon/$filename
done
  • Copy the Zircon sysroot onto the target device in /data/sysroot
cd <zircon-sysroot>
for filename in `find . -type f`
do
  echo "Copying $filename"
  netcp $filename :/data/sysroot/$filename
done
  • Copy the compiler shared libraries into /data/sysroot/lib
cd <path-to-gcc>/x86_64-fuchsia-<gcc-ver>-native
for filename in libstdc++.so libgcc_s.so libgcc_s.so.1
do
  echo "Copying $filename"
  netcp lib/$filename :/data/sysroot/lib/$filename
done

Build Zircon

On the Fuchsia target, add /data/bin, /data/gcc/bin, and data/gcc-bare-metal/bin to your PATH

export PATH="$PATH:/data/bin:/data/gcc/bin:/data/gcc-bare-metal/bin"
  • Finally, start the build in the zircon directory:
cd zircon
gn gen build-zircon --args='sysroot = /data/sysroot'
ninja -C build-zircon