Greetings,

I have a simple use-case when developing Haskell. I have a library that
I hack on and in another place an executable which uses the library. I
have default.nix for both.

Consider the following:

/tmp/example/exec/{Main.hs,default.nix,Setup.hs,Executable.cabal}
/tmp/example/lib/{Library.hs,default.nix,Setup.hs,Library.cabal}

Library provides a simple message = "Library version 1"

All the main that's in separate package does is print the message. The
executable project depends on Library in cabal file and imports it in
default.nix.

Now I drop into a nix-shell --pure in exec. I am told this:

these derivations will be built:

/nix/store/haw37l5w9hqr7sglwfqash8r2jprwhla-haskell-Library-ghc7.6.3-0.1.0.0.drv
…

So far so good. Next I run

eval "$configurePhase" && eval "$buildPhase"

Still, good, it tells me Dependency Library -any: using Library-0.1.0.0

Now I go to test the produced binary:

[nix-shell:/tmp/example/exec]$ ./dist/build/Executable/Executable
"Library version 1"

OK, great!

Now I want to make changes in my library. I quit this shell and change
the message in my Library to "Library version 2". No changes necessary
to either cabal or nix files. After I'm happy with the change, I go back
into a shell in exec:

these derivations will be built:

/nix/store/04idz8675pr8pa97xk29msg4waa6820h-haskell-Library-ghc7.6.3-0.1.0.0.drv

Great, it seems to have noticed I made a change and is wanting to rebuild.

[nix-shell:/tmp/example/exec]$ ./dist/build/Executable/Executable
"Library version 2"

Sweet, as if by magic. Now for the weird thing. When developing a
library, we'll ofter run eval "$configurePhase" && eval "$buildPhase" in
it so we know it builds &c.

Let me do that now. I will go into ../lib, change the message to version
3 and eval configure and build phase.

Building Library-0.1.0.0...
Preprocessing library Library-0.1.0.0...
[1 of 1] Compiling Library          ( Library.hs, dist/build/Library.o )
In-place registering Library-0.1.0.0...
Running Haddock for Library-0.1.0.0...
Running hscolour for Library-0.1.0.0...
Preprocessing library Library-0.1.0.0...
Preprocessing library Library-0.1.0.0...
Warning: The documentation for the following packages are not installed. No
links will be generated to these packages: rts-1.0
Haddock coverage:
   0% (  0 /  2) in 'Library'
Documentation created: dist/doc/html/Library/index.html,
dist/doc/html/Library/Library.txt

[nix-shell:/tmp/example/lib]$ ls dist/
build  doc  package.conf.inplace  setup-config


So far all good. This is exactly as we have done before with the
difference that we run configure and build. Now I go back to my exec
project, it picks up on changes in Library and I run configure phase and
build phase.

[nix-shell:/tmp/example/exec]$ ./dist/build/Executable/Executable
"Library version 3"

OK, now I want to do more hacking in Library. I go and do it *but* I
forget or don't want to to run configure and build phases. I bump the
message version to 4. I re-enter exec shell, configure, build, run dist:

[nix-shell:/tmp/example/exec]$ ./dist/build/Executable/Executable
"Library version 3"

!!!!!

OK, very weird. Now it seems that no matter what I change, what ‘exec’
is somehow using is whatever the last version of Library was when I last
configure and built it. Why? Why oh why? I don't want to clobber my
dist/ in Library because rebuilding the whole thing might be a pain but
I'm pretty sure that it sure as hell shouldn't matter whether I ran
configure+build for other projects that use it so why does it? It seems
insane to me.

Here is my only guess at this: nix copies the lib directory to the store
which at that stage contains ‘dist’. When it builds the package, the old
‘dist’ is still there and anything else is snow using results of that
rather than results of the thing it just compiled. Am I correct? Who do
I run to in order to have this corrected?

I attach a tarball with the two nix projects I used in this example, it
should be very easy to replicate. Unpack to /tmp due to hardcoded paths.
It should be easy to replicate: run configure and build phases in lib,
make change to source, go into exec, configure, build, run.

-- 
Mateusz K.

Attachment: example.tar.gz
Description: GNU Zip compressed data

_______________________________________________
nix-dev mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-dev

Reply via email to