diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index ae4bdfd575b..5978d8665d0 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -238,7 +238,7 @@ stdenv.mkDerivation { # compile, because it uses "#include_next " to find the # limits.h file in ../includes-fixed. To remedy the problem, # another -idirafter is necessary to add that directory again. - echo "-B${libc_lib}/lib/ -idirafter ${libc_dev}/include -idirafter ${cc}/lib/gcc/*/*/include-fixed" > $out/nix-support/libc-cflags + echo "-B${libc_lib}/lib/ -idirafter ${libc_dev}/include ${optionalString isGNU "-idirafter ${cc}/lib/gcc/*/*/include-fixed"}" > $out/nix-support/libc-cflags echo "${libc_lib}" > $out/nix-support/orig-libc echo "${libc_dev}" > $out/nix-support/orig-libc-dev diff --git a/pkgs/development/compilers/llvm/multi.nix b/pkgs/development/compilers/llvm/multi.nix new file mode 100644 index 00000000000..0fa0eb3404d --- /dev/null +++ b/pkgs/development/compilers/llvm/multi.nix @@ -0,0 +1,44 @@ +{ runCommand, +clang, +gcc64, +gcc32, +glibc_multi +}: + +let + combine = basegcc: runCommand "combine-gcc-libc" {} '' + mkdir -p $out + cp -r ${basegcc.cc}/lib $out/lib + + chmod u+rw -R $out/lib + cp -r ${basegcc.libc}/lib/* $(ls -d $out/lib/gcc/*/*) + ''; + gcc_multi_sysroot = runCommand "gcc-multi-sysroot" {} '' + mkdir -p $out/lib/gcc + + ln -s ${combine gcc64}/lib/gcc/* $out/lib/gcc/ + ln -s ${combine gcc32}/lib/gcc/* $out/lib/gcc/ + # XXX: This shouldn't be needed, clang just doesn't look for "i686-unknown" + ln -s $out/lib/gcc/i686-unknown-linux-gnu $out/lib/gcc/i686-pc-linux-gnu + + + # includes + ln -s ${glibc_multi.dev}/include $out/ + + # dynamic linkers + mkdir -p $out/lib/32 + ln -s ${glibc_multi.out}/lib/ld-linux* $out/lib + ln -s ${glibc_multi.out}/lib/32/ld-linux* $out/lib/32/ + ''; + + clangMulti = clang.override { + # Only used for providing expected structure re:dynamic linkers, AFAIK + # Most of the magic is done by setting the --gcc-toolchain option below + libc = gcc_multi_sysroot; + + extraBuildCommands = '' + sed -e '$a --gcc-toolchain=${gcc_multi_sysroot}' -i $out/nix-support/libc-cflags + ''; + }; + +in clangMulti diff --git a/pkgs/development/libraries/qt-4.x/4.8/default.nix b/pkgs/development/libraries/qt-4.x/4.8/default.nix index a73f63bfb4b..a54860ff0ac 100644 --- a/pkgs/development/libraries/qt-4.x/4.8/default.nix +++ b/pkgs/development/libraries/qt-4.x/4.8/default.nix @@ -128,7 +128,7 @@ stdenv.mkDerivation rec { postConfigure = '' echo "applying patch ${./parallel-build.patch}" - patch -p1 -i ${./parallel-build.patch} + patch -p1 < ${./parallel-build.patch} ''; prefixKey = "-prefix "; diff --git a/pkgs/development/libraries/qt-4.x/4.8/parallel-build.patch b/pkgs/development/libraries/qt-4.x/4.8/parallel-build.patch index d471bb2a665..5783543e844 100644 --- a/pkgs/development/libraries/qt-4.x/4.8/parallel-build.patch +++ b/pkgs/development/libraries/qt-4.x/4.8/parallel-build.patch @@ -1,6 +1,6 @@ --- a/tools/designer/src/lib/Makefile +++ b/tools/designer/src/lib/Makefile @@ -7167,2 +7167,3 @@ compiler_moc_header_clean: - .uic/release-shared/ui_qtgradientviewdialog.h \ -+ .uic/release-shared/ui_qtgradientview.h \ - ../../../shared/qtgradienteditor/qtgradientviewdialog.h + .uic/release-shared/ui_qtgradientviewdialog.h \ ++ .uic/release-shared/ui_qtgradientview.h \ + ../../../shared/qtgradienteditor/qtgradientviewdialog.h diff --git a/pkgs/test/cc-wrapper/multilib.nix b/pkgs/test/cc-wrapper/multilib.nix new file mode 100644 index 00000000000..5ea50b5eb26 --- /dev/null +++ b/pkgs/test/cc-wrapper/multilib.nix @@ -0,0 +1,37 @@ +{ stdenv }: + +stdenv.mkDerivation { + name = "cc-multilib-test"; + + # XXX: "depend" on cc-wrapper test? + + # TODO: Have tests report pointer size or something; ensure they are what we asked for + buildCommand = '' + NIX_DEBUG=1 $CC -v + NIX_DEBUG=1 $CXX -v + + printf "checking whether compiler builds valid C binaries... " >&2 + $CC -o cc-check ${./cc-main.c} + ./cc-check + + printf "checking whether compiler builds valid 32bit C binaries... " >&2 + $CC -m32 -o c32-check ${./cc-main.c} + ./c32-check + + printf "checking whether compiler builds valid 64bit C binaries... " >&2 + $CC -m64 -o c64-check ${./cc-main.c} + ./c64-check + + printf "checking whether compiler builds valid 32bit C++ binaries... " >&2 + $CXX -m32 -o cxx32-check ${./cxx-main.cc} + ./cxx32-check + + printf "checking whether compiler builds valid 64bit C++ binaries... " >&2 + $CXX -m64 -o cxx64-check ${./cxx-main.cc} + ./cxx64-check + + touch $out + ''; + + meta.platforms = stdenv.lib.platforms.x86_64; +} diff --git a/pkgs/tools/networking/curl/default.nix b/pkgs/tools/networking/curl/default.nix index 7f8d50b6d89..c356a307e3e 100644 --- a/pkgs/tools/networking/curl/default.nix +++ b/pkgs/tools/networking/curl/default.nix @@ -8,6 +8,7 @@ , scpSupport ? false, libssh2 ? null , gssSupport ? false, gss ? null , c-aresSupport ? false, c-ares ? null +, brotliSupport ? false, brotli ? null }: assert http2Support -> nghttp2 != null; @@ -19,6 +20,7 @@ assert !(gnutlsSupport && sslSupport); assert gnutlsSupport -> gnutls != null; assert scpSupport -> libssh2 != null; assert c-aresSupport -> c-ares != null; +assert brotliSupport -> brotli != null; stdenv.mkDerivation rec { name = "curl-7.57.0"; @@ -47,7 +49,8 @@ stdenv.mkDerivation rec { optional c-aresSupport c-ares ++ optional sslSupport openssl ++ optional gnutlsSupport gnutls ++ - optional scpSupport libssh2; + optional scpSupport libssh2 ++ + optional brotliSupport brotli; # for the second line see https://curl.haxx.se/mail/tracker-2014-03/0087.html preConfigure = '' @@ -64,6 +67,7 @@ stdenv.mkDerivation rec { ( if ldapSupport then "--enable-ldap" else "--disable-ldap" ) ( if ldapSupport then "--enable-ldaps" else "--disable-ldaps" ) ( if idnSupport then "--with-libidn=${libidn.dev}" else "--without-libidn" ) + ( if brotliSupport then "--with-brotli" else "--without-brotli" ) ] ++ stdenv.lib.optional c-aresSupport "--enable-ares=${c-ares}" ++ stdenv.lib.optional gssSupport "--with-gssapi=${gss}"; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 2e90f94ab58..ed944759871 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -1639,6 +1639,7 @@ with pkgs; idnSupport = true; ldapSupport = true; gssSupport = true; + brotliSupport = true; }; curl = callPackage ../tools/networking/curl rec { @@ -5585,7 +5586,20 @@ with pkgs; ''; }) else throw "Multilib ${cc.name} not supported on ‘${system}’"; + wrapClangMulti = clang: + if system == "x86_64-linux" then + callPackages ../development/compilers/llvm/multi.nix { + inherit clang; + gcc32 = pkgsi686Linux.gcc; + gcc64 = pkgs.gcc; + } + else throw "Multilib ${clang.cc.name} not supported on '${system}'"; + gcc_multi = wrapCCMulti gcc; + clang_multi = wrapClangMulti clang; + + gccMultiStdenv = overrideCC stdenv gcc_multi; + clangMultiStdenv = overrideCC stdenv clang_multi; gcc_debug = lowPrio (wrapCC (gcc.cc.override { stripped = false; @@ -20077,6 +20091,9 @@ with pkgs; cc-wrapper-libcxx-5 = callPackage ../test/cc-wrapper { stdenv = llvmPackages_5.libcxxStdenv; }; stdenv-inputs = callPackage ../test/stdenv-inputs { }; + cc-multilib-gcc = callPackage ../test/cc-wrapper/multilib.nix { stdenv = gccMultiStdenv; }; + cc-multilib-clang = callPackage ../test/cc-wrapper/multilib.nix { stdenv = clangMultiStdenv; }; + macOSSierraShared = callPackage ../test/macos-sierra-shared {}; }; diff --git a/pkgs/top-level/release.nix b/pkgs/top-level/release.nix index 8cbb7063b4e..201c3a38cf8 100644 --- a/pkgs/top-level/release.nix +++ b/pkgs/top-level/release.nix @@ -112,6 +112,8 @@ let jobs.tests.cc-wrapper-clang-39.x86_64-darwin jobs.tests.cc-wrapper-libcxx-39.x86_64-linux jobs.tests.cc-wrapper-libcxx-39.x86_64-darwin + jobs.tests.cc-multilib-gcc.x86_64-linux + jobs.tests.cc-multilib-clang.x86_64-linux jobs.tests.stdenv-inputs.x86_64-linux jobs.tests.stdenv-inputs.x86_64-darwin jobs.tests.macOSSierraShared.x86_64-darwin