Author: shlevy
Date: Mon Aug 29 18:55:37 2011
New Revision: 28879
URL: https://svn.nixos.org/websvn/nix/?rev=28879&sc=1

Log:
Get libdrm to compile on darwin

The added patch uses mach_absolute_time() to get a nanosecond-resolution 
monotonic clock on darwin systems (See 
http://developer.apple.com/library/mac/#qa/qa1398/_index.html for an 
understanding of the added code). In addition, the patch changes one use of 
clock_gettime to gettimeofday since only resolution of a second is needed at 
that point. This code compiles on darwin, but the resulting library is not yet 
tested.

Added:
   nixpkgs/trunk/pkgs/development/libraries/libdrm/libdrm-apple.patch
Modified:
   nixpkgs/trunk/pkgs/development/libraries/libdrm/default.nix
   nixpkgs/trunk/pkgs/top-level/all-packages.nix

Modified: nixpkgs/trunk/pkgs/development/libraries/libdrm/default.nix
==============================================================================
--- nixpkgs/trunk/pkgs/development/libraries/libdrm/default.nix Mon Aug 29 
17:56:38 2011        (r28878)
+++ nixpkgs/trunk/pkgs/development/libraries/libdrm/default.nix Mon Aug 29 
18:55:37 2011        (r28879)
@@ -1,6 +1,6 @@
 {stdenv, fetchurl, pkgconfig, libpthreadstubs}:
 
-stdenv.mkDerivation rec {
+stdenv.mkDerivation (rec {
   name = "libdrm-2.4.24";
   
   src = fetchurl {
@@ -10,16 +10,19 @@
 
   buildInputs = [ pkgconfig libpthreadstubs ];
 
+  patches = [ ./libdrm-apple.patch ];
+
   preConfigure = ''
     # General case: non intel.
     if test -n "$crossConfig"; then
       configureFlags="$configureFlags --disable-intel";
     fi
-  '';
+  '' + stdenv.lib.optionalString stdenv.isDarwin
+  "echo : \\\${ac_cv_func_clock_gettime=\'yes\'} > config.cache";
 
   meta = {
     homepage = http://dri.freedesktop.org/libdrm/;
     description = "Library for accessing the kernel's Direct Rendering 
Manager";
     license = "bsd";
   };
-}
+} // (stdenv.lib.optionalAttrs stdenv.isDarwin { configureFlags = [ "-C" ]; }))

Added: nixpkgs/trunk/pkgs/development/libraries/libdrm/libdrm-apple.patch
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ nixpkgs/trunk/pkgs/development/libraries/libdrm/libdrm-apple.patch  Mon Aug 
29 18:55:37 2011        (r28879)
@@ -0,0 +1,88 @@
+diff -Naur libdrm-2.4.26-orig/intel/intel_bufmgr_gem.c 
libdrm-2.4.26/intel/intel_bufmgr_gem.c
+--- libdrm-2.4.26-orig/intel/intel_bufmgr_gem.c        2011-04-01 
10:30:51.000000000 -0400
++++ libdrm-2.4.26/intel/intel_bufmgr_gem.c     2011-08-29 02:17:20.000000000 
-0400
+@@ -51,6 +51,7 @@
+ #include <sys/mman.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
++#include <sys/time.h>
+ 
+ #include "errno.h"
+ #include "libdrm_lists.h"
+@@ -987,9 +988,9 @@
+       if (atomic_dec_and_test(&bo_gem->refcount)) {
+               drm_intel_bufmgr_gem *bufmgr_gem =
+                   (drm_intel_bufmgr_gem *) bo->bufmgr;
+-              struct timespec time;
++              struct timeval time;
+ 
+-              clock_gettime(CLOCK_MONOTONIC, &time);
++              gettimeofday(&time, NULL);
+ 
+               pthread_mutex_lock(&bufmgr_gem->lock);
+               drm_intel_gem_bo_unreference_final(bo, time.tv_sec);
+diff -Naur libdrm-2.4.26-orig/xf86drm.c libdrm-2.4.26/xf86drm.c
+--- libdrm-2.4.26-orig/xf86drm.c       2011-03-21 09:39:24.000000000 -0400
++++ libdrm-2.4.26/xf86drm.c    2011-08-29 02:17:49.000000000 -0400
+@@ -51,6 +51,9 @@
+ #include <sys/mman.h>
+ #include <sys/time.h>
+ #include <stdarg.h>
++#if defined(__APPLE__) && defined(__MACH__)
++#include <mach/mach_time.h>
++#endif
+ 
+ /* Not all systems have MAP_FAILED defined */
+ #ifndef MAP_FAILED
+@@ -1941,20 +1944,43 @@
+  */
+ int drmWaitVBlank(int fd, drmVBlankPtr vbl)
+ {
++#if defined(__APPLE__) && defined(__MACH__)
++    uint64_t start, end, elapsed, elapsedNano;
++    static const uint64_t maxElapsed = 2000000000;
++    static mach_timebase_info_data_t timebaseInfo;
++    if ( timebaseInfo.denom == 0 ) {
++      (void) mach_timebase_info(&timebaseInfo);
++    }
++#else
+     struct timespec timeout, cur;
++#endif
+     int ret;
+ 
++#if defined(__APPLE__) && defined(__MACH__)
++    start = mach_absolute_time();
++#else
+     ret = clock_gettime(CLOCK_MONOTONIC, &timeout);
+     if (ret < 0) {
+       fprintf(stderr, "clock_gettime failed: %s\n", strerror(ret));
+       goto out;
+     }
+     timeout.tv_sec++;
++#endif
+ 
+     do {
+        ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl);
+        vbl->request.type &= ~DRM_VBLANK_RELATIVE;
+        if (ret && errno == EINTR) {
++#if defined(__APPLE__) && defined(__MACH__)
++             end = mach_absolute_time();
++             elapsed = end - start;
++             elapsedNano = elapsed * timebaseInfo.numer / timebaseInfo.denom;
++             if (elapsedNano > maxElapsed) {
++                 errno = EBUSY;
++                 ret = -1;
++                 break;
++             }
++#else
+              clock_gettime(CLOCK_MONOTONIC, &cur);
+              /* Timeout after 1s */
+              if (cur.tv_sec > timeout.tv_sec + 1 ||
+@@ -1964,6 +1990,7 @@
+                      ret = -1;
+                      break;
+              }
++#endif
+        }
+     } while (ret && errno == EINTR);
+ 

Modified: nixpkgs/trunk/pkgs/top-level/all-packages.nix
==============================================================================
--- nixpkgs/trunk/pkgs/top-level/all-packages.nix       Mon Aug 29 17:56:38 
2011        (r28878)
+++ nixpkgs/trunk/pkgs/top-level/all-packages.nix       Mon Aug 29 18:55:37 
2011        (r28879)
@@ -3724,10 +3724,10 @@
 
   libdmtx = callPackage ../development/libraries/libdmtx { };
 
-  libdrm = if stdenv.isDarwin then null else (callPackage 
../development/libraries/libdrm {
+  libdrm = callPackage ../development/libraries/libdrm {
     inherit fetchurl stdenv pkgconfig;
     inherit (xorg) libpthreadstubs;
-  });
+  };
 
   libdv = callPackage ../development/libraries/libdv { };
 
_______________________________________________
nix-commits mailing list
nix-comm...@cs.uu.nl
http://mail.cs.uu.nl/mailman/listinfo/nix-commits

Reply via email to