В процессе решения этой сложной ситуации сборки я столкнулся с проблемой зависимости от пакета Cabal, который я сгенерировал сам (полный пакет, package.yaml
и Setup.hs
и исходный код и зависимые C библиотеки и все).
У меня есть stack.yaml
и package.yaml
, которые вместе описывают среду, в которой я могу запустить мой генератор кода, так что это работает:
- Настройте среду, убедитесь, что доступны все зависимости:
stack build
- В этой среде я теперь могу выполнить скрипт сборки:
stack runhaskell -- -iclash-shake/shake Shakefile.hs
- Запустить генератор кода на выходе скрипта сборки:
clashilator
clashilator -i _build/verilog/topEntity.manifest -o _build/verilator
- Сборка C части сгенерированного кода:
make -f _build/verilator/csrc/Makefile
Все это оставляет мне идеально настроенную библиотеку Cabal в _build/verilator
. Я хотел бы добавить исполняемый файл к моему внешнему package.yaml
, который зависит от этой библиотеки. Конечно, этот исполняемый файл не будет доступен для сборки, пока не будут завершены все 4 шага, описанные выше.
Я могу скрыть исполняемый файл под флагом сборки, например:
executables:
draw-toy-verilator:
main: verilator.hs
when:
- condition: flag(verilator)
then:
dependencies:
- clashilator-ffi
else:
buildable: false
Здесь, clashilator-ffi
имя пакета Cabal, сгенерированного на шаге 3 и подготовленного для сборки на шаге 4. Поскольку draw-toy-verilator
теперь находится за флагом, который по умолчанию равен false
, то факт, что clashilator-ffi
не существует на шаге 1, не является проблема с запуском stack build
без флагов.
Однако после шага 4 я бы хотел сделать stack build --flag clash-draw-toy:verilator
и заставить его работать. Однако это не так, потому что _build/verilator
не знает, что такое Stack как дополнительная зависимость. И я не могу добавить extra-deps: _build/verilator
к своему stack.yaml
, потому что тогда шаг 1 завершится неудачно (каталог еще не существует).
Так что я думаю, что мне нужно, чтобы Stack смотрел extra-deps
лениво, или ie передавал их флагу Cabal, или как-то располагал пакет в разделе исполняемого файла draw-toy-verilator
в package.yaml
вместо stack.yaml
.