Merge pull request #4551 from danieldk/system-features-compute-level
Add x86_64 compute levels as system features
This commit is contained in:
commit
a878c448d8
9 changed files with 126 additions and 11 deletions
|
@ -9,6 +9,7 @@ CXXFLAGS = @CXXFLAGS@
|
||||||
EDITLINE_LIBS = @EDITLINE_LIBS@
|
EDITLINE_LIBS = @EDITLINE_LIBS@
|
||||||
ENABLE_S3 = @ENABLE_S3@
|
ENABLE_S3 = @ENABLE_S3@
|
||||||
GTEST_LIBS = @GTEST_LIBS@
|
GTEST_LIBS = @GTEST_LIBS@
|
||||||
|
HAVE_LIBCPUID = @HAVE_LIBCPUID@
|
||||||
HAVE_SECCOMP = @HAVE_SECCOMP@
|
HAVE_SECCOMP = @HAVE_SECCOMP@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBARCHIVE_LIBS = @LIBARCHIVE_LIBS@
|
LIBARCHIVE_LIBS = @LIBARCHIVE_LIBS@
|
||||||
|
|
|
@ -218,6 +218,14 @@ LDFLAGS="-lz $LDFLAGS"
|
||||||
# Look for libbrotli{enc,dec}.
|
# Look for libbrotli{enc,dec}.
|
||||||
PKG_CHECK_MODULES([LIBBROTLI], [libbrotlienc libbrotlidec], [CXXFLAGS="$LIBBROTLI_CFLAGS $CXXFLAGS"])
|
PKG_CHECK_MODULES([LIBBROTLI], [libbrotlienc libbrotlidec], [CXXFLAGS="$LIBBROTLI_CFLAGS $CXXFLAGS"])
|
||||||
|
|
||||||
|
# Look for libcpuid.
|
||||||
|
if test "$machine_name" = "x86_64"; then
|
||||||
|
PKG_CHECK_MODULES([LIBCPUID], [libcpuid], [CXXFLAGS="$LIBCPUID_CFLAGS $CXXFLAGS"])
|
||||||
|
have_libcpuid=1
|
||||||
|
AC_DEFINE([HAVE_LIBCPUID], [1], [Use libcpuid])
|
||||||
|
fi
|
||||||
|
AC_SUBST(HAVE_LIBCPUID, [$have_libcpuid])
|
||||||
|
|
||||||
|
|
||||||
# Look for libseccomp, required for Linux sandboxing.
|
# Look for libseccomp, required for Linux sandboxing.
|
||||||
if test "$sys_name" = linux; then
|
if test "$sys_name" = linux; then
|
||||||
|
|
|
@ -91,7 +91,8 @@
|
||||||
gmock
|
gmock
|
||||||
]
|
]
|
||||||
++ lib.optionals stdenv.isLinux [libseccomp utillinuxMinimal]
|
++ lib.optionals stdenv.isLinux [libseccomp utillinuxMinimal]
|
||||||
++ lib.optional (stdenv.isLinux || stdenv.isDarwin) libsodium;
|
++ lib.optional (stdenv.isLinux || stdenv.isDarwin) libsodium
|
||||||
|
++ lib.optional stdenv.isx86_64 libcpuid;
|
||||||
|
|
||||||
awsDeps = lib.optional (stdenv.isLinux || stdenv.isDarwin)
|
awsDeps = lib.optional (stdenv.isLinux || stdenv.isDarwin)
|
||||||
(aws-sdk-cpp.override {
|
(aws-sdk-cpp.override {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "archive.hh"
|
#include "archive.hh"
|
||||||
#include "args.hh"
|
#include "args.hh"
|
||||||
#include "abstract-setting-to-json.hh"
|
#include "abstract-setting-to-json.hh"
|
||||||
|
#include "compute-levels.hh"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
@ -133,24 +134,29 @@ StringSet Settings::getDefaultSystemFeatures()
|
||||||
|
|
||||||
StringSet Settings::getDefaultExtraPlatforms()
|
StringSet Settings::getDefaultExtraPlatforms()
|
||||||
{
|
{
|
||||||
|
StringSet extraPlatforms;
|
||||||
|
|
||||||
if (std::string{SYSTEM} == "x86_64-linux" && !isWSL1())
|
if (std::string{SYSTEM} == "x86_64-linux" && !isWSL1())
|
||||||
return StringSet{"i686-linux"};
|
extraPlatforms.insert("i686-linux");
|
||||||
#if __APPLE__
|
|
||||||
|
#if __linux__
|
||||||
|
StringSet levels = computeLevels();
|
||||||
|
for (auto iter = levels.begin(); iter != levels.end(); ++iter)
|
||||||
|
extraPlatforms.insert(*iter + "-linux");
|
||||||
|
#elif __APPLE__
|
||||||
// Rosetta 2 emulation layer can run x86_64 binaries on aarch64
|
// Rosetta 2 emulation layer can run x86_64 binaries on aarch64
|
||||||
// machines. Note that we can’t force processes from executing
|
// machines. Note that we can’t force processes from executing
|
||||||
// x86_64 in aarch64 environments or vice versa since they can
|
// x86_64 in aarch64 environments or vice versa since they can
|
||||||
// always exec with their own binary preferences.
|
// always exec with their own binary preferences.
|
||||||
else if (pathExists("/Library/Apple/System/Library/LaunchDaemons/com.apple.oahd.plist")) {
|
if (pathExists("/Library/Apple/System/Library/LaunchDaemons/com.apple.oahd.plist")) {
|
||||||
if (std::string{SYSTEM} == "x86_64-darwin")
|
if (std::string{SYSTEM} == "x86_64-darwin")
|
||||||
return StringSet{"aarch64-darwin"};
|
extraPlatforms.insert("aarch64-darwin");
|
||||||
else if (std::string{SYSTEM} == "aarch64-darwin")
|
else if (std::string{SYSTEM} == "aarch64-darwin")
|
||||||
return StringSet{"x86_64-darwin"};
|
extraPlatforms.insert("x86_64-darwin");
|
||||||
else
|
|
||||||
return StringSet{};
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else
|
|
||||||
return StringSet{};
|
return extraPlatforms;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Settings::isExperimentalFeatureEnabled(const std::string & name)
|
bool Settings::isExperimentalFeatureEnabled(const std::string & name)
|
||||||
|
|
80
src/libutil/compute-levels.cc
Normal file
80
src/libutil/compute-levels.cc
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
#include "types.hh"
|
||||||
|
|
||||||
|
#if HAVE_LIBCPUID
|
||||||
|
#include <libcpuid/libcpuid.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
#if HAVE_LIBCPUID
|
||||||
|
|
||||||
|
StringSet computeLevels() {
|
||||||
|
StringSet levels;
|
||||||
|
|
||||||
|
if (!cpuid_present())
|
||||||
|
return levels;
|
||||||
|
|
||||||
|
cpu_raw_data_t raw;
|
||||||
|
cpu_id_t data;
|
||||||
|
|
||||||
|
if (cpuid_get_raw_data(&raw) < 0)
|
||||||
|
return levels;
|
||||||
|
|
||||||
|
if (cpu_identify(&raw, &data) < 0)
|
||||||
|
return levels;
|
||||||
|
|
||||||
|
if (!(data.flags[CPU_FEATURE_CMOV] &&
|
||||||
|
data.flags[CPU_FEATURE_CX8] &&
|
||||||
|
data.flags[CPU_FEATURE_FPU] &&
|
||||||
|
data.flags[CPU_FEATURE_FXSR] &&
|
||||||
|
data.flags[CPU_FEATURE_MMX] &&
|
||||||
|
data.flags[CPU_FEATURE_SSE] &&
|
||||||
|
data.flags[CPU_FEATURE_SSE2]))
|
||||||
|
return levels;
|
||||||
|
|
||||||
|
levels.insert("x86_64-v1");
|
||||||
|
|
||||||
|
if (!(data.flags[CPU_FEATURE_CX16] &&
|
||||||
|
data.flags[CPU_FEATURE_LAHF_LM] &&
|
||||||
|
data.flags[CPU_FEATURE_POPCNT] &&
|
||||||
|
// SSE3
|
||||||
|
data.flags[CPU_FEATURE_PNI] &&
|
||||||
|
data.flags[CPU_FEATURE_SSSE3] &&
|
||||||
|
data.flags[CPU_FEATURE_SSE4_1] &&
|
||||||
|
data.flags[CPU_FEATURE_SSE4_2]))
|
||||||
|
return levels;
|
||||||
|
|
||||||
|
levels.insert("x86_64-v2");
|
||||||
|
|
||||||
|
if (!(data.flags[CPU_FEATURE_AVX] &&
|
||||||
|
data.flags[CPU_FEATURE_AVX2] &&
|
||||||
|
data.flags[CPU_FEATURE_F16C] &&
|
||||||
|
data.flags[CPU_FEATURE_FMA3] &&
|
||||||
|
// LZCNT
|
||||||
|
data.flags[CPU_FEATURE_ABM] &&
|
||||||
|
data.flags[CPU_FEATURE_MOVBE]))
|
||||||
|
return levels;
|
||||||
|
|
||||||
|
levels.insert("x86_64-v3");
|
||||||
|
|
||||||
|
if (!(data.flags[CPU_FEATURE_AVX512F] &&
|
||||||
|
data.flags[CPU_FEATURE_AVX512BW] &&
|
||||||
|
data.flags[CPU_FEATURE_AVX512CD] &&
|
||||||
|
data.flags[CPU_FEATURE_AVX512DQ] &&
|
||||||
|
data.flags[CPU_FEATURE_AVX512VL]))
|
||||||
|
return levels;
|
||||||
|
|
||||||
|
levels.insert("x86_64-v4");
|
||||||
|
|
||||||
|
return levels;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
StringSet computeLevels() {
|
||||||
|
return StringSet{};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // HAVE_LIBCPUID
|
||||||
|
|
||||||
|
}
|
7
src/libutil/compute-levels.hh
Normal file
7
src/libutil/compute-levels.hh
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#include "types.hh"
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
StringSet computeLevels();
|
||||||
|
|
||||||
|
}
|
|
@ -7,3 +7,7 @@ libutil_DIR := $(d)
|
||||||
libutil_SOURCES := $(wildcard $(d)/*.cc)
|
libutil_SOURCES := $(wildcard $(d)/*.cc)
|
||||||
|
|
||||||
libutil_LDFLAGS = $(LIBLZMA_LIBS) -lbz2 -pthread $(OPENSSL_LIBS) $(LIBBROTLI_LIBS) $(LIBARCHIVE_LIBS) $(BOOST_LDFLAGS) -lboost_context
|
libutil_LDFLAGS = $(LIBLZMA_LIBS) -lbz2 -pthread $(OPENSSL_LIBS) $(LIBBROTLI_LIBS) $(LIBARCHIVE_LIBS) $(BOOST_LDFLAGS) -lboost_context
|
||||||
|
|
||||||
|
ifeq ($(HAVE_LIBCPUID), 1)
|
||||||
|
libutil_LDFLAGS += -lcpuid
|
||||||
|
endif
|
||||||
|
|
7
tests/compute-levels.sh
Normal file
7
tests/compute-levels.sh
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
source common.sh
|
||||||
|
|
||||||
|
if [[ $(uname -ms) = "Linux x86_64" ]]; then
|
||||||
|
# x86_64 CPUs must always support the baseline
|
||||||
|
# microarchitecture level.
|
||||||
|
nix -vv --version | grep -q "x86_64-v1-linux"
|
||||||
|
fi
|
|
@ -38,7 +38,8 @@ nix_tests = \
|
||||||
describe-stores.sh \
|
describe-stores.sh \
|
||||||
flakes.sh \
|
flakes.sh \
|
||||||
content-addressed.sh \
|
content-addressed.sh \
|
||||||
build.sh
|
build.sh \
|
||||||
|
compute-levels.sh
|
||||||
# parallel.sh
|
# parallel.sh
|
||||||
# build-remote-content-addressed-fixed.sh \
|
# build-remote-content-addressed-fixed.sh \
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue