Skip to content

Commit

Permalink
Merge pull request #4310 from matthewbauer/rosetta2-extra-platforms
Browse files Browse the repository at this point in the history
Add x86_64-darwin and aarch64 to "extra-platforms" automatically when Rosetta2 is detected
  • Loading branch information
edolstra authored Jan 6, 2021
2 parents 8af4f88 + 3c9b702 commit 3edcb19
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 1 deletion.
24 changes: 24 additions & 0 deletions src/libstore/build/derivation-goal.cc
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@
#define pivot_root(new_root, put_old) (syscall(SYS_pivot_root, new_root, put_old))
#endif

#if __APPLE__
#include <spawn.h>
#endif

#include <pwd.h>
#include <grp.h>

Expand Down Expand Up @@ -2857,7 +2861,27 @@ void DerivationGoal::runChild()
}
}

#if __APPLE__
posix_spawnattr_t attrp;

if (posix_spawnattr_init(&attrp))
throw SysError("failed to initialize builder");

if (posix_spawnattr_setflags(&attrp, POSIX_SPAWN_SETEXEC))
throw SysError("failed to initialize builder");

if (drv->platform == "aarch64-darwin") {
cpu_type_t cpu = CPU_TYPE_ARM64;
posix_spawnattr_setbinpref_np(&attrp, 1, &cpu, NULL);
} else if (drv->platform == "x86_64-darwin") {
cpu_type_t cpu = CPU_TYPE_X86_64;
posix_spawnattr_setbinpref_np(&attrp, 1, &cpu, NULL);
}

posix_spawn(NULL, builder, NULL, &attrp, stringsToCharPtrs(args).data(), stringsToCharPtrs(envStrs).data());
#else
execve(builder, stringsToCharPtrs(args).data(), stringsToCharPtrs(envStrs).data());
#endif

throw SysError("executing '%1%'", drv->builder);

Expand Down
22 changes: 22 additions & 0 deletions src/libstore/globals.cc
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,28 @@ StringSet Settings::getDefaultSystemFeatures()
return features;
}

StringSet Settings::getDefaultExtraPlatforms()
{
if (std::string{SYSTEM} == "x86_64-linux" && !isWSL1())
return StringSet{"i686-linux"};
#if __APPLE__
// Rosetta 2 emulation layer can run x86_64 binaries on aarch64
// machines. Note that we can’t force processes from executing
// x86_64 in aarch64 environments or vice versa since they can
// always exec with their own binary preferences.
else if (pathExists("/Library/Apple/System/Library/LaunchDaemons/com.apple.oahd.plist")) {
if (std::string{SYSTEM} == "x86_64-darwin")
return StringSet{"aarch64-darwin"};
else if (std::string{SYSTEM} == "aarch64-darwin")
return StringSet{"x86_64-darwin"};
else
return StringSet{};
}
#endif
else
return StringSet{};
}

bool Settings::isExperimentalFeatureEnabled(const std::string & name)
{
auto & f = experimentalFeatures.get();
Expand Down
4 changes: 3 additions & 1 deletion src/libstore/globals.hh
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ class Settings : public Config {

StringSet getDefaultSystemFeatures();

StringSet getDefaultExtraPlatforms();

bool isWSL1();

public:
Expand Down Expand Up @@ -545,7 +547,7 @@ public:

Setting<StringSet> extraPlatforms{
this,
std::string{SYSTEM} == "x86_64-linux" && !isWSL1() ? StringSet{"i686-linux"} : StringSet{},
getDefaultExtraPlatforms(),
"extra-platforms",
R"(
Platforms other than the native one which this machine is capable of
Expand Down

0 comments on commit 3edcb19

Please sign in to comment.