Parallel building multiple targets

John Lato jwlato at gmail.com
Thu Jan 23 18:22:47 UTC 2014


On Jan 23, 2014 1:28 AM, "Simon Marlow" <marlowsd at gmail.com> wrote:
>
> On 23/01/14 03:52, John Lato wrote:
>
>> However, these are all rather obviously fixable as part of the build
>> system.  For me, the worst problems have to do with cleaning.  If you're
>> using a Makefile, typically you want to leave intermediate object files
>> around and only rebuild them when the sources have changed.  However,
>> there are various issues with ghc batch-mode that make this difficult
>> (e.g. https://ghc.haskell.org/trac/ghc/ticket/8029 ).  The workarounds
>> to deal with this are not as straightforward.  The alternative is to
>> live with the occasional build error that can only be fixed by blowing
>> away the entire build dir (a remedy that I often need with ghc's source
>> tree, as even make maintainer-clean doesn't always cut it.  Hopefully my
>> experience here is unique, but I do not believe it is).
>
>
> You said "various issues", but you've only mentioned *one* specific issue
so far: #8029, and we concluded that was not a bug, although I do see how
it could require manually deleting a .hi file if you have a module that
shadows a package module and then remove it.  This seems a rare occurrence
to me, but perhaps it is something you do often.  If it really hurts, then
you could have a way to tell your build system about a file when it is
removed from the project, so that it can delete the build artifacts that go
with it.

It seems uncommon until you're developing in a branch that does so, and try
to go back and forth between that branch and another.

>
> Anyway, are there other problems you'd like to bring to our attention?

If the one bug I linked to earlier is to be closed as "not a bug" (seems
correct to me), there doesn't seem much point to raising other issues
relating to out-of-date intermediate files.  The general solution is
exactly as you suggested, leading to an increasingly baroque build system.

I don't think any of this detracts from my original thrust, which is that
something that looks like an afternoon's work is much more complicated.
Plus, you'll end up fighting with/hacking on a build system instead of what
you meant to work on.

>
> Cheers,
> Simon
>
>
>
>
>
>> Also, the most common use case seems to be for parallel building of
>> modules.  As ghc-7.8 provides this with --make, I'd expect the demand
>> for ghc -M will be greatly reduced.  That's why I'm not certain it's
>> worth the time it would take to resolve these issues.
>>
>> Cheers,
>> John
>>
>>
>>     Cheers,
>>     Simon
>>
>>
>>
>>        For an example of some of the extra steps necessary to make
>>
>>         something like this work, see e.g.
>>         https://github.com/nh2/__multishake
>>
>>         <https://github.com/nh2/multishake> (which is admittedly for a
more
>>         complicated setup, and also has some issues).  The especially
>>         frustrating part is, just when you think you have everything
>>         working,
>>         someone wants to add some other tool to a workflow (hsc2hs, .cmm
>>         files,
>>         etc), and your build system doesn't support it.
>>
>>         ghc --make doesn't allow building several binaries in one run,
>>         however
>>         if you use cabal all the separate runs will use a shared build
>>         directory, so subsequent builds will be able to take advantage
>>         of the
>>         intermediate output of the first build.  Of course you could do
>>         the same
>>         without cabal, but it's a convenient way to create a common build
>>         directory and manage multiple targets.  This is the approach I
would
>>         take to building multiple executables from the same source files.
>>
>>         ghc doesn't do any locking of build files AFAIK.  Running
>>         parallel ghc
>>         commands for two main modules that have the same import, using
>>         the same
>>         working directory, is not safe.  In pathological cases the two
>>         different
>>         main modules may even generate different code *for the imported
>>         module*.
>>            This sort of situation can arise with the IncoherentInstances
>>         extension, for example.
>>
>>         The obvious approach is of course to make a library out of your
>>         common
>>         files.  This has the downsides of requiring a bit more work on
the
>>         developer's part, but if the common files are relatively stable
>>         it'll
>>         probably lead to the fastest builds of your executables.  Also
>>         in this
>>         case you could run multiple `ghc --make`s in parallel, using
>>         different
>>         build directories, since they won't be rebuilding any common
code.
>>
>>         John L.
>>
>>         On Sun, Jan 5, 2014 at 1:47 PM, Sami Liedes <sami.liedes at iki.fi
>>         <mailto:sami.liedes at iki.fi>
>>         <mailto:sami.liedes at iki.fi <mailto:sami.liedes at iki.fi>>> wrote:
>>
>>              Hi,
>>
>>              I have a Haskell project where a number of executables are
>>         produced
>>              from mostly the same modules. I'm using a Makefile to
>>         enable parallel
>>              builds. I received advice[1] that ghc -M is broken, but
>>         that there
>>              is parallel ghc --make in HEAD.
>>
>>              As far as I can tell, ghc --make does not allow building
>>         several
>>              binaries in one run, so I think it may not still be a full
>>         replacement
>>              for Makefiles.
>>
>>              However I have a question about ghc --make that is also
>>         relevant
>>              without parallel ghc --make:
>>
>>              If I have two main modules, prog1.hs and prog2.hs, which
>>         have mutual
>>              dependencies (for example, both import A from A.hs), is it
>>         safe to run
>>              "ghc --make prog1" in parallel with "ghc --make prog2"?
>>         IOW, is there
>>              some kind of locking to prevent both from building module A
>>         at the
>>              same time and interfering with each other?
>>
>>              Is there a good way (either in current releases or HEAD) to
>>         build
>>              multiple binaries partially from the same sources in
parallel?
>>
>>                       Sami
>>
>>
>>              [1]
>>
http://stackoverflow.com/__questions/20938894/generating-__correct-link-dependencies-for-__ghc-and-makefile-style-builds
>>         <
http://stackoverflow.com/questions/20938894/generating-correct-link-dependencies-for-ghc-and-makefile-style-builds
>
>>
>>              _________________________________________________
>>              Glasgow-haskell-users mailing list
>>         Glasgow-haskell-users at haskell.__org
>>         <mailto:Glasgow-haskell-users at haskell.org>
>>              <mailto:Glasgow-haskell-users at __haskell.org
>>         <mailto:Glasgow-haskell-users at haskell.org>>
>>         http://www.haskell.org/__mailman/listinfo/glasgow-__haskell-users<
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users>
>>
>>
>>
>>
>>
>>         _________________________________________________
>>         Glasgow-haskell-users mailing list
>>         Glasgow-haskell-users at haskell.__org
>>         <mailto:Glasgow-haskell-users at haskell.org>
>>         http://www.haskell.org/__mailman/listinfo/glasgow-__haskell-users<
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/glasgow-haskell-users/attachments/20140123/cae6db93/attachment.html>


More information about the Glasgow-haskell-users mailing list