diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0726648 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +.idea +*.log +tmp/ + + +source/ +result/ diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..b73e6ee --- /dev/null +++ b/default.nix @@ -0,0 +1,21 @@ +{ pkgs ? import {}, + kernel ? (import {}).linuxPackages_latest }: +#pkgs.libsForQt5.callPackage ./qtpdwidgets.nix {} +#pkgs.libsForQt5.callPackage ./testmanager.nix {} +#pkgs.libsForQt5.callPackage ./dls.nix {} +#pkgs.callPackage ./pdcom.nix {} +#pkgs.callPackage ./etherlab.nix {} +let + packages = rec { + ethercat = pkgs.callPackage ./ethercat.nix { + kernel = pkgs.linux_latest; + }; + testmanager = pkgs.libsForQt5.callPackage ./testmanager.nix {}; + dls = pkgs.libsForQt5.callPackage ./dls.nix {}; + etherlab = pkgs.libsForQt5.callPackage ./etherlab.nix {}; + qtpdwidgets = pkgs.libsForQt5.callPackage ./qtpdwidgets.nix {}; + pdcom = pkgs.callPackage ./pdcom.nix {}; + pdserv = pkgs.callPackage ./pdserv.nix {}; + }; +in +packages diff --git a/dls.nix b/dls.nix new file mode 100644 index 0000000..35296d8 --- /dev/null +++ b/dls.nix @@ -0,0 +1,66 @@ +{ + pkgs, + lib, + qtbase, + qttools, + wrapQtAppsHook, + stdenv, + pdcom ? pkgs.callPackage ./pdcom.nix {}, +}: + +with pkgs; +let + version="1.5.0"; + #rev = "aa943dbb6919b83cf90028fda1acbecc554177c5"; #1.4.0 + rev = "bc458cc89e667d8dd03c9fdaf9d87cac7754b6a5"; #1.5.0 +in +stdenv.mkDerivation { + name = "dls"; + inherit version; + + src = fetchGit { + url = "https://gitlab.com/etherlab.org/dls.git"; + ref = "refs/tags/${version}"; + inherit rev; + #sha256 = "05w6k4925lwjlm0n3xp4k83ymcxrc6qzz825rv7yrh4pdgzdvwxi"; + }; + enableParallelBuilding = true; + + #nativeBuildInputs = [ wrapQtAppsHook bash pkg-config autoreconfHook ]; + nativeBuildInputs = [ wrapQtAppsHook bash pkg-config cmake ]; + buildInputs = [ qtbase qttools libxml2 fftw pcre zlib protobuf uriparser hdf5-cpp fltk pdcom ]; + #buildInputs = [ libxcrypt expat gnutls cyrus_sasl log4cplus db libyaml ]; + # + cmakeFlags = [ "-DREVISION=${rev}" ]; + #configureFlags = [ + # "--with-fltk-dir=${fltk}" + # "--with-fftw3-dir=${fftw.dev}" + # "--with-zlib-dir=${zlib.dev}" + #]; + + #makeFlags = [ "REVISION=${rev}" ]; + + #preAutoreconf = '' + # bash bootstrap.sh + #''; + #preConfigure = '' + # echo ${rev} > revision + + ## #bash bootstrap.sh + ## set -e + ## set -x + + ## touch ChangeLog + ## mkdir -p autoconf + #''; + + #preConfigure = '' + # qmake + # #PREFIX=$out qmake + #''; + + meta = with lib; { + description = "Acquisition, compression, storage, visualization and export of long-time data via graphical user interfaces."; + platforms = platforms.linux; + }; +} diff --git a/ethercat.nix b/ethercat.nix new file mode 100644 index 0000000..0df96e7 --- /dev/null +++ b/ethercat.nix @@ -0,0 +1,105 @@ +{ + pkgs, + lib, + stdenv, + # interface name (eg. "eth0") or MAC address (eg. "e9:22:a4:62:74:23"). ff:ff:ff:ff:ff:ff means first available NIC + master_device0 ? "ff:ff:ff:ff:ff:ff", + kernel +}: + +# Based on: https://aur.archlinux.org/packages/etherlab-ethercat + +with pkgs; +let + version="1.5"; + device_modules="generic"; +in +stdenv.mkDerivation { + name = "ethercat-master-module-${kernel.modDirVersion}"; + inherit version; + inherit master_device0; + + src = fetchGit { + url = "https://gitlab.com/etherlab.org/ethercat.git"; + ref = "stable-${version}"; + rev = "c8a512ac077f2ab51bb072bfbef1a687f9f1c090"; + #ref = "refs/tags/1.9"; + #sha256 = lib.fakeSha256; + }; + enableParallelBuilding = true; + + buildInputs = [ git pkg-config bash autoreconfHook kernel.moduleBuildDependencies kmod iproute2 ]; + + patches = [ ]; + + hardeningDisable = [ "pic" "format" ]; + + setSourceRoot = '' + export sourceRoot=$(pwd)/source + ''; + + postUnpack = '' + cd $sourceRoot + echo 'KERNEL=="EtherCAT[0-9]*", GROUP="ethercat", MODE="0660"' > 99-EtherCAT.rules + ''; + + preConfigure = '' + bash bootstrap + ''; + + configureFlags = [ + "--prefix=${placeholder "out"}/" + "--sysconfdir=${placeholder "out"}/etc" + "--sbindir=${placeholder "out"}/bin" + "--libdir=${placeholder "out"}/lib" + "--enable-kernel" + "--enable-generic" + "--disable-8139too" + "--enable-tool" + "--enable-userlib" + "--with-linux-dir=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build" + ]; + #++ lib.optionals (!guiSupport) [ "--disable-gui" "--enable-systemd" ] # TODO add flags for nongeneric NICs like this + + makeFlags = [ "all" "modules" ]; + + # Make systemd service unit + postBuild = '' + cd script + make all ethercat.service + cd .. + ''; + + checkPhase = '' + make check + ''; + + installFlags = [ "INSTALL_MOD_PATH=${placeholder "out"}" ]; + installTargets = [ "install" "modules_install" ]; + + postInstall = '' + mkdir -p $out/lib/udev/rules.d/ + cp 99-EtherCAT.rules $out/lib/udev/rules.d/ + + mkdir -p $out/lib/systemd/system + mkdir -p $out/etc/systemd/system + cp script/ethercat.service $out/etc/systemd/system/ + substituteInPlace $out/etc/systemd/system/ethercat.service --replace '#Requires' 'Requires' + substituteInPlace $out/etc/systemd/system/ethercat.service --replace '#After' 'After' + cp $out/etc/systemd/system/ethercat.service $out/lib/systemd/system/ethercat.service + + substituteInPlace $out/etc/ethercat.conf --replace 'MASTER0_DEVICE=""' 'MASTER0_DEVICE="${master_device0}"' + substituteInPlace $out/etc/ethercat.conf --replace 'DEVICE_MODULES=""' 'DEVICE_MODULES="${device_modules}"' + + substituteInPlace $out/bin/ethercatctl --replace 'LSMOD=/sbin/lsmod' 'LSMOD=lsmod' + substituteInPlace $out/bin/ethercatctl --replace 'MODPROBE=/sbin/modprobe' 'MODPROBE=modprobe' + substituteInPlace $out/bin/ethercatctl --replace 'RMMOD=/sbin/rmmod' 'RMMOD=rmmod' + substituteInPlace $out/bin/ethercatctl --replace 'MODINFO=/sbin/modinfo' 'MODINFO=modinfo' + substituteInPlace $out/bin/ethercatctl --replace 'IP=/bin/ip' 'IP=ip' + ''; + + meta = with lib; { + description = "Kernel modules and tools for IgH EtherCAT(R) Master component"; + platforms = platforms.linux; + }; +} diff --git a/etherlab.nix b/etherlab.nix new file mode 100644 index 0000000..94e1c17 --- /dev/null +++ b/etherlab.nix @@ -0,0 +1,31 @@ +{ + pkgs, + lib, + stdenv, + pdserv ? pkgs.callPackage ./pdserv.nix {}, +}: + +with pkgs; +let + version="2.3.4"; + rev = "aa5d574b096db1ea91479e4fb3c1aa63abedf4d0"; +in +stdenv.mkDerivation { + name = "etherlab"; + inherit version; + + src = fetchGit { + url = "https://gitlab.com/etherlab.org/etherlab.git"; + ref = "refs/tags/${version}"; + inherit rev; + }; + enableParallelBuilding = true; + + nativeBuildInputs = [ bash cmake pkg-config ]; + buildInputs = [ pdserv ]; + + meta = with lib; { + description = "Generation of realtime applications via a C-Interface or via MATLAB/Simulink with Real-Time Workshop."; + platforms = platforms.linux; + }; +} diff --git a/pdcom.nix b/pdcom.nix new file mode 100644 index 0000000..1bef7da --- /dev/null +++ b/pdcom.nix @@ -0,0 +1,77 @@ +{ + pkgs, + lib, + stdenv +}: + +with pkgs; +let + version="stable-3.0"; + #version="5.1.0"; + #version="stable-5.0"; + #version="master"; +in +stdenv.mkDerivation { + name = "pdcom"; + inherit version; + + src = fetchGit { + url = "https://gitlab.com/etherlab.org/pdcom.git"; + ref = "${version}"; + rev = "66bb0428137c0d795bddd0312875df9388c7e9b6"; #stable-3.0 + #rev = "b9e4ca1d61d34474b7d50f7806f26aaf4cfe5100"; #5.1.0 + #rev = "0e96e5d4bc2ad038ef6583d771f60fb0c2c563b1"; #stable-5.0 + #rev = "89a79c902b536f9913ef4a4a9a868f5c42105368"; #master + #ref = "refs/tags/${version}"; + #rev = "b9e4ca1d61d34474b7d50f7806f26aaf4cfe5100"; + #ref = "refs/tags/1.9"; + #sha256 = lib.fakeSha256; + }; + enableParallelBuilding = true; + + nativeBuildInputs = [ bash autoreconfHook pkg-config ]; + #buildInputs = [ glibc glibc.static expat gnutls cyrus_sasl ]; + buildInputs = [ libxcrypt expat gnutls cyrus_sasl ]; + + #configurePhase = '' + # ./configure + #''; + + #patches = [ ]; + + #setSourceRoot = '' + # export sourceRoot=$(pwd)/source + #''; + + #postUnpack = '' + # cd $sourceRoot + #''; + + #preBuild = "set -x"; + + #preConfigure = '' + # mkdir build + # cd build + #''; + + #cmakeFlags = [ "-DBUILD_TESTING=OFF" "-DCMAKE_BUILD_TYPE=Release" ]; + #cmakeFlags = [ "-DCMAKE_POSITION_INDEPENDENT_CODE=ON" ]; + + #configurePhase = '' + # cmake -DBUILD_TESTING=OFF -DCMAKE_BUILD_TYPE=Release .. + #''; + + #makeFlags = [ "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}" ]; + + #installTargets = [ "install" ]; + + #postInstall = '' + # ln -s $out/include/pdcom5 $out/include/pdcom + # ln -s $out/include/pdcom5.h $out/include/pdcom.h + #''; + + meta = with lib; { + description = "Flexible C++ library for platform- and protocol-independent process data exchange."; + platforms = platforms.linux; + }; +} diff --git a/pdserv.nix b/pdserv.nix new file mode 100644 index 0000000..6eba80c --- /dev/null +++ b/pdserv.nix @@ -0,0 +1,33 @@ +{ + pkgs, + lib, + stdenv +}: + +with pkgs; +let + version="master"; +in +stdenv.mkDerivation { + name = "pdserv"; + inherit version; + + src = fetchGit { + url = "https://gitlab.com/etherlab.org/pdserv.git"; + ref = "${version}"; + rev = "8642c3fe7456d85f5147fdee39fe9918945d175c"; #master + }; + enableParallelBuilding = true; + + #nativeBuildInputs = [ bash cmake autoreconfHook ]; + nativeBuildInputs = [ bash cmake pkg-config ]; + buildInputs = [ libxcrypt expat gnutls cyrus_sasl log4cplus db libyaml ]; + + #cmakeFlags = [ "-DENABLE_DOC=0" ]; + + + meta = with lib; { + description = "Server library (C/C++) for process-data of user-space realtime applications."; + platforms = platforms.linux; + }; +} diff --git a/qtpdcom.nix b/qtpdcom.nix new file mode 100644 index 0000000..1c03b64 --- /dev/null +++ b/qtpdcom.nix @@ -0,0 +1,33 @@ +{ + stdenv, + lib, + pkgs, + qtbase, + qttools, + wrapQtAppsHook, + pdcom ? pkgs.callPackage ./pdcom.nix {}, +}: + +with pkgs; +let + version="main"; +in +stdenv.mkDerivation { + name = "qtpdcom"; + inherit version; + + src = fetchGit { + url = "https://gitlab.com/etherlab.org/qtpdcom.git"; + ref = "${version}"; + rev = "da7b15d764220371050674ce4618562e0d87beaf"; #main + }; + enableParallelBuilding = true; + + buildInputs = [ qtbase qttools pdcom ]; + nativeBuildInputs = [ cmake wrapQtAppsHook ]; + + meta = with lib; { + description = ""; + platforms = platforms.linux; + }; +} diff --git a/qtpdwidgets.nix b/qtpdwidgets.nix new file mode 100644 index 0000000..e764f1a --- /dev/null +++ b/qtpdwidgets.nix @@ -0,0 +1,49 @@ +{ + stdenv, + lib, + pkgs, + qtbase, + qttools, + wrapQtAppsHook, + pdcom ? pkgs.callPackage ./pdcom.nix {}, + #qtpdcom ? pkgs.libsForQt5.callPackage ./qtpdcom.nix {}, +}: + +with pkgs; +let + version="stable-1.3"; +in +stdenv.mkDerivation { + name = "qtpdwidgets"; + inherit version; + + src = fetchGit { + url = "https://gitlab.com/etherlab.org/qtpdwidgets.git"; + ref = "${version}"; + rev = "1f963f3acb6b250eb7447829d5c40bde1e6dd8d1"; #stable-1.3 + }; + enableParallelBuilding = true; + + buildInputs = [ qtbase qttools pdcom ]; + nativeBuildInputs = [ wrapQtAppsHook ]; + + preConfigure = '' + #qmake + PREFIX=$out qmake + substituteInPlace Makefile.Release --replace 'DESTDIR =' 'DESTDIR =${placeholder "out"}' + + ''; + + installFlags = [ "INSTALL_ROOT=${placeholder "out"}" ]; + + postInstall = '' + #ln -s $out/include/QtPdWidgets2 $out/include/QtPdWidgets + mv $out/usr/local/* $out/ + rm -r $out/usr + ''; + + meta = with lib; { + description = "Process-data aware widget library for Qt, that uses PdCom for process variable access."; + platforms = platforms.linux; + }; +} diff --git a/testmanager.nix b/testmanager.nix new file mode 100644 index 0000000..d0c9374 --- /dev/null +++ b/testmanager.nix @@ -0,0 +1,48 @@ +{ + stdenv, + lib, + pkgs, + qtbase, + qttools, + wrapQtAppsHook, + pdcom ? pkgs.callPackage ./pdcom.nix {}, + qtpdwidgets ? pkgs.libsForQt5.callPackage ./qtpdwidgets.nix {}, +}: + +with pkgs; +let + version="master"; + rev = "ea10d2b5b872ea2269bf08169d18d52212f8a0af"; #master +in +stdenv.mkDerivation { + name = "testmanager"; + inherit version; + + src = fetchGit { + url = "https://gitlab.com/etherlab.org/testmanager.git"; + ref = "${version}"; + inherit rev; + }; + enableParallelBuilding = true; + + buildInputs = [ qtbase qttools python3 pdcom qtpdwidgets ]; + nativeBuildInputs = [ wrapQtAppsHook ]; + + installFlags = [ "INSTALL_ROOT=${placeholder "out"}" ]; + + preConfigure = '' + #set -x + echo ${rev} > revision + VERSION=${version} qmake + ''; + + postInstall = '' + mv $out/usr/local/* $out/ + rm -r $out/usr + ''; + + meta = with lib; { + description = "Dynamic operation and visualization software. Connects to a realtime application via TCP/IP"; + platforms = platforms.linux; + }; +}