Hia! Before asking my questions I'll setup the scene first.
The scene: I'm playing with cross-compiler support in guix. [ x86_64 -> alpha target as an example with this tiny patch: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=25799 ] I've stumbled upon the two cases: working[1] and non-working[2]. [1] working: $ ./pre-inst-env guix build --check re2c --target=alpha-unknown-linux-gnu --no-grafts ... /gnu/store/15ibxf5xzcqzfx0xgb5s6qa5z2ah3avg-re2c-0.16 $ file /gnu/store/15ibxf5xzcqzfx0xgb5s6qa5z2ah3avg-re2c-0.16/bin/re2c /gnu/store/15ibxf5xzcqzfx0xgb5s6qa5z2ah3avg-re2c-0.16/bin/re2c: ELF 64-bit LSB executable, Works as expected. [2] non-working: $ ./pre-inst-env guix build --check re2 --target=alpha-unknown-linux-gnu --no-grafts ... /gnu/store/mg474j0gx56fdl6wrpaxxxwsdknl7k2i-re2-2017-01-01 $ file /gnu/store/mg474j0gx56fdl6wrpaxxxwsdknl7k2i-re2-2017-01-01/lib/libre2.so.0.0.0 /gnu/store/mg474j0gx56fdl6wrpaxxxwsdknl7k2i-re2-2017-01-01/lib/libre2.so.0.0.0: ELF 64-bit LSB shared object, x86-64 It seems that re2 derivation ignores --target and builds it's library with host compiler, not target compiler. Relevant re2 package snippet from http://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/regex.scm#n27 (build-system gnu-build-system) (arguments `(#:test-target "test" ;; There is no configure step, but the Makefile respects a prefix. #:make-flags (list (string-append "prefix=" %output)) #:phases (modify-phases %standard-phases (delete 'configure) As we see here definition skips ./configure step (that's ok) and does not pass CXX=${target}-g++ to make flag. I wonder what are the possible options to override CXX here? Makefile for re2 is very straightforward: CXX?=g++ ... obj/%.o: %.cc $(HFILES) <tab>@mkdir -p $$(dirname $@) <tab>$(CXX) -c -o $@ $(CPPFLAGS) $(RE2_CXXFLAGS) $(CXXFLAGS) -DNDEBUG $*.cc ... obj/so/libre2.$(SOEXT): $(SOFILES) <tab>@mkdir -p obj/so <tab>$(MAKE_SHARED_LIBRARY) -o obj/so/libre2.$(SOEXTVER) $(SOFILES) <tab>ln -sf libre2.$(SOEXTVER) $@ Question time: - Is there a way to run 'guix environment --target=' in the same way as 'guix build --target=' sets it up? I'd like to see how both compilers are supposed to be present in there. - Why default g++ in PATH is the host g++ and not target g++? Target seems to make most sense if no explicit compiler is specified. - How to actually set CXX to point to target g++? It looks like implicitly there already both host (through native-inputs) and target (through build-inputs) compilers available. I would expect something like #:make-flags (list (string-append "CXX=" <.?.>)) What should be in place of that "<.?.>" to refer to target g++? Thank you! -- Sergei
pgpvC797eBwEl.pgp
Description: Цифровая подпись OpenPGP