| 
									
										
										
										
											2017-07-28 20:05:35 -04:00
										 |  |  | { lib }: | 
					
						
							|  |  |  |   let inherit (lib.attrsets) mapAttrs; in | 
					
						
							| 
									
										
										
										
											2017-05-21 13:39:23 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 21:27:22 -05:00
										 |  |  | rec { | 
					
						
							| 
									
										
										
										
											2017-07-28 20:05:35 -04: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-23 20:49:28 -04: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-05-21 14:02:19 -04:00
										 |  |  |       libc = | 
					
						
							|  |  |  |         /**/ if final.isDarwin then "libSystem" | 
					
						
							|  |  |  |         else if final.isMinGW  then "msvcrt" | 
					
						
							| 
									
										
										
										
											2018-02-11 14:55:17 -06:00
										 |  |  |         else if final.isMusl  then "musl" | 
					
						
							| 
									
										
										
										
											2018-02-11 14:20:14 -06:00
										 |  |  |         else if final.isLinux /* default */    then "glibc" | 
					
						
							| 
									
										
										
										
											2017-05-21 14:02:19 -04:00
										 |  |  |         # TODO(@Ericson2314) think more about other operating systems | 
					
						
							|  |  |  |         else                        "native/impure"; | 
					
						
							| 
									
										
										
										
											2017-09-12 15:24:03 -04:00
										 |  |  |       extensions = { | 
					
						
							|  |  |  |         sharedLibrary = | 
					
						
							|  |  |  |           /**/ if final.isDarwin  then ".dylib" | 
					
						
							|  |  |  |           else if final.isWindows then ".dll" | 
					
						
							|  |  |  |           else                         ".so"; | 
					
						
							|  |  |  |         executable = | 
					
						
							|  |  |  |           /**/ if final.isWindows then ".exe" | 
					
						
							|  |  |  |           else                         ""; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2017-05-21 13:39:23 -04:00
										 |  |  |     } // mapAttrs (n: v: v final.parsed) inspect.predicates | 
					
						
							|  |  |  |       // args; | 
					
						
							| 
									
										
										
										
											2017-03-23 20:49:28 -04:00
										 |  |  |   in final; | 
					
						
							| 
									
										
										
										
											2017-02-08 21:27:22 -05:00
										 |  |  | } |