Как мне скомпилировать программы на Haskell, используя Shake - PullRequest
0 голосов
/ 06 июня 2018

У меня есть программа на Haskell, которую я хочу скомпилировать с GHC, организованная системой сборки Shake.Какие команды мне следует выполнить и при каких обстоятельствах они должны быть выполнены повторно?

1 Ответ

0 голосов
/ 06 июня 2018

Существует два подхода к компиляции и два подхода к получению зависимостей.Вам нужно выбрать один из каждого набора (все 4 комбинации имеют смысл), чтобы придумать комбинированный подход.

Компиляция

Вы можете либо:

  • Вызывайте ghc -c для каждого файла по очереди, в зависимости от файла .hs и любых файлов .hi, которые он транзитивно импортирует, генерируя как файлы .hi, так и .o.В конце позвоните ghc -o в зависимости от всех файлов .o.Действительный код см. В этом примере .
  • ИЛИ Вызовите ghc --make один раз, в зависимости от всех файлов .hs.Действительный код см. В этом примере .

. Преимущество ghc --make состоит в том, что он быстрее, чем множественные вызовы ghc -c, поскольку GHC может загружать только каждый файл .hi.один раз, а не один раз на команду.Обычно ускорение в 3 раза.Недостаток в том, что параллелизм сложнее (вы можете использовать от -j до ghc --make, но Shake по-прежнему предполагает, что каждое действие потребляет один процессор), и что две компиляции ghc --make не могут выполняться одновременно, если они перекрываются на любомзависимости.

Зависимости

Вы можете:

  • Анализировать файлы Haskell для рекурсивного поиска зависимостей.Для синтаксического анализа файла вы можете либо искать операторы import (и, возможно, #include) в соответствии с соглашением о кодировании, либо использовать библиотеку, например haskell-src-exts.Фактический код с очень приблизительным import синтаксическим анализатором см. В этом примере .
  • ИЛИ Используйте выходные данные ghc -M для обнаружения зависимостей, которые могут быть проанализированыиспользуя вспомогательную функцию Shake parseMakefile.Действительный код см. В этом примере .

Преимущество синтаксического анализа файлов Haskell состоит в том, что можно создавать файлы Haskell и это может быть намного быстрее.Преимущество использования ghc -M заключается в том, что легче поддерживать все функции GHC.

...