Как я могу привязать версию зависимости Haskell к версии базовой собственной зависимости с помощью Cabal?

В моем конкретном случае у меня есть зависимость в моем файле Cabal от пакета Haskell bindings-libzip. В частности, я мог бы принять несколько разных версий libzip, например. bindings-libzip-0.11 или bindings-libzip-0.10. Они, в свою очередь, зависят от соответствующих родных библиотек C libzip версий 0.11 и 0.10.

Поэтому у меня есть bindings-libzip >= 0.10 < 0.12 в моем файле .cabal.

Пакет Haskell bindings-libzip-x указывает с помощью PkgConfig-Depends, что libzip версия x должна присутствовать на клиентской машине. Допустим, у нижестоящего пользователя установлена ​​версия 0.10 из libzip. Однако при извлечении моего пакета этот пользователь извлекает последние возможные зависимости и транзитивно извлекает версию 0.11 из bindings-libzip. Это приводит к ошибке процесса сборки с сообщением об установленной неправильной версии libzip.

Можно ли каким-либо образом указать в моем файле .cabal использовать bindings-libzip-0.11 тогда и только тогда, когда pkg-config обнаружит версию 0.11 из libzip, и использовать bindings-libzip-0.10 тогда и только тогда, когда pkg-config обнаружит версию 0.10 из libzip?


person badcook    schedule 20.09.2015    source источник


Ответы (2)


Я отправляю другой ответ, потому что он использует другую идею...

Использование пользовательского файла Setup.hs с defaultMainWithHooksArgs позволяет проверять и изменять аргументы команды cabal configure.

Это Setup.hs, который не модифицируется:

import Distribution.Simple
import Distribution.Simple.Configure
import System.Environment

main = do
  args <- getArgs
  defaultMainWithHooksArgs simpleUserHooks args

Если в вашем файле .cabal определен флаг, например:

Flag Foo
  Default:  False

то в аргументах вы увидите "--flags=-foo". Итак, идея такова:

  1. Определите два флага в файле .cabal — use10 и use11, чтобы выбрать, какую версию bindings-libzip использовать.
  2. В своем пользовательском файле Setup.hs определите, какую версию использовать.
  3. Найдите аргумент "--flags=..." и соответствующим образом измените его перед передачей в defaultMainWithHooksArgs.
person ErikR    schedule 20.09.2015

Я думаю, что это можно сделать с помощью пользовательского файла Setup.hs (укажите build-type: Custom в файле .cabal.)

Вы можете переопределить определенные этапы процесса сборки, используя main следующим образом:

main = defaultMainWithHooks $ simpleUserHooks { preConf = myPreConf }

myPreConf :: Args -> ConfigFlags -> IO HookedBuildInfo
myPreConf args configFlags = ...

Также вероятно, что вам нужно переопределить confHook.

Некоторые ссылки:

Примеры пользовательских файлов Setup.hs, переопределяющих confHook:

В частности, так выглядит hruby Setup.hs. делает что-то вроде того, что вы хотите сделать.

все крючки клики: data UserHooks

person ErikR    schedule 20.09.2015