about summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/cli.nix107
-rw-r--r--lib/systems/default.nix35
-rw-r--r--lib/systems/examples.nix6
-rw-r--r--lib/systems/parse.nix5
4 files changed, 99 insertions, 54 deletions
diff --git a/lib/cli.nix b/lib/cli.nix
index 311037c519a65..b65131ac1a1b4 100644
--- a/lib/cli.nix
+++ b/lib/cli.nix
@@ -7,8 +7,6 @@ rec {
     This helps protect against malformed command lines and also to reduce
     boilerplate related to command-line construction for simple use cases.
 
-    `toGNUCommandLine` returns a list of nix strings.
-
     `toGNUCommandLineShell` returns an escaped shell string.
 
 
@@ -16,11 +14,11 @@ rec {
 
     `options`
 
-    : 1\. Function argument
+    : How to format the arguments, see `toGNUCommandLine`
 
     `attrs`
 
-    : 2\. Function argument
+    : The attributes to transform into arguments.
 
 
     # Examples
@@ -28,7 +26,7 @@ rec {
     ## `lib.cli.toGNUCommandLineShell` usage example
 
     ```nix
-    cli.toGNUCommandLine {} {
+    cli.toGNUCommandLineShell {} {
       data = builtins.toJSON { id = 0; };
       X = "PUT";
       retry = 3;
@@ -37,16 +35,67 @@ rec {
       silent = false;
       verbose = true;
     }
-    => [
-      "-X" "PUT"
-      "--data" "{\"id\":0}"
-      "--retry" "3"
-      "--url" "https://example.com/foo"
-      "--url" "https://example.com/bar"
-      "--verbose"
-    ]
+    => "'-X' 'PUT' '--data' '{\"id\":0}' '--retry' '3' '--url' 'https://example.com/foo' '--url' 'https://example.com/bar' '--verbose'";
+    ```
 
-    cli.toGNUCommandLineShell {} {
+    :::
+  */
+  toGNUCommandLineShell =
+    options: attrs: lib.escapeShellArgs (toGNUCommandLine options attrs);
+
+  /**
+    Automatically convert an attribute set to a list of command-line options.
+
+    `toGNUCommandLine` returns a list of string arguments.
+
+
+    # Inputs
+
+    `options`
+
+    : How to format the arguments, see below.
+
+    `attrs`
+
+    : The attributes to transform into arguments.
+
+    # Options
+
+    `mkOptionName`
+
+    : How to string-format the option name;
+    By default one character is a short option (`-`), more than one characters a long option (`--`).
+
+    `mkBool`
+
+    : How to format a boolean value to a command list;
+    By default it’s a flag option (only the option name if true, left out completely if false).
+
+    `mkList`
+
+    : How to format a list value to a command list;
+    By default the option name is repeated for each value and `mkOption` is applied to the values themselves.
+
+
+    `mkOption`
+
+    : How to format any remaining value to a command list;
+    On the toplevel, booleans and lists are handled by `mkBool` and `mkList`, though they can still appear as values of a list.
+    By default, everything is printed verbatim and complex types are forbidden (lists, attrsets, functions). `null` values are omitted.
+
+    `optionValueSeparator`
+
+    : How to separate an option from its flag;
+    By default, there is no separator, so option `-c` and value `5` would become ["-c" "5"].
+    This is useful if the command requires equals, for example, `-c=5`.
+
+
+    # Examples
+    :::{.example}
+    ## `lib.cli.toGNUCommandLine` usage example
+
+    ```nix
+    cli.toGNUCommandLine {} {
       data = builtins.toJSON { id = 0; };
       X = "PUT";
       retry = 3;
@@ -55,38 +104,28 @@ rec {
       silent = false;
       verbose = true;
     }
-    => "'-X' 'PUT' '--data' '{\"id\":0}' '--retry' '3' '--url' 'https://example.com/foo' '--url' 'https://example.com/bar' '--verbose'";
+    => [
+      "-X" "PUT"
+      "--data" "{\"id\":0}"
+      "--retry" "3"
+      "--url" "https://example.com/foo"
+      "--url" "https://example.com/bar"
+      "--verbose"
+    ]
     ```
 
     :::
   */
-  toGNUCommandLineShell =
-    options: attrs: lib.escapeShellArgs (toGNUCommandLine options attrs);
-
   toGNUCommandLine = {
-    # how to string-format the option name;
-    # by default one character is a short option (`-`),
-    # more than one characters a long option (`--`).
     mkOptionName ?
       k: if builtins.stringLength k == 1
           then "-${k}"
           else "--${k}",
 
-    # how to format a boolean value to a command list;
-    # by default it’s a flag option
-    # (only the option name if true, left out completely if false).
     mkBool ? k: v: lib.optional v (mkOptionName k),
 
-    # how to format a list value to a command list;
-    # by default the option name is repeated for each value
-    # and `mkOption` is applied to the values themselves.
     mkList ? k: v: lib.concatMap (mkOption k) v,
 
-    # how to format any remaining value to a command list;
-    # on the toplevel, booleans and lists are handled by `mkBool` and `mkList`,
-    # though they can still appear as values of a list.
-    # By default, everything is printed verbatim and complex types
-    # are forbidden (lists, attrsets, functions). `null` values are omitted.
     mkOption ?
       k: v: if v == null
             then []
@@ -95,10 +134,6 @@ rec {
             else
               [ "${mkOptionName k}${optionValueSeparator}${lib.generators.mkValueStringDefault {} v}" ],
 
-    # how to separate an option from its flag;
-    # by default, there is no separator, so option `-c` and value `5`
-    # would become ["-c" "5"].
-    # This is useful if the command requires equals, for example, `-c=5`.
     optionValueSeparator ? null
     }:
     options:
diff --git a/lib/systems/default.nix b/lib/systems/default.nix
index 0981122388bb1..074239b3fb6f1 100644
--- a/lib/systems/default.nix
+++ b/lib/systems/default.nix
@@ -84,20 +84,21 @@ let
       useLLVM = final.isFreeBSD || final.isOpenBSD;
 
       libc =
-        /**/ if final.isDarwin              then "libSystem"
-        else if final.isMinGW               then "msvcrt"
-        else if final.isWasi                then "wasilibc"
-        else if final.isRedox               then "relibc"
-        else if final.isMusl                then "musl"
-        else if final.isUClibc              then "uclibc"
-        else if final.isAndroid             then "bionic"
-        else if final.isLinux /* default */ then "glibc"
-        else if final.isFreeBSD             then "fblibc"
-        else if final.isOpenBSD             then "oblibc"
-        else if final.isNetBSD              then "nblibc"
-        else if final.isAvr                 then "avrlibc"
-        else if final.isGhcjs               then null
-        else if final.isNone                then "newlib"
+        /**/ if final.isDarwin                then "libSystem"
+        else if final.isMinGW                 then "msvcrt"
+        else if final.isWasi                  then "wasilibc"
+        else if final.isWasm && !final.isWasi then null
+        else if final.isRedox                 then "relibc"
+        else if final.isMusl                  then "musl"
+        else if final.isUClibc                then "uclibc"
+        else if final.isAndroid               then "bionic"
+        else if final.isLinux  /* default */  then "glibc"
+        else if final.isFreeBSD               then "fblibc"
+        else if final.isOpenBSD               then "oblibc"
+        else if final.isNetBSD                then "nblibc"
+        else if final.isAvr                   then "avrlibc"
+        else if final.isGhcjs                 then null
+        else if final.isNone                  then "newlib"
         # TODO(@Ericson2314) think more about other operating systems
         else                                     "native/impure";
       # Choose what linker we wish to use by default. Someday we might also
@@ -179,6 +180,7 @@ let
         (isAndroid || isGnu || isMusl                                  # Linux (allows multiple libcs)
          || isDarwin || isSunOS || isOpenBSD || isFreeBSD || isNetBSD  # BSDs
          || isCygwin || isMinGW                                        # Windows
+         || isWasm                                                     # WASM
         ) && !isStatic;
 
       # The difference between `isStatic` and `hasSharedLibraries` is mainly the
@@ -187,7 +189,7 @@ let
       # don't support dynamic linking, but don't get the `staticMarker`.
       # `pkgsStatic` sets `isStatic=true`, so `pkgsStatic.hostPlatform` always
       # has the `staticMarker`.
-      isStatic = final.isWasm || final.isRedox;
+      isStatic = final.isWasi || final.isRedox;
 
       # Just a guess, based on `system`
       inherit
@@ -337,7 +339,8 @@ let
                     if isList f then f else [ f ]
                 )
               else optional final.isUnix "unix"
-                   ++ optional final.isWindows "windows";
+                   ++ optional final.isWindows "windows"
+                   ++ optional final.isWasm "wasm";
 
             # https://doc.rust-lang.org/reference/conditional-compilation.html#target_vendor
             vendor = let
diff --git a/lib/systems/examples.nix b/lib/systems/examples.nix
index 7e50266748434..178536efb0091 100644
--- a/lib/systems/examples.nix
+++ b/lib/systems/examples.nix
@@ -356,6 +356,12 @@ rec {
     useLLVM = true;
   };
 
+  wasm32-unknown-none = {
+    config = "wasm32-unknown-none";
+    rust.rustcTarget = "wasm32-unknown-unknown";
+    useLLVM = true;
+  };
+
   # Ghcjs
   ghcjs = {
     # This triple is special to GHC/Cabal/GHCJS and not recognized by autotools
diff --git a/lib/systems/parse.nix b/lib/systems/parse.nix
index 1d7c95943a794..a2ee288f2c1f8 100644
--- a/lib/systems/parse.nix
+++ b/lib/systems/parse.nix
@@ -466,11 +466,12 @@ rec {
       }
       # cpu-vendor-os
       else if elemAt l 1 == "apple" ||
-              elem (elemAt l 2) [ "wasi" "redox" "mmixware" "ghcjs" "mingw32" ] ||
+              elem (elemAt l 2) [ "redox" "mmixware" "ghcjs" "mingw32" ] ||
               hasPrefix "freebsd" (elemAt l 2) ||
               hasPrefix "netbsd" (elemAt l 2) ||
               hasPrefix "openbsd" (elemAt l 2) ||
-              hasPrefix "genode" (elemAt l 2)
+              hasPrefix "genode" (elemAt l 2) ||
+              hasPrefix "wasm32" (elemAt l 0)
       then {
         cpu    = elemAt l 0;
         vendor = elemAt l 1;