about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/libffi
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/libffi')
-rw-r--r--nixpkgs/pkgs/development/libraries/libffi/3.2.1-cygwin.patch10
-rw-r--r--nixpkgs/pkgs/development/libraries/libffi/default.nix96
2 files changed, 106 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/libraries/libffi/3.2.1-cygwin.patch b/nixpkgs/pkgs/development/libraries/libffi/3.2.1-cygwin.patch
new file mode 100644
index 000000000000..f3b38dbd1c16
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/libffi/3.2.1-cygwin.patch
@@ -0,0 +1,10 @@
+--- libffi-3.2.1/src/closures.c	2014-11-08 13:47:24.000000000 +0100
++++ libffi-3.2.1/src/closures.c	2015-05-19 10:15:50.059325900 +0200
+@@ -212,6 +212,7 @@
+ #include <sys/mman.h>
+ 
+ /* Cygwin is Linux-like, but not quite that Linux-like.  */
++#define is_emutramp_enabled() 0
+ #define is_selinux_enabled() 0
+ 
+ #endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */
diff --git a/nixpkgs/pkgs/development/libraries/libffi/default.nix b/nixpkgs/pkgs/development/libraries/libffi/default.nix
new file mode 100644
index 000000000000..2918276ef211
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/libffi/default.nix
@@ -0,0 +1,96 @@
+{ stdenv, fetchurl, fetchpatch
+, autoreconfHook
+
+# libffi is used in darwin stdenv
+# we cannot run checks within it
+, doCheck ? !stdenv.isDarwin, dejagnu
+}:
+
+stdenv.mkDerivation rec {
+  name = "libffi-3.2.1";
+
+  src = fetchurl {
+    url = "https://sourceware.org/pub/libffi/${name}.tar.gz";
+    sha256 = "0dya49bnhianl0r65m65xndz6ls2jn1xngyn72gd28ls3n7bnvnh";
+  };
+
+  patches = stdenv.lib.optional stdenv.isCygwin ./3.2.1-cygwin.patch
+    ++ stdenv.lib.optional stdenv.isAarch64 (fetchpatch {
+      url = https://src.fedoraproject.org/rpms/libffi/raw/ccffc1700abfadb0969495a6e51b964117fc03f6/f/libffi-aarch64-rhbz1174037.patch;
+      sha256 = "1vpirrgny43hp0885rswgv3xski8hg7791vskpbg3wdjdpb20wbc";
+    })
+    ++ stdenv.lib.optional stdenv.hostPlatform.isMusl (fetchpatch {
+      name = "gnu-linux-define.patch";
+      url = "https://git.alpinelinux.org/cgit/aports/plain/main/libffi/gnu-linux-define.patch?id=bb024fd8ec6f27a76d88396c9f7c5c4b5800d580";
+      sha256 = "11pvy3xkhyvnjfyy293v51f1xjy3x0azrahv1nw9y9mw8bifa2j2";
+    })
+    ++ stdenv.lib.optional stdenv.hostPlatform.isRiscV (fetchpatch {
+      name = "riscv-support.patch";
+      url = https://github.com/sorear/libffi-riscv/commit/e46492e8bb1695a19bc1053ed869e6c2bab02ff2.patch;
+      sha256 = "1vl1vbvdkigs617kckxvj8j4m2cwg62kxm1clav1w5rnw9afxg0y";
+    })
+    ++ stdenv.lib.optionals stdenv.isMips [
+      (fetchpatch {
+        name = "0001-mips-Use-compiler-internal-define-for-linux.patch";
+        url = "http://cgit.openembedded.org/openembedded-core/plain/meta/recipes-support/libffi/libffi/0001-mips-Use-compiler-internal-define-for-linux.patch?id=318e33a708378652edcf61ce7d9d7f3a07743000";
+        sha256 = "1gc53lw90p6hc0cmhj3csrwincfz7va5ss995ksw5gm0yrr9mrvb";
+      })
+      (fetchpatch {
+        name = "0001-mips-fix-MIPS-softfloat-build-issue.patch";
+        url = "http://cgit.openembedded.org/openembedded-core/plain/meta/recipes-support/libffi/libffi/0001-mips-fix-MIPS-softfloat-build-issue.patch?id=318e33a708378652edcf61ce7d9d7f3a07743000";
+        sha256 = "0l8xgdciqalg4z9rcwyk87h8fdxpfv4hfqxwsy2agpnpszl5jjdq";
+      })
+    ];
+
+  outputs = [ "out" "dev" "man" "info" ];
+
+  nativeBuildInputs = stdenv.lib.optional stdenv.hostPlatform.isRiscV autoreconfHook;
+
+  configureFlags = [
+    "--with-gcc-arch=generic" # no detection of -march= or -mtune=
+    "--enable-pax_emutramp"
+  ];
+
+  preCheck = ''
+    # The tests use -O0 which is not compatible with -D_FORTIFY_SOURCE.
+    NIX_HARDENING_ENABLE=''${NIX_HARDENING_ENABLE/fortify/}
+  '';
+
+  checkInputs = [ dejagnu ];
+
+  inherit doCheck;
+
+  dontStrip = stdenv.hostPlatform != stdenv.buildPlatform; # Don't run the native `strip' when cross-compiling.
+
+  # Install headers and libs in the right places.
+  postFixup = ''
+    mkdir -p "$dev/"
+    mv "$out/lib/${name}/include" "$dev/include"
+    rmdir "$out/lib/${name}"
+    substituteInPlace "$dev/lib/pkgconfig/libffi.pc" \
+      --replace 'includedir=''${libdir}/libffi-3.2.1' "includedir=$dev"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "A foreign function call interface library";
+    longDescription = ''
+      The libffi library provides a portable, high level programming
+      interface to various calling conventions.  This allows a
+      programmer to call any function specified by a call interface
+      description at run-time.
+
+      FFI stands for Foreign Function Interface.  A foreign function
+      interface is the popular name for the interface that allows code
+      written in one language to call code written in another
+      language.  The libffi library really only provides the lowest,
+      machine dependent layer of a fully featured foreign function
+      interface.  A layer must exist above libffi that handles type
+      conversions for values passed between the two languages.
+    '';
+    homepage = http://sourceware.org/libffi/;
+    # See https://github.com/atgreen/libffi/blob/master/LICENSE .
+    license = licenses.free;
+    maintainers = [ ];
+    platforms = platforms.all;
+  };
+}