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: Rowan Goemans <goemansrowan@gmail.com>
This commit is contained in:
Martijn Bastiaan 2024-06-21 19:22:16 +02:00
parent 2e9b82a7e6
commit 8dbbabec08
3 changed files with 62 additions and 6 deletions

View File

@ -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; };
};

View File

@ -1,7 +1,7 @@
{ 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

View File

@ -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;