3d36ea6a05
This is to help QT find all the necessary plugin libraries at startup time, otherwise it freaks out when run out of 'nix-env' environment or run directly, e.g. `./result/bin/nextpnr-ice40 --gui`. The reason for this is that none of the traditional paths it looks for are available. The workarounds for this are to otherwise: - Install e.g. into environment.systemPackages (presumably it will then pick up QT libraries in /run/current-system/sw/lib/qt-*) - Install 'qtbase' into your user environment (qt will also try to load dependent libraries out of ~/.nix-profile/lib/qt-*) However, this QT_PLUGIN_PATH wrapping hack is used elsewhere in the tree, presumably to mitigate these (poor) workarounds, especially for non-NixOS users. There seems to be no downside to this. With this, I have been able to run NextPNR's GUI on an Ubuntu 16.04 system using the 'nixGL' hack by simply running the resulting binary from anywhere (though there seems to be some glitching artifacts in the floorplan UI, I suspect this is due to a buggy OpenGL stack rather than any direct problem with NextPNR or the QT libraries themselves). This does not mark the GUI build as non-broken yet, though. That will happen in the future after a bit more testing and splitting nextpnr into separate minimal/GUI attributes. Signed-off-by: Austin Seipp <aseipp@pobox.com>
75 lines
2.3 KiB
Nix
75 lines
2.3 KiB
Nix
{ stdenv, fetchFromGitHub, cmake, makeWrapper
|
|
, boost, python3
|
|
, icestorm, trellis
|
|
|
|
# TODO(thoughtpolice) Currently the GUI build seems broken at runtime on my
|
|
# laptop (and over a remote X server on my server...), so mark it broken for
|
|
# now, with intent to fix later.
|
|
, enableGui ? false
|
|
, qtbase
|
|
}:
|
|
|
|
let
|
|
boostPython = boost.override { python = python3; enablePython = true; };
|
|
|
|
# This is a massive hack. For now, Trellis doesn't really support
|
|
# installation through an already-built package; you have to build it once to
|
|
# get the tools, then reuse the build directory to build nextpnr -- the
|
|
# 'install' phase doesn't install everything it needs. This will be fixed in
|
|
# the future but for now we can do this horrific thing.
|
|
trellisRoot = trellis.overrideAttrs (_: {
|
|
installPhase = ''
|
|
mkdir -p $out
|
|
cp *.so ..
|
|
cd ../../.. && cp -R trellis database $out/
|
|
'';
|
|
});
|
|
in
|
|
stdenv.mkDerivation rec {
|
|
name = "nextpnr-${version}";
|
|
version = "2019.01.08";
|
|
|
|
src = fetchFromGitHub {
|
|
owner = "yosyshq";
|
|
repo = "nextpnr";
|
|
rev = "c1d15c749c2aa105ee7b38ebe1b60a27e3743e8c";
|
|
sha256 = "082ac03s6164s7dwz1l9phshl8m1lizn45jykabrhks5jcccchbh";
|
|
};
|
|
|
|
nativeBuildInputs = [ cmake makeWrapper ];
|
|
buildInputs
|
|
= [ boostPython python3 ]
|
|
++ (stdenv.lib.optional enableGui qtbase);
|
|
|
|
enableParallelBuilding = true;
|
|
cmakeFlags =
|
|
[ "-DARCH=generic;ice40;ecp5"
|
|
"-DICEBOX_ROOT=${icestorm}/share/icebox"
|
|
"-DTRELLIS_ROOT=${trellisRoot}/trellis"
|
|
] ++ (stdenv.lib.optional (!enableGui) "-DBUILD_GUI=OFF");
|
|
|
|
# Fix the version number. This is a bit stupid (and fragile) in practice
|
|
# but works ok. We should probably make this overrideable upstream.
|
|
patchPhase = with builtins; ''
|
|
substituteInPlace ./CMakeLists.txt \
|
|
--replace 'git log -1 --format=%h' 'echo ${substring 0 11 src.rev}'
|
|
'';
|
|
|
|
postInstall = stdenv.lib.optionalString enableGui ''
|
|
for x in generic ice40 ecp5; do
|
|
wrapProgram $out/bin/nextpnr-$x \
|
|
--prefix QT_PLUGIN_PATH : ${qtbase}/lib/qt-${qtbase.qtCompatVersion}/plugins
|
|
done
|
|
'';
|
|
|
|
meta = with stdenv.lib; {
|
|
description = "Place and route tool for FPGAs";
|
|
homepage = https://github.com/yosyshq/nextpnr;
|
|
license = licenses.isc;
|
|
platforms = platforms.linux;
|
|
maintainers = with maintainers; [ thoughtpolice ];
|
|
|
|
broken = enableGui;
|
|
};
|
|
}
|