2013-04-27 61 views
5

我已经实现了一个自定义预处理器,它可以创建* .hs文件形式* .tpl文件。它通过使用Build-Type: CustomSetup.hs中指定。一切工作正常,但我不能从它创建tar.gz包(使用cabal sdist)。Haskell - 自定义预处理器的包装cabal包

Cabal抱怨说,它无法找到由预处理器生成的裸露模块。该错误消息是

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

怎样才能让惊天动地知道的事实,该模块是不缺的,或者可能添加第三方物流到已知文件的扩展,还是什么?

+0

你能告诉我们你的'.cabal'文件? – 2013-04-28 07:29:38

+0

我认为你需要的是编写一个自定义的sdist钩子,然后用'Setup sdist'建立tarball(因为https://github.com/haskell/cabal/issues/403)。 – 2013-04-28 07:47:12

+1

实际上,我认为这只会运行'Setup sdist'。 – 2013-04-28 08:53:44

回答

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 2013-04-28 09:51:19