
#137: setup sdist places implementation-dependent preprocessor output in the source bundle ----------------------------------+----------------------------------------- Reporter: ross@… | Owner: Type: defect | Status: new Priority: normal | Milestone: Cabal-1.8 Component: Cabal library | Version: HEAD Severity: normal | Keywords: Difficulty: normal | Ghcversion: 6.4.2 Platform: Linux | ----------------------------------+----------------------------------------- Comment(by dankna): Attached, please find three patches for Cabal and one for Cabal-Install, in "darcs send" format. Also find a change to Happy, in the form of an entire Setup.lhs file to replace the corresponding file in Happy-1.18.4 (I guess I must not have been able to find the original repo for Happy - I can prepare a diff if you find that easier). These implement the stuff we talked about with regard to preprocessor output. Hopefully you'll like the way I did it. I'm afraid it's only easy for me to test with ghc, but it /should/ support all compilers, since I did make appropriate changes to all of their backends. If this is a problem I can try to get the others set up, but I hoped you might already be set for that and able to do it more quickly than I could. There are three main pieces to the patch, as the commit messages will explain. Briefly, the first piece simply redirects the output, the second piece makes sure the output is included in the sdist tarball, and the third piece adds a user hook to implement the subdirectory-naming policy we discussed. With the redirection of the output, I found that by doing it at the proper layer it wasn't necessary to add any new code to compare timestamps; the existing codepath appeared to handle it. This could use more testing; I used Happy as my test case. With the inclusion in sdist, I added a new parameter to prepareTree, which necessitated the change to Cabal-Install. As I explained in a comment somewhere, it includes ALL immediate subdirectories of preprocessed/, but within those, ONLY the files that have names which could have been generated by a known preprocessor from one of the included source files. With the subdirectory-naming, I added a new user hook that implements the concept of "specializing" the preprocessed output on a set of variables. Rather than defining a new vocabulary of variables which would then become maintenance overhead, I reused PathTemplateVariable for this purpose. It constructs a subdirectory name as a canonical representation of the set of variables specialized on, with their values. It uses URL-escaping for characters that we can't use for various reasons. I also made a trivial change to Happy's Setup.lhs, to test the specialization feature. I've included that one too; once the Cabal changes are released, either you or I can submit it to the Happy maintainer for inclusion there. It doesn't actually implement using Happy's --ghc option; it merely specializes the build properly, outputting into "compiler=ghc-6.blahblahblah" if the compiler is GHC or into "generic" otherwise. It does this by installing a preprocesserSpecialization hook which looks at the LocalBuildInfo it's given, checks the compiler flavor therein, and returns [CompilerVar] or [] as appropriate. Hopefully this is a sufficiently general capability for the use-cases that exist in the wild. As always, see the source for more details. I tried to follow your coding style as I understood it; in particular when I needed to add imports I enumerated each symbol used. I also tried to comment everything of any importance. I'll be interested in your feedback on how well I managed. -- Ticket URL: http://hackage.haskell.org/trac/hackage/ticket/137#comment:10 Hackage http://haskell.org/cabal/ Hackage: Cabal and related projects