Существует два подхода к компиляции и два подхода к получению зависимостей.Вам нужно выбрать один из каждого набора (все 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.