about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2009-01-12T16·30+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2009-01-12T16·30+0000
commitc504d90c1159bd0fadd37bb3098ecf8622d0b13c (patch)
tree0c087a0e0d281afae7dbb79910fdc669516b73f2
parent8e39d9bdb30cbe2e7c3f7d9b30ac64c3a2e32684 (diff)
* Support i686-linux builds directly on x86_64-linux Nix
  installations.  This is implemented using the personality() syscall,
  which causes uname to return "i686" in child processes.

-rw-r--r--configure.ac7
-rw-r--r--src/libstore/build.cc19
2 files changed, 24 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac
index fdf898640a8b..44c22c19b050 100644
--- a/configure.ac
+++ b/configure.ac
@@ -100,12 +100,17 @@ AC_CHECK_HEADERS([sys/mount.h], [], [],
 ])
 
 
-# Check for <locale>
+# Check for <locale>.
 AC_LANG_PUSH(C++)
 AC_CHECK_HEADERS([locale], [], [], [])
 AC_LANG_POP(C++)
 
 
+# Check whether we have the personality() syscall, which allows us to
+# do i686-linux builds on x86_64-linux machines.
+AC_CHECK_HEADERS([sys/personality.h])
+
+
 AC_DEFUN([NEED_PROG],
 [
 AC_PATH_PROG($1, $2)
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index f015b878c3ee..db2bed6d01f8 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -40,6 +40,12 @@
 #define CHROOT_ENABLED HAVE_CHROOT && HAVE_UNSHARE && HAVE_SYS_MOUNT_H && defined(MS_BIND) && defined(CLONE_NEWNS)
 
 
+#if HAVE_SYS_PERSONALITY_H
+#include <sys/personality.h>
+#define CAN_DO_LINUX32_BUILDS
+#endif
+
+
 namespace nix {
 
 using std::map;
@@ -1474,7 +1480,11 @@ void DerivationGoal::startBuilder()
         format("building path(s) %1%") % showPaths(outputPaths(drv.outputs)))
     
     /* Right platform? */
-    if (drv.platform != thisSystem)
+    if (drv.platform != thisSystem 
+#ifdef CAN_DO_LINUX32_BUILDS
+        && !(drv.platform == "i686-linux" && thisSystem == "x86_64-linux")
+#endif
+        )
         throw BuildError(
             format("a `%1%' is required to build `%3%', but I am a `%2%'")
             % drv.platform % thisSystem % drvPath);
@@ -1806,6 +1816,13 @@ void DerivationGoal::startBuilder()
             
             initChild();
 
+#ifdef CAN_DO_LINUX32_BUILDS
+            if (drv.platform == "i686-linux" && thisSystem == "x86_64-linux") {
+                if (personality(PER_LINUX32_3GB) == -1)
+                    throw SysError("cannot set i686-linux personality");
+            }
+#endif
+
             /* Fill in the environment. */
             Strings envStrs;
             for (Environment::const_iterator i = env.begin();