Пакет Nix: передать флаг сборки --extra-cflags в ffmpeg во время компиляции

У меня немного нет опыта работы с 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 определен при выводе в исходном пакете.

Наложение в попытке Configuration.nix

Я попытался добавить это в свой /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 с некоторыми дополнительными несвободными зависимостями.

Пожалуйста, добавьте к вопросу код, который вы пытались использовать для переопределения configureFlags - идеальный минимально воспроизводимый пример позволяет нам запустить тот же код, который вы пытались использовать, и наблюдать режим сбоя воочию (и, таким образом, позволяет нам тестировать предлагаемые решения).

Charles Duffy 11.05.2024 00:12

Обратите внимание, что в целом можно/должно использовать overrideAttrs, что позволяет описывать новые атрибуты в терминах старых, но поскольку вы не показываете нам написанный вами код, мы не знаем, знаете ли вы об этом/пытались ли вы это сделать. что. Наблюдение за вашей попыткой позволяет нам узнать то, что вы уже знаете, и гораздо эффективнее калибровать наши ответы, чем мы можем сделать это, опираясь только на прозу.

Charles Duffy 11.05.2024 00:14

ой, ты прав @CharlesDuffy, я пошел и добавил пример используемой мной чешуйки и ошибки, а также использованное мной наложение и ошибку. Кажется, я знаю, почему возникает ошибка, но не знаю, как с ней справиться.

catleeball 11.05.2024 00:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я исправил это с помощью дискуссионного форума 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;
    });
  })
];

Другие вопросы по теме

Как менеджер пакетов nix интегрируется в классическую файловую систему Linux и $PATH?
Flake не работает при обновлении, nimPackages отсутствует, куда он делся?
Как исправить ошибку сборки Nix из-за файла, использующего способ разрыва строки Windows
Невозможно создать приложение Spring Boot с тестовыми контейнерами с использованием Nix из-за зависимости времени сборки Docker
Почему я получаю сообщение « PermissionError: [Errno 13] Разрешение отклонено: '/homeless-shelter'Q при установке 'jina-hubble-sdk' с помощью Nix Flake
Почему при попытке собрать этот пакет Python возвращается сообщение «Бэкэнд «poetry.core.masonry.api» недоступен»
Почему я могу использовать ollama в виртуальной среде, созданной nix-shell, но не в виртуальной среде, созданной флейком
Как я могу настроить конфигурацию Nix Flake для моей виртуальной среды, чтобы обеспечить успешное выполнение сценария Python, основанного на Ollama?
Создание приложения для Android с помощью bazel, настройка в среде nix-shell
Composer читает неправильную версию PHP при установке через Nix flake