Files
etherlab-nix/ethercat.nix
2023-10-27 10:46:46 +03:00

112 lines
3.4 KiB
Nix

{
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",
enable-debug-if ? "no", # create debug interface for each master
enable-eoe ? "yes", # eoe enable
kernel
}:
# Based on: https://aur.archlinux.org/packages/etherlab-ethercat
with pkgs;
let
version="master-ba278192";
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 = "master";
rev = "ba2781922162eca6c10c7cc72a7b4e52e3359f26";
#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"
"--enable-tty"
"--enable-debug-if=${enable-debug-if}"
"--enable-eoe=${enable-eoe}"
"--enable-tty"
"--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=/sbin/ip' 'IP=ip'
'';
meta = with lib; {
description = "Kernel modules and tools for IgH EtherCAT(R) Master component";
platforms = platforms.linux;
};
}