2011-07-15 19 views
19

He estado trabajando en este proyecto Haskell, y tengo un archivo cabal para él. Ahora, mi proyecto está estructurado como una biblioteca que implementa un intérprete simple. También tengo un archivo principal muy corto que debe compilarse en un archivo ejecutable para llamar a la biblioteca. Lo que quiero hacer es:¿Cómo evitar recompilar en este archivo cabal?

1) compilar la biblioteca y exponer algunos de los módulos

2) compilar el ejecutable

Tengo un archivo de Cabal que funciona y parece hacer esto. El problema es que cuando compila el ejecutable, recompila todos los módulos que ya se han compilado en el paso (1). No entiendo muy bien por qué lo hace, ¿hay alguna forma de detenerlo, salvo crear dos archivos cabal seguidos?

Realmente no quiero crear dos archivos cabal separados, porque a cabal no parece gustarle tener ambos archivos cabal en el mismo directorio, y realmente no quiero configurar un directorio de proyecto separado para el segundo paso, ya que básicamente equivale a compilar un solo archivo.

cabal-version:  >= 1.6 
build-type:   Simple 
name:    HaSC 
version:   0.2.3 
license:   OtherLicense 
category:   Language 
author:    Chris B 
maintainer:   Chris B 
copyright:   Chris B 2010 - 2011 
synopsis:   (HA)skell (S)ound (C)hange applier (HaSC) library 
description:  HaSC implements a little language for applying sound changes to words 
homepage:   http://www.chrisdb.me.uk/redmine/projects/haskell-sound-change 
stability:   Alpha 
data-files:   doc/HaSCDoc.pdf 
license-file:  LICENSE 

library 
    build-depends: 
     base >= 4.3, 
     containers >= 0.3, 
     parsec >= 3, 
     parallel >= 3.1, 
     deepseq >= 1.1, 
     mtl >= 1.1, 
     transformers >= 0.2, 
     text >= 0.10, 
     text-icu >= 0.6.3, 
     pretty >= 1, 
     directory >= 1.1, 
     filepath >= 1.2 
    hs-source-dirs: src 
    exposed-modules: HaSC.IO.Disk, 
        HaSC.IO.Memory, 
        HaSC.Exec 
    other-modules: HaSC.AST, 
        HaSC.IO, 
        HaSC.IdentMap, 
        HaSC.Parse, 
        HaSC.Regex, 
        HaSC.Representation,      
        HaSC.Transformations, 
        HaSC.Search, 
        HaSC.State 

executable HaSC 
    GHC-Options: -rtsopts 
    hs-source-dirs: src 
    main-is:   Main.hs  

Respuesta

20

En su sección ejecutable, añadir la biblioteca en Build-Depends de manera que el ejecutable depende de la biblioteca.

Hay un pequeño problema: también tiene que mover el Main.hs del ejecutable (y cualquier otro archivo fuente específico del ejecutable) a un subdirectorio diferente y especificar un Hs-Source-Dirs diferente para que no recoja el módulos de biblioteca estando en la misma carpeta.

executable HaSC 
    Build-Depends: HaSC 
    Main-Is: Main.hs 
    Hs-Source-Dirs: foo -- Directory you moved Main.hs to 

Para que esto funcione, necesitará especificar Cabal-Version >= 1.8. Ver Cabal ticket #89 para los detalles.

+0

Gracias por eso. Ahora funciona. – chrisdb

+0

Ah, así es como uno hace que los ejecutables dependan de la biblioteca en el mismo archivo cabal. – nh2

+3

Para un posible diseño del proyecto que se ajuste a situaciones como esta, vea [Cómo hacer un proyecto Cabal de Haskell con biblioteca + ejecutables que todavía se ejecutan con runhaskell/ghci?] (Http://stackoverflow.com/questions/12305970/how-to- make-a-haskell-cabal-project-with-libraryexecutables-that-still-run-with). – nh2