У меня есть 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, возможно, связаны.