Commit 8dbbabec authored by Martijn Bastiaan's avatar Martijn Bastiaan
Browse files

ghdl-gcc: init at 4.1.0

Not truly a new package, but rather a new backend next to the existing
`mcode` and `llvm` ones. Adding the GCC backend too, as it is the only
one that supports code coverage report generation. For more info see:
https://devsaurus.github.io/ghdl_gcov/ghdl_gcov.html

.

Co-authored-by: default avatarRowan Goemans <goemansrowan@gmail.com>
parent 2e9b82a7
Loading
Loading
Loading
Loading
+57 −3
Original line number Diff line number Diff line
@@ -5,10 +5,18 @@
, zlib
, llvm
, lib
, gcc-unwrapped
, texinfo
, gmp
, mpfr
, libmpc
, gnutar
, glibc
, makeWrapper
, backend ? "mcode"
}:

assert backend == "mcode" || backend == "llvm";
assert backend == "mcode" || backend == "llvm" || backend == "gcc";

stdenv.mkDerivation (finalAttrs: {
  pname = "ghdl-${backend}";
@@ -25,20 +33,29 @@ stdenv.mkDerivation (finalAttrs: {

  nativeBuildInputs = [
    gnat
  ] ++ lib.optionals (backend == "gcc") [
    texinfo
    makeWrapper
  ];
  buildInputs = [
    zlib
  ] ++ lib.optionals (backend == "llvm") [
    llvm
  ] ++ lib.optionals (backend == "gcc") [
    gmp
    mpfr
    libmpc
  ];
  propagatedBuildInputs = [
  ] ++ lib.optionals (backend == "llvm") [
  ] ++ lib.optionals (backend == "llvm" || backend == "gcc") [
    zlib
  ];

  preConfigure = ''
    # If llvm 7.0 works, 7.x releases should work too.
    sed -i 's/check_version  7.0/check_version  7/g' configure
  '' + lib.optionalString (backend == "gcc") ''
    ${gnutar}/bin/tar -xf ${gcc-unwrapped.src}
  '';

  configureFlags = [
@@ -47,14 +64,51 @@ stdenv.mkDerivation (finalAttrs: {
    "--enable-synth"
  ] ++ lib.optionals (backend == "llvm") [
    "--with-llvm-config=${llvm.dev}/bin/llvm-config"
  ] ++ lib.optionals (backend == "gcc") [
    "--with-gcc=gcc-${gcc-unwrapped.version}"
  ];

  buildPhase = lib.optionalString (backend == "gcc") ''
    make copy-sources
    mkdir gcc-objs
    cd gcc-objs
    ../gcc-${gcc-unwrapped.version}/configure \
      --with-native-system-header-dir=/include \
      --with-build-sysroot=${lib.getDev glibc} \
      --prefix=$out \
      --enable-languages=c,vhdl \
      --disable-bootstrap \
      --disable-lto \
      --disable-multilib \
      --disable-libssp \
      --disable-libgomp \
      --disable-libquadmath
    make -j $NIX_BUILD_CORES
    make install
    cd ../
    make -j $NIX_BUILD_CORES ghdllib
  '';

  postFixup = lib.optionalString (backend == "gcc") ''
    wrapProgram $out/bin/ghdl \
      --set LIBRARY_PATH ${lib.makeLibraryPath [
        glibc
      ]}
  '';

  hardeningDisable = [
  ] ++ lib.optionals (backend == "gcc") [
    # GCC compilation fails with format errors
    "format"
  ];

  enableParallelBuilding = true;

  passthru = {
    # run with either of
    # run with:
    # nix-build -A ghdl-mcode.passthru.tests
    # nix-build -A ghdl-llvm.passthru.tests
    # nix-build -A ghdl-gcc.passthru.tests
    tests = {
      simple = callPackage ./test-simple.nix { inherit backend; };
    };
+3 −3
Original line number Diff line number Diff line
{ stdenv, ghdl-llvm, ghdl-mcode, backend }:
{ stdenv, lib, ghdl-llvm, ghdl-mcode, ghdl-gcc, backend }:

let
  ghdl = if backend == "llvm" then ghdl-llvm else ghdl-mcode;
  ghdl = if backend == "llvm" then ghdl-llvm else if backend == "gcc" then ghdl-gcc else ghdl-mcode;
in
stdenv.mkDerivation {
  name = "ghdl-test-simple";
@@ -13,7 +13,7 @@ stdenv.mkDerivation {
    mkdir -p ghdlwork
    ghdl -a --workdir=ghdlwork --ieee=synopsys simple.vhd simple-tb.vhd
    ghdl -e --workdir=ghdlwork --ieee=synopsys -o sim-simple tb
  '' + (if backend == "llvm" then ''
  '' + (if backend == "llvm" || backend == "gcc" then ''
    ./sim-simple --assert-level=warning > output.txt
  '' else ''
    ghdl -r --workdir=ghdlwork --ieee=synopsys tb > output.txt
+2 −0
Original line number Diff line number Diff line
@@ -15676,6 +15676,8 @@ with pkgs;
  ghdl-mcode = callPackage ../by-name/gh/ghdl/package.nix { backend = "mcode"; };
  ghdl-gcc = callPackage ../by-name/gh/ghdl/package.nix { backend = "gcc"; };
  ghdl-llvm = callPackage ../by-name/gh/ghdl/package.nix {
    backend = "llvm";
    inherit (llvmPackages_15) llvm;