Merge pull request #45330 from symphorien/bindgen2

rustup: wrap bindgen to find header files in a nix-shell
This commit is contained in:
Jörg Thalheim 2018-08-30 13:12:03 +01:00 committed by GitHub
commit da11a26008
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 10 deletions

View File

@ -1,6 +1,4 @@
{ stdenv, fetchFromGitHub, rustPlatform, makeWrapper, llvmPackages }: { stdenv, fetchFromGitHub, fetchpatch, rustPlatform, clang, llvmPackages, rustfmt, writeScriptBin }:
# Future work: Automatically communicate NIX_CFLAGS_COMPILE to bindgen's tests and the bindgen executable itself.
rustPlatform.buildRustPackage rec { rustPlatform.buildRustPackage rec {
name = "rust-bindgen-${version}"; name = "rust-bindgen-${version}";
@ -13,23 +11,54 @@ rustPlatform.buildRustPackage rec {
sha256 = "0cqjr7qspjrfgqcp4nqxljmhhbqyijb2jpw3lajgjj48y6wrnw93"; sha256 = "0cqjr7qspjrfgqcp4nqxljmhhbqyijb2jpw3lajgjj48y6wrnw93";
}; };
nativeBuildInputs = [ makeWrapper ]; cargoSha256 = "0b8v6c7q1abibzygrigldpd31lyd5ngmj4vq5d7zni96m20mm85w";
buildInputs = [ llvmPackages.clang-unwrapped.lib ];
libclang = llvmPackages.libclang.lib; #for substituteAll
buildInputs = [ libclang ];
propagatedBuildInputs = [ clang ]; # to populate NIX_CXXSTDLIB_COMPILE
patches = [
# https://github.com/rust-lang-nursery/rust-bindgen/pull/1376
(fetchpatch {
url = https://github.com/rust-lang-nursery/rust-bindgen/commit/c8b5406f08af82a92bf8faf852c21ba941d9c176.patch;
sha256 = "16ibr2rplh0qz8rsq6gir45xlz5nasad4y8fprwhrb7ssv8wfkss";
})
];
configurePhase = '' configurePhase = ''
export LIBCLANG_PATH="${llvmPackages.clang-unwrapped.lib}/lib" export LIBCLANG_PATH="${libclang}/lib"
''; '';
postInstall = '' postInstall = ''
wrapProgram $out/bin/bindgen --set LIBCLANG_PATH "${llvmPackages.clang-unwrapped.lib}/lib" mv $out/bin/{bindgen,.bindgen-wrapped};
substituteAll ${./wrapper.sh} $out/bin/bindgen
chmod +x $out/bin/bindgen
''; '';
cargoSha256 = "0b8v6c7q1abibzygrigldpd31lyd5ngmj4vq5d7zni96m20mm85w"; doCheck = false; # half the tests fail because our rustfmt is not nightly enough
checkInputs =
doCheck = false; # A test fails because it can't find standard headers in NixOS let fakeRustup = writeScriptBin "rustup" ''
#!${stdenv.shell}
shift
shift
exec "$@"
'';
in [
rustfmt
fakeRustup # the test suite insists in calling `rustup run nightly rustfmt`
clang
];
meta = with stdenv.lib; { meta = with stdenv.lib; {
description = "C and C++ binding generator"; description = "C and C++ binding generator";
longDescription = ''
Bindgen takes a c or c++ header file and turns them into
rust ffi declarations.
As with most compiler related software, this will only work
inside a nix-shell with the required libraries as buildInputs.
'';
homepage = https://github.com/rust-lang-nursery/rust-bindgen; homepage = https://github.com/rust-lang-nursery/rust-bindgen;
license = with licenses; [ bsd3 ]; license = with licenses; [ bsd3 ];
maintainers = [ maintainers.ralith ]; maintainers = [ maintainers.ralith ];

View File

@ -0,0 +1,36 @@
#!/usr/bin/env bash
sep='--' # whether to add -- before new options
cxx=0 # whether cxx was explicitly requested
lastWasx=0 # whether the last argument passed was -x
for e in "$@"; do
if [[ "$e" == "--" ]]; then
sep=
fi;
if [[ "$sep" == "" ]]; then
# we look for -x c++ after -- only
if [[ "$e" == "-x" ]]; then
lastWasx=1
fi;
if [[ $lastWasx -eq 1 && "$e" == "c++" ]]; then
lastWasx=0
cxx=1
fi;
if [[ "$e" == "-xc++" || "$e" == -std=c++* ]]; then
cxx=1
fi;
fi;
done;
cxxflags=
if [[ $cxx -eq 1 ]]; then
cxxflags=$NIX_CXXSTDLIB_COMPILE
fi;
if [[ -n "$NIX_DEBUG" ]]; then
set -x;
fi;
export LIBCLANG_PATH="@libclang@/lib"
# shellcheck disable=SC2086
# cxxflags and NIX_CFLAGS_COMPILE should be word-split
exec -a "$0" @out@/bin/.bindgen-wrapped "$@" $sep $cxxflags $NIX_CFLAGS_COMPILE
# note that we add the flags after $@ which is incorrect. This is only for the sake
# of simplicity.