Два пакета cabal в cabal.project и nix-сборка (библиотека и ее примеры prgs)

У меня есть haskell lib X со следующей файловой структурой:

X/src/libxfiles.hs
X/default.nix
X/shell.nix
X/libx.nix
X/libx.cabal
X/cabal.project

и

X/example/lib/exampleCommon.hs
X/example/ex1/main.hs
X/example/ex2/main.hs
X/example/example.cabal

cabal.project указывает на libx.cabal и на example/example.cabal, а cabal new-build all работает внутри nix-shell. Необходимые пакеты haskell для библиотеки libx и примеры программ находятся в файле libx.nix.

Почему эта структура? Так как примеры программ имеют 99% общего кода и только пару строк, которые зависят от пользовательского интерфейса (webkit2gtk и подобные). Более ранняя версия имела флаги и CPP внутри основного примера, а nix-build создавала библиотеку и пример prg в каталоге результатов. В этой новой настройке cabal new-build работает нормально, когда компилятором является ghc, и моя цель - создавать программы с помощью ghc.

Ранее nix-build собирал библиотеку и один из ее примеров программ с помощью ghcjs. На данный момент nix-build делает только lib. Можно ли каким-то образом указать в libx.nix или default.nix также собрать одну из программ-примеров, скажем, ex1? То есть указать для процесса сборки cabal new-build ex1, а затем установить результат так же, как он устанавливает библиотеку.

Чтобы использовать ghcjs, чтобы собрать ex1, предназначенный для ghcjs, можно выполнить nix-shell --argstr "compiler" "ghcjs", а затем cabal new-configure --ghcjs и т. д. (Итак, за пределами nix-shell команда nix-build -command не делает всего, что мне хотелось бы.)

Нужно ли делать nix-файлы в каталоге примеров? Почему-то это звучит не очень привлекательно, так как необходимые модули уже есть в libx.nix. То есть я должен сделать что-то вроде ответа на как получить клику и nix работают вместе?

Или в github есть пакет haskell с похожей структурой, который мог бы работать в качестве примера?

Идеальным решением было бы, чтобы nix-build собирал библиотеку и все ее примеры программ. Это потребует использования различных инструментов сборки (ghc и ghcjs). Таким образом, возможно, вопрос заключается в том, как сделать nix-настройку для многопакетного клик-проекта, где отдельные пакеты нуждаются в разных средах, включая инструменты компиляции. В идеальном мире nix-сборка по умолчанию будет собирать все, и пользователь может параметризовать nix-сборку для сборки выбранного примера или примеров и т. д.

Похоже, что обсуждения в выпуске клики 4646 и в cabal2nix issue 286, возможно, связаны.


person Gspia    schedule 28.09.2017    source источник