Hi all, So, any feedback for this? I still think it is a good idea to move the filetime change check for a preprocessed file from preprocessFile to mkSimplePreProcessor (both in Distribution.Simple.PreProcess). This gives preprocessors the flexibility to define their own dependency tracking, and would solve the problem with multiple input files generating a single Haskell file. The change is quite simple, I could do it, but I'd like some feedback on this.
In addition to this, we could add something like: mkAdvancedPreProcessor :: (FilePath -> FilePath -> Verbosity -> IO (), FilePath -> Verbosity -> IO [FilePath]) -> (FilePath, FilePath) -> (FilePath, FilePath) -> Verbosity -> IO () which, in addition to the simplePreProcessor, should also provide a function that returns all dependencies of a certain file. Then the file time change check can also be done for the cases where multiple files generate a single Haskell file. But that's maybe a less generic case which could be handled in the preprocessor itself. Regards, Jeroen Bransen Op 5 nov 2012, om 17:14 heeft Jeroen Bransen het volgende geschreven: > With Distribution.Simple.PreProcess.PreProcessor we can add a custom > preprocessor to our Haskell project. This works fine when there is a > one-to-one mapping from other-source to Haskell-source file, but there is no > good support for other types of preprocessors. For example, for our UUAGC [1] > project we also have a cabal plugin [2], and we have the following situation. > > In general, an AG file (.ag) is preprocessed into a single .hs file with the > same name. However, AG files can include other AG files so typically multiple > AG files are preprocessed in a single .hs file. Let's say we have a X.ag > which includes Y.ag and Z.ag, and from this X.hs should be generated. The > first time that we build this is fine, as cabal sees that it can generate > X.hs from X.ag and it calls the custom preprocessor. However, if we now edit > Y.ag and rebuild, nothing will happen! Cabal will only check the file time of > X.ag, which is not changed, so decides that X.hs does not need to be > re-generated. > > Currently we have solved this in a quite ugly way by means of a buildHook > that removes the generated .hs file whenever this file should be rebuild. > Although this works it's of course not a good solution, but with the current > setup I see no other way of doing this. I believe this should be a more > common situation and it should actually be up to the preprocessor to decide > whether or not to rebuild a file. I suggest the following change to > Distribution.Simple.PreProcess. > > In the current version, the check for rebuilding is in preprocessFile, which > simply compares file change times of input/output files. I suggest to remove > that check from there and always call the preprocessor. It is then up to the > preprocessor to decide not to preprocess a file when the generated file is > already in place and nothing has changed. To handle the common situation > where there is a one-to-one mapping, I suggest to move this check to > mkSimplePreprocessor which is probably used by almost all preprocessors. In > that way nothing changes for 'simple' preprocessors, but there is some extra > flexibility for the cases like UUAGC. > > Regards, > Jeroen Bransen > > > [1] http://hackage.haskell.org/package/uuagc > [2] http://hackage.haskell.org/package/uuagc-cabal _______________________________________________ cabal-devel mailing list cabal-devel@haskell.org http://www.haskell.org/mailman/listinfo/cabal-devel