<commit_before>{ stdenv, fetchurl, gfortran, tolerateCpuTimingInaccuracy ? true, shared ? false }:

let
  version = "3.10.1";

  optionalString = stdenv.lib.optionalString;
  optional = stdenv.lib.optional;
in

stdenv.mkDerivation {
  name = "atlas-${version}";

  src = fetchurl {
    url = "mirror://sourceforge/math-atlas/atlas${version}.tar.bz2";
    sha256 = "11ncgdc7kzb2y2gqb3sgarm5saj9fr07r3h2yh2h5bja429b85d2";
  };

  # Atlas aborts the build if it detects that some kind of CPU frequency
  # scaling is active on the build machine because that feature offsets the
  # performance timings. We ignore that check, however, because with binaries
  # being pre-built on Hydra those timings aren't accurate for the local
  # machine in the first place.
  patches = optional tolerateCpuTimingInaccuracy ./disable-timing-accuracy-check.patch;

  # Configure outside of the source directory.
  preConfigure = '' mkdir build; cd build; configureScript=../configure; '';

  # * -fPIC allows to build atlas inside shared objects, as octave does.
  #
  # * Atlas detects the cpu and does some tricks. For example, notices the
  #   hydra AMD Family 10h computer, and uses a SSE trick for it (bit 17 of MXCSR)
  #   available, for what I know, only in that family. So we hardcode K7
  #     -A 31 = Athlon K7
  #     -A 18 = Pentium II
  #     -V 192 = SSE1|SSE2 (Or it takes SSE3 somehow in my machine without SSE3)
  #     -V 1 = No SIMD (Pentium II does not have any SSE)
  #     -t 0 = No threading
  configureFlags = "-Fa alg -fPIC -t 0"
    + optionalString stdenv.isi686 " -b 32 -A 18 -V 1"
    + optionalString stdenv.isx86_64 " -A 31 -V 192"
    + optionalString shared " --shared "
    ;

  buildInputs = [ gfortran ];

  doCheck = true;

  meta = {
    homepage = "http://math-atlas.sourceforge.net/";
    description = "Automatically Tuned Linear Algebra Software (ATLAS)";
    license = "GPL";

    longDescription = ''
      The ATLAS (Automatically Tuned Linear Algebra Software) project is an ongoing
      research effort focusing on applying empirical techniques in order to provide
      portable performance. At present, it provides C and Fortran77 interfaces to a
      portably efficient BLAS implementation, as well as a few routines from LAPACK.
    '';
  };
}<commit_msg>atlas: allow users to override the CPU configuration used to build ATLAS<commit_after>{ stdenv, fetchurl, gfortran, tolerateCpuTimingInaccuracy ? true, shared ? false
, cpuConfig ? if stdenv.isi686 then "-b 32 -A 18 -V 1" else "-b 64 -A 31 -V 192"
}:

# Atlas detects the CPU and optimizes its build accordingly. This is great when
# the code is run on the same machine that built the binary, but in case of a
# central build farm like Hydra, this feature is dangerous because the code may
# be generated utilizing fancy features that users who download the binary
# cannot execute.
#
# To avoid these issues, the build is configured using the 'cpuConfig'
# parameter as follows:
#
#   | x86 CPU                                     | x86_64 CPU             |
#   |---------------------------------------------+------------------------|
#   | -b 32                                       | -b 64                  |
#   | -A 18  (Pentium II)                         | -A 31 (Athlon K7)      |
#   | -V 1 (No SIMD: Pentium II doesn't have SSE) | -V 192 (SSE1 and SSE2) |
#
# Users who want to compile a highly optimized version of ATLAS that's suitable
# for their local machine can override these settings accordingly.

let
  version = "3.10.1";

  optionalString = stdenv.lib.optionalString;
  optional = stdenv.lib.optional;
in

stdenv.mkDerivation {
  name = "atlas-${version}";

  src = fetchurl {
    url = "mirror://sourceforge/math-atlas/atlas${version}.tar.bz2";
    sha256 = "11ncgdc7kzb2y2gqb3sgarm5saj9fr07r3h2yh2h5bja429b85d2";
  };

  buildInputs = [ gfortran ];

  # Atlas aborts the build if it detects that some kind of CPU frequency
  # scaling is active on the build machine because that feature offsets the
  # performance timings. We ignore that check, however, because with binaries
  # being pre-built on Hydra those timings aren't accurate for the local
  # machine in the first place.
  patches = optional tolerateCpuTimingInaccuracy ./disable-timing-accuracy-check.patch;

  # Configure outside of the source directory.
  preConfigure = '' mkdir build; cd build; configureScript=../configure; '';

  # * -fPIC is passed even in non-shared builds so that the ATLAS code can be
  #   used to inside of shared libraries, like Octave does.
  #
  # * -t 0 disables use of multi-threading. It's not quite clear what the
  #   consequences of that setting are and whether it's necessary or not.
  configureFlags = "-Fa alg -fPIC -t 0 ${cpuConfig}" + optionalString shared " --shared";

  doCheck = true;

  meta = {
    homepage = "http://math-atlas.sourceforge.net/";
    description = "Automatically Tuned Linear Algebra Software (ATLAS)";
    license = stdenv.lib.licenses.bsd3;

    longDescription = ''
      The ATLAS (Automatically Tuned Linear Algebra Software) project is an ongoing
      research effort focusing on applying empirical techniques in order to provide
      portable performance. At present, it provides C and Fortran77 interfaces to a
      portably efficient BLAS implementation, as well as a few routines from LAPACK.
    '';
  };
}
{'fraction_non_alphanumeric': 0.09521147754797839, 'fraction_numerical': 0.02534004099124278, 'mean_word_length': 2.887038377986966, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 5, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6644352', 'n_tokens_mistral': 1741, 'n_tokens_neox': 1583, 'n_words': 628}