From 21c77b488703b90275244a1dbb2c0362eef8426c Mon Sep 17 00:00:00 2001 From: Florian Agbuya Date: Fri, 24 Nov 2023 17:33:24 +0800 Subject: [PATCH] flake: add various package --- flake.nix | 205 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 185 insertions(+), 20 deletions(-) diff --git a/flake.nix b/flake.nix index 272ffa0..03dcad0 100644 --- a/flake.nix +++ b/flake.nix @@ -3,34 +3,199 @@ inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-unstable; inputs.not-os.url = github:cleverca22/not-os; - inputs.zynq-rs.url = git+https://git.m-labs.hk/m-labs/zynq-rs; - outputs = { self, nixpkgs, not-os, zynq-rs }: + outputs = { self, nixpkgs, not-os }: let pkgs = import nixpkgs { system = "x86_64-linux"; }; - zynqpkgs = zynq-rs.packages.x86_64-linux; - build = { target ? "zc706" }: let - fsbl = zynqpkgs."${target}-fsbl"; + gnu-platform = "arm-none-eabi"; - u-boot = pkgs.pkgsCross.armv7l-hf-multiplatform.buildUBoot { - defconfig = "xilinx_zynq_virt_defconfig"; - preConfigure = '' - export DEVICE_TREE=zynq-zc706 + binutils-pkg = { zlib, extraConfigureFlags ? [] }: pkgs.stdenv.mkDerivation rec { + basename = "binutils"; + version = "2.30"; + name = "${basename}-${gnu-platform}-${version}"; + src = pkgs.fetchurl { + url = "https://ftp.gnu.org/gnu/binutils/binutils-${version}.tar.bz2"; + sha256 = "028cklfqaab24glva1ks2aqa1zxa6w6xmc8q34zs1sb7h22dxspg"; + }; + configureFlags = [ + "--enable-deterministic-archives" + "--target=${gnu-platform}" + "--with-cpu=cortex-a9" + "--with-fpu=vfpv3" + "--with-float=hard" + "--with-mode=thumb" + ] ++ extraConfigureFlags; + outputs = [ "out" "info" "man" ]; + depsBuildBuild = [ pkgs.buildPackages.stdenv.cc ]; + buildInputs = [ zlib ]; + enableParallelBuilding = true; + meta = { + description = "Tools for manipulating binaries (linker, assembler, etc.)"; + longDescription = '' + The GNU Binutils are a collection of binary tools. The main + ones are `ld' (the GNU linker) and `as' (the GNU assembler). + They also include the BFD (Binary File Descriptor) library, + `gprof', `nm', `strip', etc. ''; - extraMeta.platforms = ["armv7l-linux"]; - filesToInstall = ["u-boot.elf"]; + homepage = http://www.gnu.org/software/binutils/; + license = pkgs.lib.licenses.gpl3Plus; + /* Give binutils a lower priority than gcc-wrapper to prevent a + collision due to the ld/as wrappers/symlinks in the latter. */ + priority = "10"; + }; + }; + + gcc-pkg = { gmp, mpfr, libmpc, platform-binutils, extraConfigureFlags ? [] }: pkgs.stdenv.mkDerivation rec { + basename = "gcc"; + version = "9.1.0"; + name = "${basename}-${gnu-platform}-${version}"; + src = pkgs.fetchurl { + url = "https://ftp.gnu.org/gnu/gcc/gcc-${version}/gcc-${version}.tar.xz"; + sha256 = "1817nc2bqdc251k0lpc51cimna7v68xjrnvqzvc50q3ax4s6i9kr"; + }; + preConfigure = '' + mkdir build + cd build + ''; + configureScript = "../configure"; + configureFlags = [ + "--target=${gnu-platform}" + "--with-arch=armv7-a" + "--with-tune=cortex-a9" + "--with-fpu=vfpv3" + "--with-float=hard" + "--disable-libssp" + "--enable-languages=c" + "--with-as=${platform-binutils}/bin/${gnu-platform}-as" + "--with-ld=${platform-binutils}/bin/${gnu-platform}-ld" ] ++ extraConfigureFlags; + outputs = [ "out" "info" "man" ]; + hardeningDisable = [ "format" "pie" ]; + propagatedBuildInputs = [ gmp mpfr libmpc platform-binutils ]; + enableParallelBuilding = true; + dontFixup = true; + }; + + newlib-pkg = { platform-binutils, platform-gcc }: pkgs.stdenv.mkDerivation rec { + pname = "newlib"; + version = "3.1.0"; + src = pkgs.fetchurl { + url = "ftp://sourceware.org/pub/newlib/newlib-${version}.tar.gz"; + sha256 = "0ahh3n079zjp7d9wynggwrnrs27440aac04340chf1p9476a2kzv"; + }; + nativeBuildInputs = [ platform-binutils platform-gcc ]; + configureFlags = [ + "--target=${gnu-platform}" + + "--with-cpu=cortex-a9" + "--with-fpu=vfpv3" + "--with-float=hard" + "--with-mode=thumb" + "--enable-interwork" + "--disable-multilib" + + "--disable-newlib-supplied-syscalls" + "--with-gnu-ld" + "--with-gnu-as" + "--disable-newlib-io-float" + "--disable-werror" + ]; + dontFixup = true; + }; + + gnutoolchain = rec { + binutils-bootstrap = pkgs.callPackage binutils-pkg { }; + gcc-bootstrap = pkgs.callPackage gcc-pkg { + platform-binutils = binutils-bootstrap; + extraConfigureFlags = [ "--disable-libgcc" ]; + }; + newlib = pkgs.callPackage newlib-pkg { + platform-binutils = binutils-bootstrap; + platform-gcc = gcc-bootstrap; + }; + binutils = pkgs.callPackage binutils-pkg { + extraConfigureFlags = [ "--with-lib-path=${newlib}/arm-none-eabi/lib" ]; + }; + gcc = pkgs.callPackage gcc-pkg { + platform-binutils = binutils; + extraConfigureFlags = [ "--enable-newlib" "--with-headers=${newlib}/arm-none-eabi/include" ]; + }; + }; + + mkbootimage = pkgs.stdenv.mkDerivation { + pname = "mkbootimage"; + version = "2.3dev"; + + src = pkgs.fetchFromGitHub { + owner = "antmicro"; + repo = "zynq-mkbootimage"; + rev = "872363ce32c249f8278cf107bc6d3bdeb38d849f"; + sha256 = "sha256-5FPyAhUWZDwHbqmp9J2ZXTmjaXPz+dzrJMolaNwADHs="; }; - fsbl-sd = pkgs.runCommand "${target}-fsbl-sd" + propagatedBuildInputs = [ pkgs.libelf pkgs.pcre ]; + patchPhase = '' + substituteInPlace Makefile --replace "git rev-parse --short HEAD" "echo nix" + ''; + installPhase = '' + mkdir -p $out/bin + cp mkbootimage $out/bin + ''; + }; + + fsbl = { board ? "zc706" }: pkgs.stdenv.mkDerivation { + name = "${board}-fsbl"; + src = pkgs.fetchFromGitHub { + owner = "Xilinx"; + repo = "embeddedsw"; + rev = "65c849ed46c88c67457e1fc742744f96db968ff1"; + sha256 = "1rvl06ha40dzd6s9aa4sylmksh4xb9dqaxq462lffv1fdk342pda"; + }; + patches = [ ./fsbl.patch ]; + nativeBuildInputs = [ + pkgs.gnumake + gnutoolchain.binutils + gnutoolchain.gcc + ]; + patchPhase = '' + patch -p1 -i ${./fsbl.patch} + patchShebangs lib/sw_apps/zynq_fsbl/misc/copy_bsp.sh + echo 'SEARCH_DIR("${gnutoolchain.newlib}/arm-none-eabi/lib");' >> lib/sw_apps/zynq_fsbl/src/lscript.ld + ''; + buildPhase = '' + cd lib/sw_apps/zynq_fsbl/src + make BOARD=${board} "CFLAGS=-DFSBL_DEBUG_INFO -g" + ''; + installPhase = '' + mkdir $out + cp fsbl.elf $out + ''; + doCheck = false; + dontFixup = true; + }; + + u-boot = pkgs.pkgsCross.armv7l-hf-multiplatform.buildUBoot { + defconfig = "xilinx_zynq_virt_defconfig"; + preConfigure = '' + export DEVICE_TREE=zynq-zc706 + ''; + extraMeta.platforms = ["armv7l-linux"]; + filesToInstall = ["u-boot.elf"]; + }; + + build = { target ? "zc706" }: let + fsblDrv = fsbl { board = "zc706"; }; + u-bootDrv = u-boot; + + bootimage = pkgs.runCommand "${target}-bootimage" { - buildInputs = [ zynqpkgs.mkbootimage ]; + buildInputs = [ mkbootimage ]; } '' bifdir=`mktemp -d` cd $bifdir - ln -s ${fsbl}/fsbl.elf fsbl.elf - ln -s ${u-boot}/u-boot.elf u-boot.elf + ln -s ${fsblDrv}/fsbl.elf fsbl.elf + ln -s ${u-bootDrv}/u-boot.elf u-boot.elf cat > boot.bif << EOF the_ROM_image: { @@ -43,19 +208,19 @@ echo file binary-dist $out/boot.bin >> $out/nix-support/hydra-build-products ''; in { - "${target}-fsbl-sd" = fsbl-sd; + "${target}-bootimage" = bootimage; }; - in rec { - packages.x86_64-linux = { - zc706-fsbl = zynqpkgs.zc706-fsbl; + packages.x86_64-linux = { + inherit mkbootimage u-boot; + zc706-fsbl = fsbl { board = "zc706"; }; } // (build { target = "zc706"; }); packages.armv7l-linux = let platforms = (import not-os.inputs.nixpkgs { config = {}; }).platforms; eval = (import "${not-os}" { extraModules = [ - ./zynq_image.nix + "${not-os}/zynq_image.nix" ]; platform = system: platforms.armv7l-hf-multiplatform; system = "x86_64-linux";