Fix personality switching from x86_64 to i686
On Linux, Nix can build i686 packages even on x86_64 systems. It's not enough to recognize this situation by settings.thisSystem, we also have to consult uname(). E.g. we can be running on a i686 Debian with an amd64 kernel. In that situation settings.thisSystem is i686-linux, but we still need to change personality to i686 to make builds consistent.
This commit is contained in:
parent
03eaef3d7a
commit
c6c024ca6f
1 changed files with 6 additions and 1 deletions
|
@ -21,6 +21,7 @@
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
@ -2173,7 +2174,11 @@ void DerivationGoal::initChild()
|
||||||
#ifdef CAN_DO_LINUX32_BUILDS
|
#ifdef CAN_DO_LINUX32_BUILDS
|
||||||
/* Change the personality to 32-bit if we're doing an
|
/* Change the personality to 32-bit if we're doing an
|
||||||
i686-linux build on an x86_64-linux machine. */
|
i686-linux build on an x86_64-linux machine. */
|
||||||
if (drv.platform == "i686-linux" && settings.thisSystem == "x86_64-linux") {
|
struct utsname utsbuf;
|
||||||
|
uname(&utsbuf);
|
||||||
|
if (drv.platform == "i686-linux" &&
|
||||||
|
(settings.thisSystem == "x86_64-linux" ||
|
||||||
|
(!strcmp(utsbuf.sysname, "Linux") && !strcmp(utsbuf.machine, "x86_64")))) {
|
||||||
if (personality(0x0008 | 0x8000000 /* == PER_LINUX32_3GB */) == -1)
|
if (personality(0x0008 | 0x8000000 /* == PER_LINUX32_3GB */) == -1)
|
||||||
throw SysError("cannot set i686-linux personality");
|
throw SysError("cannot set i686-linux personality");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue