Commit c115936c authored by Ross Smyth's avatar Ross Smyth Committed by Emery Hemingway
Browse files

picolibc: Add config options

parent c64a6856
Loading
Loading
Loading
Loading
+161 −15
Original line number Diff line number Diff line
@@ -5,15 +5,97 @@
  meson,
  ninja,
  nix-update-script,
  pkgsCross,

  # General Build Options
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/meson_options.txt#L40-L57
  multilib ? true,
  sanitize-bounds ? false,
  sanitize-trap-on-error ? false,
  profile ? false,
  analyzer ? false,
  assert-verbose ? true,
  fast-strcmp ? true,

  # Testing options
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/meson_options.txt#L75
  picolib ? stdenv.hostPlatform.isNone,
  semihost ? stdenv.hostPlatform.isNone,

  # Stdio Options
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/meson_options.txt#L114
  tinystdio ? true,
  io-c99-formats ? true,
  io-long-long ? false,
  io-pos-args ? false,
  io-long-double ? false,

  # Tinystdio options
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/meson_options.txt#L129
  io-float-exact ? true,
  atomic-ungetc ? true,
  posix-console ? !stdenv.hostPlatform.isNone,
  format-default ? "double",
  printf-aliases ? true,
  io-percent-b ? false,
  printf-small-ultoa ? true,
  printf-percent-n ? false,
  minimal-io-long-long ? false,
  fast-bufio ? false,
  io-wchar ? false,

  # Internaltionalization options
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/meson_options.txt#L181
  mb-capable ? false,
  mb-extended-charsets ? false,
  mb-ucs-charsets ? "auto",
  mb-iso-charsets ? "auto",
  mb-jis-charsets ? "auto",
  mb-windows-charsets ? "auto",

  # Startup/shutdown options
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/meson_options.txt#L198
  picocrt ? stdenv.hostPlatform.isNone,
  picocrt-enable-mmu ? true,
  picocrt-lib ? true,
  picoexit ? true,
  initfini-array ? true,
  crt-runtime-size ? false,

  # Legacy (non-picoexit) startup/shutdown options
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/meson_options.txt#L217
  newlib-atexit-dynamic-alloc ? false,
  newlib-global-atexit ? !stdenv.hostPlatform.isNone,
  newlib-register-fini ? false,

  # Malloc options
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/meson_options.txt#L228
  newlib-nano-malloc ? true,
  nano-malloc-clear-freed ? false,

  # Locking options
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/meson_options.txt#L237
  single-thread ? false,

  # TLS storage options
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/meson_options.txt#L244
  thread-local-storage ? "picolibc",
  tls-model ? if stdenv.hostPlatform.isNone then "local-exec" else "global-dynamic",
  newlib-global-errno ? false,
  errno-function ? if stdenv.hostPlatform.isNone then "false" else "auto",
  tls-rp2040 ? false,

  # Math options
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/meson_options.txt#L261
  want-math-errno ? false,
}:
let
  inherit (lib.strings) mesonBool mesonOption;

  canExecute = stdenv.buildPlatform.canExecute stdenv.hostPlatform;
in
stdenv.mkDerivation (finalAttrs: {
  name = "picolibc";
  pname = "picolibc";
  version = "1.8.9";
  strictDeps = true;

@@ -24,8 +106,8 @@ stdenv.mkDerivation (finalAttrs: {

  src = fetchFromGitHub {
    owner = "picolibc";
    repo = "picolibc";
    rev = "db4d0fe5952d5ecd714781e3212d4086d970735a";
    repo = finalAttrs.pname;
    tag = finalAttrs.version;
    hash = "sha256-W1zK9mLMfi5pbOpbSLxiB2qKdiyNjOSQu96NM94/fcY=";
  };

@@ -34,20 +116,84 @@ stdenv.mkDerivation (finalAttrs: {
    ninja
  ];

  # Default values taken from
  # Build fails without using them.
  # https://github.com/picolibc/picolibc/blob/e57b766cb5d80f23c20d05ab067001d85910f927/doc/os.md?plain=1#L183
  mesonFlags = [
  mesonFlags =
    [
      (mesonBool "multilib" multilib)
    (mesonOption "specsdir" "${placeholder "dev"}/lib")
    (mesonOption "tls-model" "global-dynamic")
    (mesonOption "errno-function" "auto")
    (mesonBool "picolib" false)
    (mesonBool "picocrt" false)
    (mesonBool "semihost" false)
      (mesonBool "sanitize-bounds" sanitize-bounds)
      (mesonBool "sanitize-trap-on-error" sanitize-trap-on-error)
      (mesonBool "profile" profile)
      (mesonBool "analyzer" analyzer)
      (mesonBool "assert-verbose" assert-verbose)
      (mesonBool "fast-strcmp" fast-strcmp)

      # Testing options
      (mesonBool "picolib" picolib)
      (mesonBool "semihost" semihost)
      (mesonBool "use-stdlib" true)
    (mesonBool "posix-console" true)
    (mesonBool "newlib-global-atexit" true)

      # Install options
      (mesonOption "specsdir" "${placeholder "dev"}/lib")

      (mesonBool "tinystdio" tinystdio)
      (mesonBool "io-c99-formats" io-c99-formats)
      (mesonBool "io-long-long" io-long-long)
      (mesonBool "io-pos-args" io-pos-args)
      (mesonBool "io-long-double" io-long-double)

      (mesonBool "io-float-exact" io-float-exact)
      (mesonBool "atomic-ungetc" atomic-ungetc)
      (mesonBool "posix-console" posix-console)
      (mesonOption "format-default" format-default)
      (mesonBool "printf-aliases" printf-aliases)
      (mesonBool "io-percent-b" io-percent-b)
      (mesonBool "printf-small-ultoa" printf-small-ultoa)
      (mesonBool "printf-percent-n" printf-percent-n)
      (mesonBool "minimal-io-long-long" minimal-io-long-long)
      (mesonBool "fast-bufio" fast-bufio)
      (mesonBool "io-wchar" io-wchar)

      (mesonBool "mb-capable" mb-capable)
      (mesonBool "mb-extended-charsets" mb-extended-charsets)
      (mesonOption "mb-ucs-charsets" mb-ucs-charsets)
      (mesonOption "mb-iso-charsets" mb-iso-charsets)
      (mesonOption "mb-jis-charsets" mb-jis-charsets)
      (mesonOption "mb-windows-charsets" mb-windows-charsets)

      (mesonBool "picocrt" picocrt)
      (mesonBool "picocrt-enable-mmu" picocrt-enable-mmu)
      (mesonBool "picocrt-lib" picocrt-lib)
      (mesonBool "picoexit" picoexit)
      (mesonBool "newlib-initfini-array" initfini-array)
      (mesonBool "crt-runtime-size" crt-runtime-size)

      (mesonBool "newlib-atexit-dynamic-alloc" newlib-atexit-dynamic-alloc)
      (mesonBool "newlib-global-atexit" newlib-global-atexit)
      (mesonBool "newlib-register-fini" newlib-register-fini)

      (mesonBool "newlib-nano-malloc" newlib-nano-malloc)
      (mesonBool "nano-malloc-clear-freed" nano-malloc-clear-freed)

      (mesonBool "newlib-multithread" (!single-thread))

      (mesonOption "thread-local-storage" thread-local-storage)
      (mesonOption "tls-model" tls-model)
      (mesonBool "newlib-global-errno" newlib-global-errno)
      (mesonOption "errno-function" errno-function)
      (mesonBool "tls-rp2040" tls-rp2040)

      (mesonBool "want-math-errno" want-math-errno)
    ]
    ++ lib.optionals finalAttrs.doCheck [
      (mesonBool "tests" true)
      # Something is broken with this and I'm not sure what.
      (mesonOption "tests-cdefs" "false")
    ];

  doCheck = canExecute;

  passthru = {
    updateScript = nix-update-script { };
    tests = {