Skip to content

Commit

Permalink
Merge pull request #66613 from transumption-unstable/201908/rust-win3…
Browse files Browse the repository at this point in the history
…2-cross

 buildRustPackage: support cross-compilation to x86_64-pc-mingw32
  • Loading branch information
Ericson2314 authored Aug 15, 2019
2 parents aa9d7ee + da3da08 commit d13a1bc
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 58 deletions.
22 changes: 15 additions & 7 deletions pkgs/build-support/rust/default.nix
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{ stdenv, cacert, git, cargo, rustc, fetchcargo, buildPackages }:
{ stdenv, cacert, git, cargo, rustc, fetchcargo, buildPackages, windows }:

{ name ? "${args.pname}-${args.version}"
, cargoSha256 ? "unset"
Expand Down Expand Up @@ -41,18 +41,26 @@ let
cargoDepsCopy="$sourceRoot/${cargoVendorDir}"
'';

hostConfig = stdenv.hostPlatform.config;

rustHostConfig = {
"x86_64-pc-mingw32" = "x86_64-pc-windows-gnu";
}."${hostConfig}" or hostConfig;

ccForBuild="${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}cc";
cxxForBuild="${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}c++";
ccForHost="${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc";
cxxForHost="${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++";
releaseDir = "target/${stdenv.hostPlatform.config}/${buildType}";
in stdenv.mkDerivation (args // {
releaseDir = "target/${rustHostConfig}/${buildType}";
in

stdenv.mkDerivation (args // {
inherit cargoDeps;

patchRegistryDeps = ./patch-registry-deps;

nativeBuildInputs = [ cargo rustc git cacert ] ++ nativeBuildInputs;
inherit buildInputs;
nativeBuildInputs = nativeBuildInputs ++ [ cacert git cargo rustc ];
buildInputs = buildInputs ++ stdenv.lib.optional stdenv.hostPlatform.isMinGW windows.pthreads;

patches = cargoPatches ++ patches;

Expand Down Expand Up @@ -84,7 +92,7 @@ in stdenv.mkDerivation (args // {
[target."${stdenv.buildPlatform.config}"]
"linker" = "${ccForBuild}"
${stdenv.lib.optionalString (stdenv.buildPlatform.config != stdenv.hostPlatform.config) ''
[target."${stdenv.hostPlatform.config}"]
[target."${rustHostConfig}"]
"linker" = "${ccForHost}"
''}
EOF
Expand All @@ -104,7 +112,7 @@ in stdenv.mkDerivation (args // {
"CXX_${stdenv.hostPlatform.config}"="${cxxForHost}" \
cargo build \
${stdenv.lib.optionalString (buildType == "release") "--release"} \
--target ${stdenv.hostPlatform.config} \
--target ${rustHostConfig} \
--frozen ${concatStringsSep " " cargoBuildFlags}
)
Expand Down
70 changes: 19 additions & 51 deletions pkgs/os-specific/windows/pthread-w32/default.nix
Original file line number Diff line number Diff line change
@@ -1,61 +1,29 @@
{ fetchurl, stdenv, mingwrt }:
{ stdenv, fetchzip }:

# This file is tweaked for cross-compilation only.
assert stdenv.hostPlatform != stdenv.buildPlatform;
stdenv.mkDerivation rec {
name = "pthreads-w32-${version}";
version = "2.9.1";

stdenv.mkDerivation {
name = "pthread-w32-1.10.0";

src = fetchurl {
url = "ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-1-10-0-release.tar.gz";
sha256 = "1vllxxfa9a7mssb1x98a2r736vsv5ll3sjizbr7a8hw8j9p18j7n";
src = fetchzip {
url = "https://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.tar.gz";
sha256 = "1s8iny7g06z289ahdj0kzaxj0cd3wvjbd8j3bh9xlg7g444lhy9w";
};

configurePhase =
'' sed -i GNUmakefile \
-e 's/CC=gcc/CC=i686-pc-mingw32-gcc/g ;
s/windres/i686-pc-mingw32-windres/g ;
s/dlltool/i686-pc-mingw32-dlltool/g'
'';

buildInputs = [ mingwrt ];

buildPhase = "make GC"; # to build the GNU C dll with C cleanup code

installPhase =
'' mkdir -p "$out" "$out/include" "$out/lib"
cp -v *pthread*{dll,a} "$out/lib"
cp -v pthread.h semaphore.h sched.h "$out/include"
'';

postFixup =
# By default `mingw_headers' is propagated. Prevent that, because
# otherwise MinGW headers appear twice in `-I', and thus the
# "#include_next <float.h>" in MinGW's <float.h> picks up itself instead
# of picking up GCC's (hence, FLT_RADIX is left undefined, for instance.)
'' rm -f "$out/nix-support/propagated-build-inputs"
'';

meta = {
description = "POSIX threads for Woe32";
makeFlags = [ "CROSS=${stdenv.cc.targetPrefix}" "GC-static" ];

longDescription =
'' The POSIX 1003.1-2001 standard defines an application programming
interface (API) for writing multithreaded applications. This
interface is known more commonly as pthreads. A good number of
modern operating systems include a threading library of some kind:
Solaris (UI) threads, Win32 threads, DCE threads, DECthreads, or any
of the draft revisions of the pthreads standard. The trend is that
most of these systems are slowly adopting the pthreads standard API,
with application developers following suit to reduce porting woes.
installPhase = ''
runHook preInstall
Woe32 does not, and is unlikely to ever, support pthreads natively.
This project seeks to provide a freely available and high-quality
solution to this problem.
'';
install -D libpthreadGC2.a $out/lib/libpthread.a
homepage = http://sourceware.org/pthreads-win32/;
runHook postInstall
'';

license = stdenv.lib.licenses.lgpl21Plus;
meta = with stdenv.lib; {
description = "POSIX threads library for Windows";
homepage = "https://sourceware.org/pthreads-win32";
license = licenses.lgpl21Plus;
maintainers = with maintainers; [ yegortimoshenko ];
platforms = platforms.windows;
};
}

0 comments on commit d13a1bc

Please sign in to comment.