2020-02-06 19:31:59 +01:00
|
|
|
|
# Updating? Keep $out/etc synchronized with passthru keys
|
2019-01-28 00:15:00 +01:00
|
|
|
|
|
2021-08-11 22:46:22 +02:00
|
|
|
|
{ stdenv
|
|
|
|
|
, lib
|
2020-10-27 07:29:44 +01:00
|
|
|
|
, fetchFromGitHub
|
2022-07-29 15:19:10 +02:00
|
|
|
|
, gi-docgen
|
2020-09-12 13:12:14 +02:00
|
|
|
|
, pkg-config
|
2019-08-28 15:05:09 +02:00
|
|
|
|
, gobject-introspection
|
2020-09-12 13:26:44 +02:00
|
|
|
|
, gettext
|
2019-08-28 15:05:09 +02:00
|
|
|
|
, libgudev
|
2023-11-03 16:47:56 +01:00
|
|
|
|
, libdrm
|
2019-08-28 15:05:09 +02:00
|
|
|
|
, polkit
|
|
|
|
|
, libxmlb
|
|
|
|
|
, gusb
|
|
|
|
|
, sqlite
|
|
|
|
|
, libarchive
|
2023-01-22 03:16:58 +01:00
|
|
|
|
, libredirect
|
2020-12-08 15:05:15 +01:00
|
|
|
|
, curl
|
2020-04-15 21:22:43 +02:00
|
|
|
|
, libjcat
|
2019-08-28 15:05:09 +02:00
|
|
|
|
, elfutils
|
|
|
|
|
, valgrind
|
|
|
|
|
, meson
|
|
|
|
|
, libuuid
|
|
|
|
|
, ninja
|
2021-02-01 21:21:41 +01:00
|
|
|
|
, gnutls
|
2021-08-11 22:46:22 +02:00
|
|
|
|
, protobufc
|
2019-08-28 15:05:09 +02:00
|
|
|
|
, python3
|
2022-08-09 15:13:57 +02:00
|
|
|
|
, wrapGAppsNoGuiHook
|
2023-01-22 03:16:58 +01:00
|
|
|
|
, ensureNewerSourcesForZipFilesHook
|
2019-08-28 15:05:09 +02:00
|
|
|
|
, json-glib
|
|
|
|
|
, bash-completion
|
|
|
|
|
, shared-mime-info
|
|
|
|
|
, umockdev
|
|
|
|
|
, vala
|
|
|
|
|
, makeFontsConf
|
|
|
|
|
, freefont_ttf
|
|
|
|
|
, pango
|
2019-11-18 18:44:54 +01:00
|
|
|
|
, tpm2-tss
|
2019-08-28 15:05:09 +02:00
|
|
|
|
, bubblewrap
|
|
|
|
|
, efibootmgr
|
|
|
|
|
, flashrom
|
|
|
|
|
, tpm2-tools
|
2021-08-11 22:46:22 +02:00
|
|
|
|
, fwupd-efi
|
2019-08-28 14:37:44 +02:00
|
|
|
|
, nixosTests
|
2020-06-16 10:41:57 +02:00
|
|
|
|
, runCommand
|
2021-08-11 22:46:22 +02:00
|
|
|
|
, unstableGitUpdater
|
2022-02-26 14:13:52 +01:00
|
|
|
|
, modemmanager
|
|
|
|
|
, libqmi
|
|
|
|
|
, libmbim
|
2022-04-29 17:49:42 +02:00
|
|
|
|
, libcbor
|
|
|
|
|
, xz
|
2023-01-27 15:43:52 +01:00
|
|
|
|
, enableFlashrom ? false
|
2023-09-04 13:57:45 +02:00
|
|
|
|
, enablePassim ? false
|
2019-08-28 15:05:09 +02:00
|
|
|
|
}:
|
|
|
|
|
|
2017-09-18 15:14:21 +02:00
|
|
|
|
let
|
2019-08-28 15:05:09 +02:00
|
|
|
|
python = python3.withPackages (p: with p; [
|
2023-05-22 01:20:07 +02:00
|
|
|
|
jinja2
|
2019-08-28 15:05:09 +02:00
|
|
|
|
pygobject3
|
2019-09-09 22:09:05 +02:00
|
|
|
|
setuptools
|
2019-08-28 15:05:09 +02:00
|
|
|
|
]);
|
|
|
|
|
|
2021-11-21 02:50:41 +01:00
|
|
|
|
isx86 = stdenv.hostPlatform.isx86;
|
2019-08-07 04:00:45 +02:00
|
|
|
|
|
|
|
|
|
# Dell isn't supported on Aarch64
|
|
|
|
|
haveDell = isx86;
|
|
|
|
|
|
|
|
|
|
# only redfish for x86_64
|
|
|
|
|
haveRedfish = stdenv.isx86_64;
|
|
|
|
|
|
2021-02-16 02:50:46 +01:00
|
|
|
|
# only use msr if x86 (requires cpuid)
|
|
|
|
|
haveMSR = isx86;
|
|
|
|
|
|
2019-08-28 14:37:44 +02:00
|
|
|
|
# # Currently broken on Aarch64
|
|
|
|
|
# haveFlashrom = isx86;
|
2019-11-18 18:44:54 +01:00
|
|
|
|
# Experimental
|
2023-01-27 15:43:52 +01:00
|
|
|
|
haveFlashrom = isx86 && enableFlashrom;
|
2019-08-07 04:00:45 +02:00
|
|
|
|
|
2023-02-26 16:39:35 +01:00
|
|
|
|
runPythonCommand =
|
|
|
|
|
name:
|
|
|
|
|
buildCommandPython:
|
|
|
|
|
|
|
|
|
|
runCommand
|
|
|
|
|
name
|
|
|
|
|
{
|
|
|
|
|
nativeBuildInputs = [ python3 ];
|
|
|
|
|
inherit buildCommandPython;
|
|
|
|
|
}
|
|
|
|
|
''
|
|
|
|
|
exec python3 -c "$buildCommandPython"
|
|
|
|
|
'';
|
2019-08-28 15:05:09 +02:00
|
|
|
|
|
2021-08-11 22:46:22 +02:00
|
|
|
|
test-firmware =
|
|
|
|
|
let
|
2023-01-22 03:16:58 +01:00
|
|
|
|
version = "unstable-2022-04-02";
|
2021-08-11 22:46:22 +02:00
|
|
|
|
src = fetchFromGitHub {
|
|
|
|
|
name = "fwupd-test-firmware-${version}";
|
|
|
|
|
owner = "fwupd";
|
|
|
|
|
repo = "fwupd-test-firmware";
|
2023-01-22 03:16:58 +01:00
|
|
|
|
rev = "39954e434d63e20e85870dd1074818f48a0c08b7";
|
|
|
|
|
hash = "sha256-d4qG3fKyxkfN91AplRYqARFz+aRr+R37BpE450bPxi0=";
|
2021-08-11 22:46:22 +02:00
|
|
|
|
passthru = {
|
|
|
|
|
inherit src version; # For update script
|
|
|
|
|
updateScript = unstableGitUpdater {
|
|
|
|
|
url = "${test-firmware.meta.homepage}.git";
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
in
|
2023-02-26 16:39:35 +01:00
|
|
|
|
src // {
|
|
|
|
|
meta = src.meta // {
|
|
|
|
|
# For update script
|
|
|
|
|
position =
|
|
|
|
|
let
|
|
|
|
|
pos = builtins.unsafeGetAttrPos "updateScript" test-firmware;
|
|
|
|
|
in
|
|
|
|
|
pos.file + ":" + toString pos.line;
|
2021-08-11 22:46:22 +02:00
|
|
|
|
};
|
2023-02-26 16:39:35 +01:00
|
|
|
|
};
|
2023-03-02 11:57:12 +01:00
|
|
|
|
in
|
|
|
|
|
stdenv.mkDerivation (finalAttrs: {
|
|
|
|
|
pname = "fwupd";
|
2024-03-12 11:45:12 +01:00
|
|
|
|
version = "1.9.15";
|
2023-03-02 11:57:12 +01:00
|
|
|
|
|
|
|
|
|
# libfwupd goes to lib
|
|
|
|
|
# daemon, plug-ins and libfwupdplugin go to out
|
|
|
|
|
# CLI programs go to out
|
|
|
|
|
outputs = [ "out" "lib" "dev" "devdoc" "man" "installedTests" ];
|
|
|
|
|
|
2023-02-26 16:39:54 +01:00
|
|
|
|
src = fetchFromGitHub {
|
|
|
|
|
owner = "fwupd";
|
|
|
|
|
repo = "fwupd";
|
|
|
|
|
rev = finalAttrs.version;
|
2024-03-12 11:45:12 +01:00
|
|
|
|
hash = "sha256-w0egw5FKNAOnIYjp2RUx74taivnClQmRfhaFHdKOGZc=";
|
2023-03-02 11:57:12 +01:00
|
|
|
|
};
|
2021-08-11 22:46:22 +02:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
patches = [
|
|
|
|
|
# Since /etc is the domain of NixOS, not Nix,
|
|
|
|
|
# we cannot install files there.
|
|
|
|
|
# Let’s install the files to $prefix/etc
|
|
|
|
|
# while still reading them from /etc.
|
|
|
|
|
# NixOS module for fwupd will take take care of copying the files appropriately.
|
|
|
|
|
./add-option-for-installation-sysconfdir.patch
|
|
|
|
|
|
|
|
|
|
# Install plug-ins and libfwupdplugin to $out output,
|
|
|
|
|
# they are not really part of the library.
|
|
|
|
|
./install-fwupdplugin-to-out.patch
|
|
|
|
|
|
|
|
|
|
# Installed tests are installed to different output
|
|
|
|
|
# we also cannot have fwupd-tests.conf in $out/etc since it would form a cycle.
|
|
|
|
|
./installed-tests-path.patch
|
|
|
|
|
|
|
|
|
|
# EFI capsule is located in fwupd-efi now.
|
|
|
|
|
./efi-app-path.patch
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
nativeBuildInputs = [
|
|
|
|
|
# required for firmware zipping
|
|
|
|
|
ensureNewerSourcesForZipFilesHook
|
|
|
|
|
meson
|
|
|
|
|
ninja
|
|
|
|
|
gi-docgen
|
|
|
|
|
pkg-config
|
|
|
|
|
gobject-introspection
|
|
|
|
|
gettext
|
|
|
|
|
shared-mime-info
|
|
|
|
|
valgrind
|
|
|
|
|
gnutls
|
|
|
|
|
protobufc # for protoc
|
|
|
|
|
python
|
|
|
|
|
wrapGAppsNoGuiHook
|
|
|
|
|
vala
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
buildInputs = [
|
|
|
|
|
polkit
|
|
|
|
|
libxmlb
|
|
|
|
|
gusb
|
|
|
|
|
sqlite
|
|
|
|
|
libarchive
|
2023-11-03 16:47:56 +01:00
|
|
|
|
libdrm
|
2023-03-02 11:57:12 +01:00
|
|
|
|
curl
|
|
|
|
|
elfutils
|
|
|
|
|
libgudev
|
|
|
|
|
libjcat
|
|
|
|
|
libuuid
|
|
|
|
|
json-glib
|
|
|
|
|
umockdev
|
|
|
|
|
bash-completion
|
|
|
|
|
pango
|
|
|
|
|
tpm2-tss
|
|
|
|
|
fwupd-efi
|
|
|
|
|
protobufc
|
|
|
|
|
modemmanager
|
|
|
|
|
libmbim
|
|
|
|
|
libcbor
|
|
|
|
|
libqmi
|
|
|
|
|
xz # for liblzma
|
|
|
|
|
] ++ lib.optionals haveFlashrom [
|
|
|
|
|
flashrom
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
mesonFlags = [
|
|
|
|
|
"-Ddocs=enabled"
|
|
|
|
|
# We are building the official releases.
|
|
|
|
|
"-Dsupported_build=enabled"
|
2023-10-06 14:52:59 +02:00
|
|
|
|
"-Dlaunchd=disabled"
|
2023-03-02 11:57:12 +01:00
|
|
|
|
"-Dudevdir=lib/udev"
|
|
|
|
|
"-Dsystemd_root_prefix=${placeholder "out"}"
|
|
|
|
|
"-Dinstalled_test_prefix=${placeholder "installedTests"}"
|
|
|
|
|
"--localstatedir=/var"
|
|
|
|
|
"--sysconfdir=/etc"
|
|
|
|
|
"-Dsysconfdir_install=${placeholder "out"}/etc"
|
|
|
|
|
"-Defi_os_dir=nixos"
|
|
|
|
|
"-Dplugin_modem_manager=enabled"
|
2024-02-09 12:38:29 +01:00
|
|
|
|
"-Dvendor_metadata=true"
|
2023-03-02 11:57:12 +01:00
|
|
|
|
# We do not want to place the daemon into lib (cyclic reference)
|
|
|
|
|
"--libexecdir=${placeholder "out"}/libexec"
|
2023-09-04 13:57:45 +02:00
|
|
|
|
] ++ lib.optionals (!enablePassim) [
|
|
|
|
|
"-Dpassim=disabled"
|
2023-03-02 11:57:12 +01:00
|
|
|
|
] ++ lib.optionals (!haveDell) [
|
|
|
|
|
"-Dplugin_synaptics_mst=disabled"
|
|
|
|
|
] ++ lib.optionals (!haveRedfish) [
|
|
|
|
|
"-Dplugin_redfish=disabled"
|
|
|
|
|
] ++ lib.optionals (!haveFlashrom) [
|
|
|
|
|
"-Dplugin_flashrom=disabled"
|
|
|
|
|
] ++ lib.optionals (!haveMSR) [
|
|
|
|
|
"-Dplugin_msr=disabled"
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
# TODO: wrapGAppsHook wraps efi capsule even though it is not ELF
|
|
|
|
|
dontWrapGApps = true;
|
|
|
|
|
|
|
|
|
|
doCheck = true;
|
|
|
|
|
|
|
|
|
|
# Environment variables
|
|
|
|
|
|
|
|
|
|
# Fontconfig error: Cannot load default config file
|
|
|
|
|
FONTCONFIG_FILE =
|
|
|
|
|
let
|
|
|
|
|
fontsConf = makeFontsConf {
|
|
|
|
|
fontDirectories = [ freefont_ttf ];
|
|
|
|
|
};
|
2023-02-26 16:39:35 +01:00
|
|
|
|
in
|
|
|
|
|
fontsConf;
|
2021-08-11 22:46:22 +02:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
# error: “PolicyKit files are missing”
|
|
|
|
|
# https://github.com/NixOS/nixpkgs/pull/67625#issuecomment-525788428
|
|
|
|
|
PKG_CONFIG_POLKIT_GOBJECT_1_ACTIONDIR = "/run/current-system/sw/share/polkit-1/actions";
|
2019-01-28 00:15:00 +01:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
# Phase hooks
|
2020-09-12 13:12:14 +02:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
postPatch = ''
|
|
|
|
|
patchShebangs \
|
|
|
|
|
contrib/generate-version-script.py \
|
2023-05-22 01:20:07 +02:00
|
|
|
|
contrib/generate-man.py \
|
2023-03-02 11:57:12 +01:00
|
|
|
|
po/test-deps
|
2017-09-18 15:14:21 +02:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
# tests fail with: Failed to load SMBIOS: neither SMBIOS or DT found
|
|
|
|
|
sed -i 's/test(.*)//' plugins/lenovo-thinklmi/meson.build
|
|
|
|
|
sed -i 's/test(.*)//' plugins/mtd/meson.build
|
|
|
|
|
# fails on amd cpu
|
|
|
|
|
sed -i 's/test(.*)//' libfwupdplugin/meson.build
|
|
|
|
|
# in nixos test tries to chmod 0777 $out/share/installed-tests/fwupd/tests/redfish.conf
|
|
|
|
|
sed -i "s/get_option('tests')/false/" plugins/redfish/meson.build
|
2023-02-26 16:39:54 +01:00
|
|
|
|
|
|
|
|
|
# Device tests use device emulation and need to download emulation data from
|
|
|
|
|
# the internet, which does not work on our test VMs.
|
|
|
|
|
# It's probably better to disable these tests for NixOS by setting
|
|
|
|
|
# the device-tests directory to /dev/null.
|
|
|
|
|
# For more info on device emulation, see:
|
|
|
|
|
# https://github.com/fwupd/fwupd/blob/eeeac4e9ba8a6513428b456a551bffd95d533e50/docs/device-emulation.md
|
|
|
|
|
substituteInPlace data/installed-tests/meson.build \
|
|
|
|
|
--replace "join_paths(datadir, 'fwupd', 'device-tests')" "'/dev/null'"
|
2023-03-02 11:57:12 +01:00
|
|
|
|
'';
|
2020-09-12 13:12:14 +02:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
preBuild = ''
|
|
|
|
|
# jcat-tool at buildtime requires a home directory
|
|
|
|
|
export HOME="$(mktemp -d)"
|
|
|
|
|
'';
|
2021-08-11 22:46:22 +02:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
preCheck = ''
|
|
|
|
|
addToSearchPath XDG_DATA_DIRS "${shared-mime-info}/share"
|
2017-09-18 15:14:21 +02:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
echo "12345678901234567890123456789012" > machine-id
|
|
|
|
|
export NIX_REDIRECTS=/etc/machine-id=$(realpath machine-id) \
|
|
|
|
|
LD_PRELOAD=${libredirect}/lib/libredirect.so
|
|
|
|
|
'';
|
2018-02-10 05:23:17 +01:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
postInstall = ''
|
|
|
|
|
# These files have weird licenses so they are shipped separately.
|
|
|
|
|
cp --recursive --dereference "${test-firmware}/installed-tests/tests" "$installedTests/libexec/installed-tests/fwupd"
|
|
|
|
|
'';
|
2020-02-06 19:31:59 +01:00
|
|
|
|
|
2023-02-26 16:39:35 +01:00
|
|
|
|
preFixup =
|
|
|
|
|
let
|
|
|
|
|
binPath = [
|
|
|
|
|
efibootmgr
|
|
|
|
|
bubblewrap
|
|
|
|
|
tpm2-tools
|
|
|
|
|
];
|
|
|
|
|
in
|
|
|
|
|
''
|
|
|
|
|
gappsWrapperArgs+=(
|
|
|
|
|
--prefix XDG_DATA_DIRS : "${shared-mime-info}/share"
|
|
|
|
|
# See programs reached with fu_common_find_program_in_path in source
|
|
|
|
|
--prefix PATH : "${lib.makeBinPath binPath}"
|
|
|
|
|
)
|
|
|
|
|
'';
|
2020-09-12 13:12:14 +02:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
postFixup = ''
|
|
|
|
|
# Since we had to disable wrapGAppsHook, we need to wrap the executables manually.
|
|
|
|
|
find -L "$out/bin" "$out/libexec" -type f -executable -print0 \
|
|
|
|
|
| while IFS= read -r -d ''' file; do
|
|
|
|
|
if [[ "$file" != *.efi ]]; then
|
|
|
|
|
echo "Wrapping program $file"
|
|
|
|
|
wrapGApp "$file"
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back.
|
|
|
|
|
moveToOutput "share/doc" "$devdoc"
|
|
|
|
|
'';
|
2020-09-12 13:12:14 +02:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
separateDebugInfo = true;
|
|
|
|
|
|
|
|
|
|
passthru = {
|
|
|
|
|
filesInstalledToEtc = [
|
|
|
|
|
"fwupd/bios-settings.d/README.md"
|
2023-05-22 01:20:07 +02:00
|
|
|
|
"fwupd/fwupd.conf"
|
2023-03-02 11:57:12 +01:00
|
|
|
|
"fwupd/remotes.d/lvfs-testing.conf"
|
|
|
|
|
"fwupd/remotes.d/lvfs.conf"
|
|
|
|
|
"fwupd/remotes.d/vendor.conf"
|
|
|
|
|
"fwupd/remotes.d/vendor-directory.conf"
|
|
|
|
|
"pki/fwupd/GPG-KEY-Linux-Foundation-Firmware"
|
|
|
|
|
"pki/fwupd/GPG-KEY-Linux-Vendor-Firmware-Service"
|
|
|
|
|
"pki/fwupd/LVFS-CA.pem"
|
|
|
|
|
"pki/fwupd-metadata/GPG-KEY-Linux-Foundation-Metadata"
|
|
|
|
|
"pki/fwupd-metadata/GPG-KEY-Linux-Vendor-Firmware-Service"
|
|
|
|
|
"pki/fwupd-metadata/LVFS-CA.pem"
|
|
|
|
|
"grub.d/35_fwupd"
|
|
|
|
|
];
|
2020-09-12 13:12:14 +02:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
# For updating.
|
|
|
|
|
inherit test-firmware;
|
|
|
|
|
|
2023-03-14 11:47:32 +01:00
|
|
|
|
# For downstream consumers that need the fwupd-efi this was built with.
|
|
|
|
|
inherit fwupd-efi;
|
|
|
|
|
|
2023-02-26 16:39:35 +01:00
|
|
|
|
tests =
|
|
|
|
|
let
|
|
|
|
|
listToPy = list: "[${lib.concatMapStringsSep ", " (f: "'${f}'") list}]";
|
|
|
|
|
in
|
|
|
|
|
{
|
|
|
|
|
installedTests = nixosTests.installed-tests.fwupd;
|
|
|
|
|
|
|
|
|
|
passthruMatches = runPythonCommand "fwupd-test-passthru-matches" ''
|
|
|
|
|
import itertools
|
|
|
|
|
import configparser
|
|
|
|
|
import os
|
|
|
|
|
import pathlib
|
|
|
|
|
|
|
|
|
|
etc = '${finalAttrs.finalPackage}/etc'
|
|
|
|
|
package_etc = set(itertools.chain.from_iterable([[os.path.relpath(os.path.join(prefix, file), etc) for file in files] for (prefix, dirs, files) in os.walk(etc)]))
|
|
|
|
|
passthru_etc = set(${listToPy finalAttrs.passthru.filesInstalledToEtc})
|
|
|
|
|
assert len(package_etc - passthru_etc) == 0, f'fwupd package contains the following paths in /etc that are not listed in passthru.filesInstalledToEtc: {package_etc - passthru_etc}'
|
|
|
|
|
assert len(passthru_etc - package_etc) == 0, f'fwupd package lists the following paths in passthru.filesInstalledToEtc that are not contained in /etc: {passthru_etc - package_etc}'
|
|
|
|
|
|
|
|
|
|
pathlib.Path(os.getenv('out')).touch()
|
|
|
|
|
'';
|
|
|
|
|
};
|
2017-09-18 15:14:21 +02:00
|
|
|
|
};
|
2020-06-16 10:41:57 +02:00
|
|
|
|
|
2023-03-02 11:57:12 +01:00
|
|
|
|
meta = with lib; {
|
|
|
|
|
homepage = "https://fwupd.org/";
|
2023-08-22 16:00:21 +02:00
|
|
|
|
maintainers = with maintainers; [ rvdp ];
|
2023-03-02 11:57:12 +01:00
|
|
|
|
license = licenses.lgpl21Plus;
|
|
|
|
|
platforms = platforms.linux;
|
|
|
|
|
};
|
|
|
|
|
})
|