Поиск чужой библиотеки с помощью Cabal с помощью nix-shell

У меня похожая проблема: Cabal не может найти стороннюю библиотеку при сборке на NixOS

В основном я использую cabal2nix для создания из package.yaml, содержащего:

extra-libraries:
  - libmnl

Это создает файл cabal.nix:

{ mkDerivation, base, bytestring, cereal, containers, hpack
, iproute, lens, libmnl, netlink, primitive
, resourcet, safe-exceptions, stdenv, transformers
}:
mkDerivation {
  pname = "relay";
  version = "0.1.0.0";
  src = ./.;
  libraryHaskellDepends = [
    base bytestring cereal containers iproute lens netlink
    primitive resourcet safe-exceptions transformers
  ];
  librarySystemDepends = [ libmnl ];
  libraryToolDepends = [ hpack ];
  testHaskellDepends = [
    base bytestring cereal containers iproute lens netlink
    primitive resourcet safe-exceptions transformers
  ];
  testSystemDepends = [ libmnl ];
  preConfigure = "hpack";
  homepage = "https://github.com/MatrixAI/Relay#readme";
  license = stdenv.lib.licenses.asl20;
}

Если я войду в это через nix-shell и запущу cabal configure. Он жалуется, что не может найти libmnl:

Resolving dependencies...
Configuring relay-0.1.0.0...
cabal: Missing dependency on a foreign library:
* Missing (or bad) C library: libmnl
This problem can usually be solved by installing the system package that
provides this library (you may need the "-dev" version). If the library is
already installed but in a non-standard location then you can use the flags
--extra-include-dirs= and --extra-lib-dirs= to specify where it is.If the
library file does exist, it may contain errors that are caught by the C
compiler at the preprocessing stage. In this case you can re-run configure
with the verbosity flag -v3 to see the error messages.

Также работает gcc -c test.c -lmnl на этом файле внутри nix-shell:

#include <libmnl/libmnl.h>

int main() { return 0; }

Так почему же клика не может найти libmnl, но gcc может легко найти его в nix-shell.

При запуске с -v3 кажется, что он пытается связать с -llibmnl. Но правильная ссылка должна быть -lmnl. Это кажется очень проблематичным, есть ли способ сказать, что клика должна быть связана с флагом -lmnl, а не -llibmnl?

Я обнаружил, что если я отредактирую файл Cabal и изменю extra-libraries так, чтобы он указывал на mnl вместо libmnl, тогда это сработает, изменив то, как Cabal пытается связать. Однако cabal2nix при взятии package.yaml генерирует libmnl, который является правильным атрибутом пакета от Nix. Похоже, что extra-libraries должно быть mnl, тогда как cabal.nix должно быть libmnl.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
170
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

По сути, extra-libraries нужно использовать mnl, а не libmnl. Затем при использовании cabal2nix необходимо сопоставить пакет libmnl с атрибутом mnl. Это было решено путем сопоставления mnl с фиксацией libmnl вверх по течению от cabal2nix: https://github.com/NixOS/cabal2nix/issues/413#event-2257811946

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