Как профилировать TemplateHaskell, построенный с помощью Cabal?

Полный проект на https://github.com/ysangkok/cabal-profiling-issue

Проект содержит строительные леса, созданные cabal init. Я сейчас вставлю самые интересные фрагменты исходников.

В Main.hs У меня есть:

      newtype Wrapper = Wrapper Int

deriveConvertible ''Wrapper ''Int

в TH.hs У меня есть:

      import            Data.Convertible

deriveConvertible :: TH.Name -> TH.Name -> TH.Q [TH.Dec]
deriveConvertible newType otherType = do
  Just newCon <- TH.lookupValueName (TH.nameBase newType)
  v <- TH.newName "v"

  [d|
    instance Convertible $(TH.conT newType) $(TH.conT otherType) where
      safeConvert $(TH.conP newCon [TH.varP v]) = Right $(TH.varE v)

    instance Convertible $(TH.conT otherType) $(TH.conT newType) where
      safeConvert source = Right ($(TH.conE newCon) source)

    |]

Но если я положу profiling: true в cabal.project и беги cabal build с GHC 8.6.5 и Cabal 3.4.0.0 (установлен с помощью ghcup) я получаю:

          Failed to load interface for 'Data.Convertible.Base'
    Perhaps you haven't installed the profiling libraries for package 'convertible-1.1.1.0'?

Что не так с кодом и почему он компилируется без профилирования, но не работает при включении?

1 ответ

Это известная проблема компиляции многомодульной программы, содержащей код TH для профилирования, см. Соответствующие разделы в документации:

Это вызывает трудности, если у вас есть многомодульная программа, содержащая код Template Haskell, и вам нужно скомпилировать ее для профилирования, потому что GHC не может загрузить профилированный объектный код и использовать его при выполнении соединений.

В качестве обходного пути просто введите в свой test.cabal,

           other-extensions: TemplateHaskell

Затем построение с профилированием (т. Е. С cabal build --enable-library-profiling) все было бы хорошо.

Подробнее о том, зачем нам TemplateHaskell в other-modulesраздел https://github.com/haskell/cabal/issues/5961.

Другие вопросы по тегам