Location of generated files

Hi, I'd like to change where Yhc puts generated files. I propose: Every module gets assigned a "root" directory: * foo/Main.hs has a root of "foo". * foo/System/Cmd.hs, module System.Cmd, has a root of "foo". * foo/System/Cmd.hs, module Cmd, has a root of "foo/System". (Note that this is already done when searching for imports) Every file with <ext> (where ext is one of hi, hbc,ycr,yca) will be created in: * foo/Main.hs leads to foo/<dir-ext>/Main.<ext> * foo/System/Cmd.hs, module System.Cmd, leads to foo/<dir-ext>/System.Cmd.<ext> By default, <dir-ext> is "obj" for all extensions. The flag objdir will allow the default <dir-ext> to be changed. The flag <ext>dir will allow the location of <ext> files to be changed. For example --hidir=hi would put all the hi files in foo/hi/Main.hi. --objdir=bar will put all generated files in foo/bar/*.*. There is exactly one exception to this rule: foo/Foo.hs, module Main, creates foo/Foo.hbc, in all circumstances. Comments? If the argument you use relies on some other compiler (GCC/GHC) doing something different, please say _why_ that compilers behaviour is preferable. The reason for this change is that I have written a low-level Make library, and therefore want to port Yhc to use this. I could re-implement the existing behaviour, but once you sit down and take a close look at the existing behaviour, it starts to look more and more silly. The existing make facilities are around ~22Kb of source, the new one will have a separate well defined library of ~7Kb, and a Yhc specific part of ~3Kb. For free we will get minimal compilation, cycle detection (and breaking using hand written .hi files), minimal file tests etc. As part of this move to a new make architecture, I want Yhc to be able to compile the base library by simply invoking yhc *.hs, I want linking of .yca files to work better, and I want world peace. I also hope that once the Make library has been tested in the context of Yhc, it can be shoved in the direction of the Cabal people. Thanks Neil

On Mon, Jul 02, 2007 at 08:41:31PM +0100, Neil Mitchell wrote:
Hi,
I'd like to change where Yhc puts generated files. I propose:
Every module gets assigned a "root" directory: * foo/Main.hs has a root of "foo". * foo/System/Cmd.hs, module System.Cmd, has a root of "foo". * foo/System/Cmd.hs, module Cmd, has a root of "foo/System".
(Note that this is already done when searching for imports)
Every file with <ext> (where ext is one of hi, hbc,ycr,yca) will be created in:
* foo/Main.hs leads to foo/<dir-ext>/Main.<ext> * foo/System/Cmd.hs, module System.Cmd, leads to foo/<dir-ext>/System.Cmd.<ext>
By default, <dir-ext> is "obj" for all extensions. The flag objdir will allow the default <dir-ext> to be changed. The flag <ext>dir will allow the location of <ext> files to be changed. For example --hidir=hi would put all the hi files in foo/hi/Main.hi. --objdir=bar will put all generated files in foo/bar/*.*.
There is exactly one exception to this rule:
foo/Foo.hs, module Main, creates foo/Foo.hbc, in all circumstances.
Comments? If the argument you use relies on some other compiler (GCC/GHC) doing something different, please say _why_ that compilers behaviour is preferable.
The reason for this change is that I have written a low-level Make library, and therefore want to port Yhc to use this. I could re-implement the existing behaviour, but once you sit down and take a close look at the existing behaviour, it starts to look more and more silly. The existing make facilities are around ~22Kb of source, the new one will have a separate well defined library of ~7Kb, and a Yhc specific part of ~3Kb. For free we will get minimal compilation, cycle detection (and breaking using hand written .hi files), minimal file tests etc.
As part of this move to a new make architecture, I want Yhc to be able to compile the base library by simply invoking yhc *.hs, I want linking of .yca files to work better, and I want world peace.
I also hope that once the Make library has been tested in the context of Yhc, it can be shoved in the direction of the Cabal people.
This sounds like a very reasonable proposal, and I will take it for my project as well. My only concern is that some projects have obj/ dirs containing very important sources (3D object models, etc) so we will need to be a bit careful in the implementation of clean. Also, when you say 3kb yhc-specific - how much of that relates to invoking yhc, and how much is for building yhc? Stefan

Hi
This sounds like a very reasonable proposal, and I will take it for my project as well.
Good :) You are welcome to use the Make library as well - I deliberately wrote it to target all compilers and Cabal.
My only concern is that some projects have obj/ dirs containing very important sources (3D object models, etc) so we will need to be a bit careful in the implementation of clean.
True. I would have thought that few of these projects put Haskell sources at the root level, then their important objects underneath. However, if we restrict to cleaning .hi, .hbc etc we should be ok. At the moment there is no yhc clean command, so it can be done later.
Also, when you say 3kb yhc-specific - how much of that relates to invoking yhc, and how much is for building yhc?
That all relates to invoking Yhc on Haskell files. This mainly involves building a list of dependent modules, then extracting rules from this dependency information. The make library is already in the tree (src/libraries/make), and I'll hopefully have committed the Make2.hs tonight. Thanks Neil
participants (2)
-
Neil Mitchell
-
Stefan O'Rear