Как Счастливые и Алекс сами заработали?

Дерево источников для happy содержит AttrGrammarParser.ly и Parser.ly и исходное дерево для alex содержит Scan.x. Тем не менее, насколько я могу судить, чтобы скомпилировать happy, нам нужно преобразовать файлы .ly в файлы .lhs, используя... happy, и для компиляции alex нам нужно преобразовать файлы .x в файлы .hs, используя... alex.

Итак, похоже, что для компиляции любого инструмента требуется некоторая перезагрузка.

Файлы Setup.lhs для каждого проекта содержат некоторое расширение шаблона, но, насколько я могу судить, ничего не делают, в частности, для самозагрузки.

Как и где выполняется начальная загрузка?

Ответ 1

Я вижу, что вы смотрите на исходное дерево репозиториев darcs для этих пакетов на darcs.haskell.org. Если вы посмотрите на фактические tarballs на Hackage, вы увидите что-то немного другое:

https://hackage.haskell.org/package/alex-3.1.4/src/dist/build/alex/alex-tmp/

https://hackage.haskell.org/package/happy-1.19.5/src/dist/build/happy/happy-tmp/

Итак, в основном необходимые артефакты сборки поставляются с архивом Hackage. Затем Cabal просто использует артефакты сборки во время процесса сборки, тем самым избегая необходимости начальной загрузки. Cabal также знает, как сохранить такие артефакты сборки, когда вы запускаете cabal sdist для своих собственных пакетов, которые вы хотите не зависеть от счастливого или alex, но в последний раз, когда я проверял, это не хорошо взаимодействует с песочницами, fwiw.

Кстати, alex и счастливое развитие переместились в github:

https://github.com/simonmar/alex/

https://github.com/simonmar/happy/