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…
	
	Add table
		Add a link
		
	
		Reference in a new issue