У меня немного нет опыта работы с Nix и NixOS, и я немного борюсь с этой сборкой исходного кода ffmpeg. Любой совет приветствуется!
Соберите ffmpeg из исходного кода с помощью --extra-cflags = "-pipe -O3 -march=znver3 -ffat-lto-objects"
, в идеале — с помощью Flake, Overlay или чего-то подобного, чтобы я мог собрать существующий пакет ffmpeg nix и, возможно, даже воспроизвести сборки.
Я пытался следовать разным советам, которые видел в Интернете, но, глядя на ffmpeg в nixpkgs , я не уверен, что можно исправить или переопределить. Поскольку configureFlags происходит внутри блока stdenv.mkderivation
, когда я пытаюсь его переопределить, кажется, что у него нет области действия в этой переменной (и поскольку деривация явно устанавливает onfigurePlatforms = [];
, я не уверен, что это заблокирует изменения переопределения если только я не попытался переопределить весь длинный вывод).
Глядя на скрипт настройки ffmpeg, казалось, что переменные среды cflags/cxxflags не будут учитываться, но они возьмут их из аргумента --extra-cflags
, но я мог что-то упустить.
Вот пример flake.nix
Я создал форк из примера, который видел в в этом репозитории на GitHub
{
description = "A full build of ffmpeg, including the proprietary stuff";
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
config.allowUnfree = true;
};
overrides = {
ffmpeg = pkgs.ffmpeg-full;
# If this did work, I'm not sure how it would combine with the derivation in the existing package, e.g. if it would get overridden
configureFlags = [ "--extra-cflags -march=znver3 -O3 -pipe -ffat-lto-objects" ];
withHeadlessDeps = true;
nonfreeLicensing = true;
# more options here once things are working above
};
in
rec {
packages.ffmpeg-custom = pkgs.ffmpeg-full.override overrides;
defaultPackage = packages.ffmpeg-custom;
}
);
}
при сборке с помощью nix profile install
я сталкиваюсь с ошибкой:
error: function 'anonymous lambda' called with unexpected argument 'configureFlags'
at /nix/store/d9wpzgyjlpw1424kw2lyilah6690fnk3-source/pkgs/development/libraries/ffmpeg-full/default.nix:1:1:
1| { lib, stdenv, buildPackages, ffmpeg, addOpenGLRunpath, pkg-config, perl, texinfo, yasm
| ^
2| /*
предположительно, поскольку configureFlags определен при выводе в исходном пакете.
Я попытался добавить это в свой /etc/nixos/configuration.nix, но безуспешно:
nixpkgs.overlays = [
(self: super: {
ffmpeg-full = super.ffmpeg-full.override {
configureFlags = [
"--enable-hardcoded-tables"
"--extra-cflags -march=znver3 -O3 -pipe -ffat-lto-objects"
] ++ super.ffmpeg-full.configureFlags;
};
})
];
при сборке с помощью nixos-rebuild switch
я получаю ту же ошибку:
error: function 'anonymous lambda' called with unexpected argument 'configureFlags'
at /nix/store/amxbqlhq11xfrbs4vdsyi04fap0abx0v-nixos-23.11/nixos/pkgs/development/libraries/ffmpeg/generic.nix:3:1:
2|
3| { lib, stdenv, buildPackages, removeReferencesTo, addOpenGLRunpath, pkg-config, perl, texinfo, yasm
| ^
4|
У меня есть машина с NixOS, которая почти постоянно выполняет очень продолжительное кодирование ffmpeg. Я надеялся пересобрать безголовый ffmpeg с более агрессивными флагами и, возможно, некоторыми дополнительными опциями. Я надеюсь оценить разницу в производительности между разными сборками.
Вероятно, я воспользуюсь этим как предлогом для сборки ffmpeg с некоторыми дополнительными несвободными зависимостями.
Обратите внимание, что в целом можно/должно использовать overrideAttrs
, что позволяет описывать новые атрибуты в терминах старых, но поскольку вы не показываете нам написанный вами код, мы не знаем, знаете ли вы об этом/пытались ли вы это сделать. что. Наблюдение за вашей попыткой позволяет нам узнать то, что вы уже знаете, и гораздо эффективнее калибровать наши ответы, чем мы можем сделать это, опираясь только на прозу.
ой, ты прав @CharlesDuffy, я пошел и добавил пример используемой мной чешуйки и ошибки, а также использованное мной наложение и ошибку. Кажется, я знаю, почему возникает ошибка, но не знаю, как с ней справиться.
Я исправил это с помощью дискуссионного форума NixOS здесь.
Использование overrideAttrs
позволило мне редактировать значения внутри области mkderivation. После решения этой проблемы я столкнулся с проблемой, из-за которой пробелы во флаге --extra-cflags = "-O3 -pipe ..."
разделялись на отдельные флаги, а добавление кавычек экранировалось во время настройки. Проблема была решена путем установки preConfigure
, как показано ниже.
# /etc/nixos/configuration.nix
nixpkgs.overlays = [
(self: super: {
ffmpeg-headless = super.ffmpeg-headless.overrideAttrs (old: {
preConfigure = ''
configureFlagsArray+=(
"--extra-cflags=-O3 -pipe -march=znver3 -ffat-lto-objects -frecord-gcc-switches"
)
'';
configureFlags = old.configureFlags;
});
})
];
Пожалуйста, добавьте к вопросу код, который вы пытались использовать для переопределения configureFlags - идеальный минимально воспроизводимый пример позволяет нам запустить тот же код, который вы пытались использовать, и наблюдать режим сбоя воочию (и, таким образом, позволяет нам тестировать предлагаемые решения).