Поиск чужой библиотеки с помощью cabal с использованием nix-shell - PullRequest
1 голос
/ 07 апреля 2019

У меня похожая проблема с: Кабал не может найти иностранную библиотеку при сборке на 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.

1 Ответ

1 голос
/ 07 апреля 2019

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

...