diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/cli.nix | 107 | ||||
-rw-r--r-- | lib/systems/default.nix | 35 | ||||
-rw-r--r-- | lib/systems/examples.nix | 6 | ||||
-rw-r--r-- | lib/systems/parse.nix | 5 |
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; |