<div dir="ltr">Thanks for the detailed explanations. A few thoughts here:<div><br></div><div>Having multiple "configurations" of the source tree (in that some parts of it may be missing or not) does not sound like a good idea, it just seems like additional complexity for no particular reason. AFAIU, it means that if I check out additional libraries into my repository (or build those libraries somehow?), tests for other packages might start failing, which is weird.</div><div><br></div><div>It sounds like the current decision of keeping "random" and a few other packages not built is rather ad hoc. Is that the case?<br></div><div><br></div><div>Ideally there would be one ghc testsuite that would always include all tests (when a faster test run is desired, a more generic mechanism of test filtering should be used, some test suites react to a "fast" flag, right?). If there are tests that we do not want to run as part of the global test suite, it seems that they should live together with the library implementation then and be maintained there, separately from ghc.</div><div><br></div><div>What's the compilation cost of the additional libraries relative to the complete build? (If you don't know off the bat, how do I get them built to measure the overhead?) Is it really significant? If it is, can we split off related tests? If it isn't, let's just enable them by default.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 30, 2014 at 10:19 PM, Austin Seipp <span dir="ltr"><<a href="mailto:austin@well-typed.com" target="_blank">austin@well-typed.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Thu, Oct 30, 2014 at 6:48 AM, Gintautas Miliauskas<br>
<<a href="mailto:gintautas.miliauskas@gmail.com">gintautas.miliauskas@gmail.com</a>> wrote:<br>
> Going through some validate.sh results, I found compilation errors due to<br>
> missing libraries, like this one:<br>
><br>
> =====> stm052(normal) 4088 of 4108 [0, 21, 0]<br>
> cd ../../libraries/stm/tests &&<br>
> 'C:/msys64/home/Gintas/ghc/bindisttest/install   dir/bin/ghc.exe'<br>
> -fforce-recomp -dcore-lint -dcmm-lint -dno-debug-output -no-user-package-db<br>
> -rtsopt<br>
> s -fno-warn-tabs -fno-ghci-history -o stm052 stm052.hs  -package stm<br>
>>stm052.comp.stderr 2>&1<br>
> Compile failed (status 256) errors were:<br>
><br>
> stm052.hs:10:8:<br>
>     Could not find module ‘System.Random’<br>
>     Use -v to see a list of the files searched for.<br>
><br>
> I was surprised to see that these are not listed in the test summary at the<br>
> end of the test run, but only counted towards the "X had missing libraries"<br>
> row. That setup makes it really easy to miss them, and I can't think of a<br>
> good reason to sweep such tests under the rug; a broken test is a failing<br>
> test.<br>
<br>
</span>Actually, these tests aren't broken in the way you think :) It's a bit<br>
long-winded to explain...<br>
<br>
Basically, GHC can, if you let it, build extra dependencies in its<br>
build process, one of which is the 'random' library. 'random' was not<br>
ever a true requirement to build GHC (aka a 'bootlib' as we call<br>
them). So why is this test here?<br>
<br>
Because 'random' was actually a dependency of the Data Parallel<br>
Haskell package, and until not too long ago (earlier this year),<br>
`./validate` built and compiled DPH - with all its dependencies;<br>
random, vector, primitive - by default. This actually adds a pretty<br>
noticeable time to the build (you are compiling 5-8 more libraries<br>
after all), and at the time, DPH was also not ready for the<br>
Applicative-Monad patch. So we turned it off, as well as the<br>
dependencies.<br>
<br>
Additionally, GHC does have some 'extra' libraries which you can<br>
optionally build during the build process, but which are turned off by<br>
default. Originally this was because the weirdo './sync-all' script<br>
used to not need everything, and 'stm' was a library that wasn't<br>
cloned by default.<br>
<br>
Now that we've submoduleified everything though, these tests and the<br>
extra libraries could be built by default. Which we could certainly<br>
do.<br>
<span class=""><br>
> How about at least listing such failed tests in the list of failed tests of<br>
> the end?<br>
<br>
</span>I'd probably be OK with this.<br>
<span class=""><br>
> At least in this case the error does not seem to be due to some missing<br>
> external dependencies (which probably would not be a great idea anyway...).<br>
> The test does pass if I remove the "-no-user-package-db" argument. What was<br>
> the intention here? Does packaging work somehow differently on Linux? (I'm<br>
> currently testing on Windows.)<br>
<br>
</span>I'm just guessing but, I imagine you really don't want to remove<br>
'-no-user-package-db' at all, for any platform, otherwise Weird Things<br>
Might Happen, I'd assume.<br>
<br>
The TL;DR here is that when you build a copy of GHC and all the<br>
libraries, it actually *does* register the built packages for the<br>
compiler... this always happens, *even if you do not install it*. The<br>
primary 'global' package DB just sits in tree instead, under<br>
./inplace.<br>
<br>
When you run ./validate, what happens is that after the build, we<br>
actually create a binary distribution and then test *that* compiler<br>
instead, as you can see (obviously for a good reason - broken bindists<br>
would be bad). The binary distribution obviously has its own set of<br>
binary packages it came with; those are the packages you built into it<br>
after all. The reason we tell GHC to ignore the user package db here<br>
is precisely because we *do not* want to pick it up! We only want to<br>
test the binary distribution with the packages *it* has.<br>
<br>
Now you might say, well, Austin, the version numbers are different!<br>
How would it pick that up? Not always... What if I built a copy of GHC<br>
HEAD today, then built something with it using Cabal? Then that will<br>
install into my user package database. Now I go back to my GHC tree<br>
and hack away _on the same day_ and run './validate'... the version<br>
number hasn't changed *at all* because it's date based, meaning the<br>
binary distribution could certainly pick up the previously installed<br>
libraries, which I installed via the older compiler. But I don't want<br>
that! I only want to run those tests with the compiler I'm validating<br>
*now*.<br>
<br>
I imagine the reason you see this test pass if you remove this<br>
argument is precisely for this reason: it doesn't fail because it's<br>
picking up a package database in your existing environment. But that's<br>
really, really not what you want (I'd be surprised if it worked and<br>
didn't result in some horrible error or crash).<br>
<span class=""><br>
> On a related note, how about separating test failures from failing<br>
> performance tests ("stat too good" / "stat not good enough")? The latter are<br>
> important, but they seem to be much more prone to fail without good reason.<br>
> Perhaps do some color coding of the test runner output? That would also<br>
> help.<br>
<br>
</span>I also think this is a good idea.<br>
<span class="HOEnZb"><font color="#888888"><br>
> --<br>
> Gintautas Miliauskas<br>
><br>
> _______________________________________________<br>
> ghc-devs mailing list<br>
> <a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a><br>
> <a href="http://www.haskell.org/mailman/listinfo/ghc-devs" target="_blank">http://www.haskell.org/mailman/listinfo/ghc-devs</a><br>
><br>
<br>
--<br>
Regards,<br>
<br>
Austin Seipp, Haskell Consultant<br>
Well-Typed LLP, <a href="http://www.well-typed.com/" target="_blank">http://www.well-typed.com/</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Gintautas Miliauskas</div>
</div>