NixOS / nixpkgs

Nix Packages collection & NixOS
MIT License
17.34k stars 13.58k forks source link

pkgsi686Linux.qt5.qtbase fails to build #63829

Closed tadeokondrak closed 5 years ago

tadeokondrak commented 5 years ago

Issue description

Seems to be related to #36946/#36947. Makes it so I can't use wine, which depends on it for some reason

.obj/qpathsimplifier.o:qpathsimplifier.cpp:function (anonymous namespace)::PathSimplifier::intersectNodes(QDataBuffer<(anonymous namespace)::PathSimplifier::Element*>&, (anonymous namespace)::PathSimplifier::BoundingVolumeHierarchy::Node*, (anonymous namespace)::PathSimplifier::BoundingVolumeHierarchy::Node*): error: undefined reference to '__divmoddi4'
.obj/qpathsimplifier.o:qpathsimplifier.cpp:function (anonymous namespace)::PathSimplifier::intersectNodes(QDataBuffer<(anonymous namespace)::PathSimplifier::Element*>&, (anonymous namespace)::PathSimplifier::BoundingVolumeHierarchy::Node*, (anonymous namespace)::PathSimplifier::BoundingVolumeHierarchy::Node*): error: undefined reference to '__divmoddi4'
.obj/qpathsimplifier.o:qpathsimplifier.cpp:function (anonymous namespace)::PathSimplifier::intersectNodes(QDataBuffer<(anonymous namespace)::PathSimplifier::Element*>&, (anonymous namespace)::PathSimplifier::BoundingVolumeHierarchy::Node*, (anonymous namespace)::PathSimplifier::BoundingVolumeHierarchy::Node*): error: undefined reference to '__divmoddi4'
.obj/qpathsimplifier.o:qpathsimplifier.cpp:function (anonymous namespace)::PathSimplifier::intersectNodes(QDataBuffer<(anonymous namespace)::PathSimplifier::Element*>&, (anonymous namespace)::PathSimplifier::BoundingVolumeHierarchy::Node*, (anonymous namespace)::PathSimplifier::BoundingVolumeHierarchy::Node*): error: undefined reference to '__divmoddi4'
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:1312: ../../lib/libQt5Gui.so.5.12.0] Error 1
make[2]: Leaving directory '/build/qtbase-everywhere-src-5.12.0/src/gui'
make[1]: *** [Makefile:448: sub-gui-make_first] Error 2
make[1]: Leaving directory '/build/qtbase-everywhere-src-5.12.0/src'
make: *** [Makefile:49: sub-src-make_first] Error 2
builder for '/nix/store/y37l40jih7j4db0n8x9mn0digdxcyp61-qtbase-5.12.0.drv' failed with exit code 2
error: build of '/nix/store/y37l40jih7j4db0n8x9mn0digdxcyp61-qtbase-5.12.0.drv' failed

Steps to reproduce

Technical details

Please run nix-shell -p nix-info --run "nix-info -m" and paste the results.

nyanloutre commented 5 years ago

Got the same error when rebuilding my system on nixos-unstable channel

relevant log: https://hydra.nixos.org/build/95394915/nixlog/1

matthewbauer commented 5 years ago

I think previously this was fixed by using gcc6 instead of gcc7. Something like this for qtbase:

 // (stdenv.lib.optionalAttrs (stdenv.cc.isGNU && stdenv.hostPlatform.isi686) {
      stdenv = overrideCC stdenv gcc6; # with gcc-7: undefined reference to `__divmoddi4'
    }))
alexarice commented 5 years ago

I am also having this problem. I have bisected it to 1a6e572529595d146a259fa433785ebb3215d8d2

coreyoconnor commented 5 years ago

I attempted to apply @matthewbauer 's suggestion to only qt packages. The failure is the same. Perhaps a dependency also needs to compile with gcc6? Is there a way to default the i686 packages to gcc6?

vcunat commented 5 years ago
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -7241,7 +7241,7 @@ in
   gerbil-unstable = callPackage ../development/compilers/gerbil/unstable.nix { stdenv = gccStdenv; };

   gccFun = callPackage ../development/compilers/gcc/7;
-  gcc = gcc7;
+  gcc = if stdenv.isi686 then gcc6 else gcc7;
   gcc-unwrapped = gcc.cc;

   gccStdenv = if stdenv.cc.isGNU then stdenv else stdenv.override {

Maybe that would be a usable workaround. EDIT: at least it does make pkgsi686Linux.qt5.qtbase build again (for me).

In any case, more in-depth discussion of this was in https://github.com/NixOS/nixpkgs/issues/36947

coreyoconnor commented 5 years ago

@vcunat that worked for almost everything. Except packages using -Wno-error=pointer-compare. That causes a failure. EG: dhcp:

configure:3799: checking whether the C compiler works                                                                                                                     
configure:3821: gcc    conftest.c  >&5                                                                                                                                    
cc1: error: -Werror=pointer-compare: no option -Wpointer-compare                                                                                                          
configure:3825: $? = 1                                                                                                                                                    
configure:3863: result: no                                                                                                                                                
configure: failed program was:                                                                                                                                            
| /* confdefs.h */                                                                                                                                                        
| #define PACKAGE_NAME "DHCP"                                                                                                                                             
| #define PACKAGE_TARNAME "dhcp"                                                                                                                                          
| #define PACKAGE_VERSION "4.4.1"                                                                                                                                         
| #define PACKAGE_STRING "DHCP 4.4.1"                                                                                                                                     
<snip>

I've overrideAttr the dhcp to confirm. There are ~10 other derivations using that warning. Is it necessary to override each individually?

Shados commented 5 years ago

@tadeokondrak FWIW, wine.override { gstreamerSupport = false; } works around this, assuming you don't need gstreamer support of course...

avnik commented 5 years ago

@Shados gstreamerSupport in wine cause more problems than solve (concretely -- wrapper with gstreamer specific variables for wine64), but it completely unrelated for this case

Shados commented 5 years ago

@avnik it is unrelated to the ultimate cause, yes. It is still a useful workaround for the symptom that tadeokondrak was dealing with (being unable to build wine). I mis-judged whether or not that would be clear from context...

sjau commented 5 years ago

qtbase still fails to build on latest unstable and latest unstable-small.

matthewbauer commented 5 years ago

@vcunat Perhaps we can use that fix for now? Otherwise I'm not sure how to handle it without breaking something else.

JohnAZoidberg commented 5 years ago

That might solve on symptom of the problem but not the root cause. If I try to build wine on my x64 machine it wants to build some version of qtbase and that fails. Even with vcunat's patch it doesn't build.

coreyoconnor commented 5 years ago

I was able to compile (almost) the full plasma 5 desktop with:

--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -7241,7 +7241,7 @@ in
   gerbil-unstable = callPackage ../development/compilers/gerbil/unstable.nix { stdenv = gccStdenv; };

   gccFun = callPackage ../development/compilers/gcc/7;
-  gcc = gcc7;
+  gcc = if stdenv.isi686 then gcc6 else gcc7;
   gcc-unwrapped = gcc.cc;

   gccStdenv = if stdenv.cc.isGNU then stdenv else stdenv.override {

To get everything to build required some application of:

However, while that passes the plasma5 test on my branch I can't actually get plasma to run on my desktop. Nor can I get many QT apps to run. Those issues may be regressions from #64720 until that's verified I'm reluctant to open a PR with those workarounds.

Tho compiling and failing is better than not compiling for dev I suppose...