Fil-C on Nix

Filnix wiki

mbrock/filnix

tests/qt5.nix

Build small Qt 5 programs with the Fil-C qmake and run them on the offscreen platform and on X11 (a native Xvfb).

λsource?, withQuick?
sourcedefault ../.

Also build and run the SVG, QML and Qt Quick program.

withQuickdefault true
let
9pkgs=
builtins.getFlaketoStringsource.legacyPackages.x86_64-linux.pkgsFilc
used by qt5

Unspliced: in nativeBuildInputs a spliced qtbase.dev would become the build platform's qtbase.

13qt5=
pkgs.pkgsHostTarget.qt5
uses pkgs
14inherit qt5.qtbase
qtPluginPrefix qtQmlPrefix
in
pkgs.stdenv.mkDerivation
17pname=
"qt5-smoke-check"
18version=
"1"
19dontUnpack=
true
20dontWrapQtApps=
true

qtbase.dev carries qmake and moc (build-machine programs) and the Fil-C mkspecs.

23nativeBuildInputs=
qt5.qtbase.dev pkgs.pkgsBuildBuild.xvfb-run
27buildInputs=
qt5.qtbase ++ pkgs.lib.optionalswithQuick qt5.qtsvg qt5.qtdeclarative qt5.qtquickcontrols2
35configurePhase=
runHook preConfigure
cp ${./qt5-smoke.cpp} qt5-smoke.cpp
cp ${./qt5-quick.cpp} qt5-quick.cpp
cp ${./qt5-contracts.cpp} qt5-contracts.cpp
cp ${./qt5-contract-plugin.cpp} qt5-contract-plugin.cpp
cat > smoke.pro <<'EOF'
QT += widgets network sql xml concurrent testlib
CONFIG += console
SOURCES = qt5-smoke.cpp
TARGET = qt5-smoke
EOF
cat > quick.pro <<'EOF'
QT += svg qml quick
CONFIG += console
SOURCES = qt5-quick.cpp
TARGET = qt5-quick
EOF
cat > contracts.pro <<'EOF'
QT = core ${pkgs.lib.optionalStringwithQuick "qml qml-private"}
CONFIG += console c++17
DEFINES += ${pkgs.lib.optionalStringwithQuick "WITH_QML"}
SOURCES = qt5-contracts.cpp
TARGET = qt5-contracts
EOF
cat > plugin.pro <<'EOF'
QT = core
TEMPLATE = lib
CONFIG += plugin
SOURCES = qt5-contract-plugin.cpp
TARGET = qt5-contract-plugin
EOF
export QMAKEPATH=${pkgs.lib.concatMapStringsSep":" m: "${m.dev}" pkgs.lib.optionalswithQuick qt5.qtsvg qt5.qtdeclarative}
mkdir smoke quick contracts plugin
(cd smoke && qmake ../smoke.pro)
(cd contracts && qmake ../contracts.pro)
(cd plugin && qmake ../plugin.pro)
${pkgs.lib.optionalStringwithQuick "(cd quick && qmake ../quick.pro)"}
runHook postConfigure
82buildPhase=
make -C smoke -j$NIX_BUILD_CORES
make -C contracts -j$NIX_BUILD_CORES
make -C plugin -j$NIX_BUILD_CORES
${pkgs.lib.optionalStringwithQuick "make -C quick -j$NIX_BUILD_CORES"}
88doCheck=
true
89checkPhase=
export QT_PLUGIN_PATH=${qt5.qtbase.bin}/${qtPluginPrefix}
+
pkgs.lib.optionalStringwithQuick
QT_PLUGIN_PATH+=:${qt5.qtsvg.bin}/${qtPluginPrefix}:${qt5.qtdeclarative.bin}/${qtPluginPrefix}
export QML2_IMPORT_PATH=${qt5.qtdeclarative.bin}/${qtQmlPrefix}:${qt5.qtquickcontrols2.bin}/${qtQmlPrefix}
+
export QT_QUICK_BACKEND=software
export FONTCONFIG_FILE=${pkgs.makeFontsConffontDirectories = pkgs.pkgsBuildBuild.dejavu_fonts;}
export HOME=$TMPDIR
${pkgs.pkgsBuildBuild.binutils}/bin/readelf -SW plugin/libqt5-contract-plugin.so > plugin-sections.txt
if grep -q '\.qtmetadata' plugin-sections.txt; then
echo 'The metadata test requires a sectionless Fil-C plugin' >&2
exit 1
fi
./contracts/qt5-contracts "$PWD/plugin/libqt5-contract-plugin.so"
for platform in offscreen xcb; do
for program in smoke/qt5-smoke ${pkgs.lib.optionalStringwithQuick "quick/qt5-quick"}; do
echo "== $program on $platform"
if [ $platform = xcb ]; then
QT_QPA_PLATFORM=xcb xvfb-run -a -s "-screen 0 640x480x24" ./$program
else
QT_QPA_PLATFORM=$platform ./$program
fi
done
done
119installPhase=
mkdir -p $out/bin
cp smoke/qt5-smoke contracts/qt5-contracts plugin/libqt5-contract-plugin.so \
${pkgs.lib.optionalStringwithQuick "quick/qt5-quick"} $out/bin/