2013-04-23 1 views
4

Я хочу, чтобы мое выражение TemplateHaskell, которое использует IO и зависит от файла MyDependency.txt, пересматривается при изменении этого файла.Как использовать addDependentFile для TemplateHaskell в файле относительно скомпилированного файла?

Поэтому я использую addDependentFile "MyDependency.txt", чтобы сообщить ghc, чтобы проверить этот файл для модификации при компиляции моего кода.

К сожалению, это не работает, потому что addDependentFile работает только с каталогом, из которого вызывается ghc.

Как его использовать, чтобы зависеть от файла, который только рядом с (в том же каталоге, что и файл), который я компилирую?

ответ

5

Вы можете использовать location от Language.Haskell.TH.Syntax извлечь имя файла из файла компилируется, и использовать это, чтобы собрать правильный путь:

-- | Uses 'addDependentFile' on a file relative to the current file 
-- to mark it as being checked for changes when compiled with TemplateHaskell. 
-- 
-- Returns an empty list of declarations so that it can be used with: 
-- 
-- >$(addDependentFileRelative "MyDependency.txt") 
addDependentFileRelative :: FilePath -> Q [Dec] 
addDependentFileRelative relativeFile = do 
    currentFilename <- loc_filename <$> location 
    pwd    <- runIO getCurrentDirectory 

    let invocationRelativePath = takeDirectory (pwd </> currentFilename) </> relativeFile 

    addDependentFile invocationRelativePath 

    return [] 

(код публичного домена)

 Смежные вопросы

  • Нет связанных вопросов^_^