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