2017-07-29 02:05:35 +02:00
|
|
|
{ lib }:
|
|
|
|
let inherit (lib.attrsets) mapAttrs; in
|
2017-05-21 19:39:23 +02:00
|
|
|
|
2017-02-09 03:27:22 +01:00
|
|
|
rec {
|
2017-07-29 02:05:35 +02:00
|
|
|
doubles = import ./doubles.nix { inherit lib; };
|
|
|
|
parse = import ./parse.nix { inherit lib; };
|
|
|
|
inspect = import ./inspect.nix { inherit lib; };
|
|
|
|
platforms = import ./platforms.nix { inherit lib; };
|
|
|
|
examples = import ./examples.nix { inherit lib; };
|
2017-03-24 01:49:28 +01:00
|
|
|
|
|
|
|
# Elaborate a `localSystem` or `crossSystem` so that it contains everything
|
|
|
|
# necessary.
|
|
|
|
#
|
|
|
|
# `parsed` is inferred from args, both because there are two options with one
|
|
|
|
# clearly prefered, and to prevent cycles. A simpler fixed point where the RHS
|
|
|
|
# always just used `final.*` would fail on both counts.
|
|
|
|
elaborate = args: let
|
|
|
|
final = {
|
|
|
|
# Prefer to parse `config` as it is strictly more informative.
|
|
|
|
parsed = parse.mkSystemFromString (if args ? config then args.config else args.system);
|
|
|
|
# Either of these can be losslessly-extracted from `parsed` iff parsing succeeds.
|
|
|
|
system = parse.doubleFromSystem final.parsed;
|
|
|
|
config = parse.tripleFromSystem final.parsed;
|
|
|
|
# Just a guess, based on `system`
|
|
|
|
platform = platforms.selectBySystem final.system;
|
2017-02-17 06:36:10 +01:00
|
|
|
# Derived meta-data
|
2017-05-21 20:02:19 +02:00
|
|
|
libc =
|
2017-02-17 06:36:10 +01:00
|
|
|
/**/ if final.isDarwin then "libSystem"
|
|
|
|
else if final.isMinGW then "msvcrt"
|
|
|
|
else if final.isMusl then "musl"
|
|
|
|
else if final.isAndroid then "bionic"
|
|
|
|
else if final.isLinux /* default */ then "glibc"
|
2017-05-21 20:02:19 +02:00
|
|
|
# TODO(@Ericson2314) think more about other operating systems
|
2017-02-17 06:36:10 +01:00
|
|
|
else "native/impure";
|
2017-09-12 21:24:03 +02:00
|
|
|
extensions = {
|
|
|
|
sharedLibrary =
|
|
|
|
/**/ if final.isDarwin then ".dylib"
|
|
|
|
else if final.isWindows then ".dll"
|
|
|
|
else ".so";
|
|
|
|
executable =
|
|
|
|
/**/ if final.isWindows then ".exe"
|
|
|
|
else "";
|
|
|
|
};
|
2017-02-17 06:36:10 +01:00
|
|
|
# Misc boolean options
|
|
|
|
useAndroidPrebuilt = false;
|
2017-05-21 19:39:23 +02:00
|
|
|
} // mapAttrs (n: v: v final.parsed) inspect.predicates
|
|
|
|
// args;
|
2017-02-17 06:36:10 +01:00
|
|
|
in assert final.useAndroidPrebuilt -> final.isAndroid;
|
|
|
|
final;
|
2017-02-09 03:27:22 +01:00
|
|
|
}
|