2013-04-27 3 views
5

Я реализовал пользовательский препроцессор, который создает * .hs файлы формы * .tpl файлов. Он указан в Setup.hs с использованием Build-Type: Custom. Все работает нормально, но я не могу создать из него tar.gz-пакет (используя cabal sdist).Haskell - пакет для упаковки пакетов с пользовательскими препроцессорами

Cabal жалуется, что он не может найти открытые модули, которые генерируются препроцессором. Сообщение об ошибке

cabal: Error: Could not find module with any 
suffix: ["gc","chs","hsc","x","y","ly","cpphs","hs","lhs"] 

Как я могу сделать Cabal себе отчет в том, что модуль не хватает, или, может быть, добавить TPL в известных расширений файлов, или что-то?

+0

Можете ли вы показать нам свой '.cabal' файл? –

+0

Мне кажется, что вам нужно написать собственный скрипт sdist, а затем создать tarball с помощью 'Setup sdist' (из-за https://github.com/haskell/cabal/issues/403). –

+1

На самом деле, я думаю, что это сработает, просто запустив 'Setup sdist'. –

ответ

3

Это a known issue with cabal sdist. Вместо этого используйте ./dist/setup/setup sdist.

Вот пример:

$ cat preprocessor-test.cabal 
name:    preprocessor-test 
version:    0.1.0.0 
build-type:   Custom 
cabal-version:  >=1.10 
extra-source-files: PreprocessorTest/*.prepro 

library 
    exposed-modules:  PreprocessorTest.PreprocessorTest 
    build-depends:  base ==4.5.* 
    -- hs-source-dirs: 
    default-language: Haskell2010 

$ cat Setup.hs 
#!/usr/bin/env runhaskell 

import Distribution.Simple 
import Distribution.Simple.PreProcess 
import Distribution.Simple.Utils 
import Distribution.PackageDescription 
import Distribution.Simple.LocalBuildInfo 
import System.Cmd (rawSystem) 
import System.FilePath ((</>)) 

main = let hooks = simpleUserHooks 
      dummy = ("prepro", dummyPreprocessor) 
     in defaultMainWithHooks hooks 
      { hookedPreProcessors = dummy:knownSuffixHandlers } 

dummyPreprocessor :: BuildInfo -> LocalBuildInfo -> PreProcessor 
dummyPreprocessor build local = PreProcessor { 
    platformIndependent = True, 
    runPreProcessor = 
    mkSimplePreProcessor $ \inFile outFile verbosity -> do 
     notice verbosity (inFile ++ " is being preprocessed to " ++ outFile) 
     rawSystem "cp" [inFile, outFile] 
     return() 
    } 
$ cat PreprocessorTest/PreprocessorTest.prepro 
module PreprocessorTest.PreprocessorTest 
     where 

preprocessorTest :: Int 
preprocessorTest = 1 

$ cabal configure 
Resolving dependencies... 
[1 of 1] Compiling Main    (Setup.hs, dist/setup/Main.o) 
Linking ./dist/setup/setup ... 
Configuring preprocessor-test-0.1.0.0... 

$ cabal build  
Building preprocessor-test-0.1.0.0... 
Preprocessing library preprocessor-test-0.1.0.0... 
PreprocessorTest/PreprocessorTest.prepro is being preprocessed to 
dist/build/PreprocessorTest/PreprocessorTest.hs 
[1 of 1] Compiling PreprocessorTest.PreprocessorTest (dist/build/PreprocessorTest/PreprocessorTest.hs, dist/build/PreprocessorTest/PreprocessorTest.o) 
Registering preprocessor-test-0.1.0.0... 

$ ./dist/setup/setup sdist 
Distribution quality errors: 
No 'synopsis' or 'description' field. 
The 'license' field is missing or specified as AllRightsReserved. 
Distribution quality warnings: 
No 'category' field. 
No 'maintainer' field. 
Note: the public hackage server would reject this package. 
Building source dist for preprocessor-test-0.1.0.0... 
Preprocessing library preprocessor-test-0.1.0.0... 
PreprocessorTest/PreprocessorTest.prepro is being preprocessed to 
dist/src/sdist.-6767/preprocessor-test-0.1.0.0/dist/build/PreprocessorTest/PreprocessorTest.hs 
Source tarball created: dist/preprocessor-test-0.1.0.0.tar.gz 

$ tar tzf dist/preprocessor-test-0.1.0.0.tar.gz 
preprocessor-test-0.1.0.0/ 
preprocessor-test-0.1.0.0/dist/ 
preprocessor-test-0.1.0.0/dist/build/ 
preprocessor-test-0.1.0.0/dist/build/PreprocessorTest/ 
preprocessor-test-0.1.0.0/dist/build/PreprocessorTest/PreprocessorTest.hs 
preprocessor-test-0.1.0.0/Setup.hs 
preprocessor-test-0.1.0.0/PreprocessorTest/ 
preprocessor-test-0.1.0.0/PreprocessorTest/PreprocessorTest.prepro 
preprocessor-test-0.1.0.0/preprocessor-test.cabal 
+0

Спасибо, что работает. – scravy