dependencyClosure { ... searchPath = [ ../foo ../bar ]; ... }
* Primop `dirOf' to return the directory part of a path (e.g., dirOf
  /a/b/c == /a/b).
* Primop `relativise' (according to Webster that's a real word!) that
  given paths A and B returns a string representing path B relative
  path to A; e.g., relativise /a/b/c a/b/x/y => "../x/y".
		
	
			
		
			
				
	
	
		
			69 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
rec {
 | 
						|
 | 
						|
  # Should point at your Nixpkgs installation.
 | 
						|
  pkgPath = ./pkgs;
 | 
						|
 | 
						|
  pkgs = import (pkgPath + /system/all-packages.nix) {};
 | 
						|
 | 
						|
  stdenv = pkgs.stdenv;
 | 
						|
  
 | 
						|
 | 
						|
  compileC =
 | 
						|
  { main
 | 
						|
  , localIncludes ? "auto"
 | 
						|
  , localIncludePath ? []
 | 
						|
  , cFlags ? ""
 | 
						|
  , sharedLib ? false
 | 
						|
  }:
 | 
						|
  stdenv.mkDerivation {
 | 
						|
    name = "compile-c";
 | 
						|
    builder = ./compile-c.sh;
 | 
						|
    
 | 
						|
    localIncludes =
 | 
						|
      if localIncludes == "auto" then
 | 
						|
        dependencyClosure {
 | 
						|
          scanner = main:
 | 
						|
            import (findIncludes {
 | 
						|
              inherit main;
 | 
						|
            });
 | 
						|
          searchPath = localIncludePath;
 | 
						|
          startSet = [main];
 | 
						|
        }
 | 
						|
      else
 | 
						|
        localIncludes;
 | 
						|
        
 | 
						|
    inherit main;
 | 
						|
    
 | 
						|
    cFlags = [
 | 
						|
      cFlags
 | 
						|
      (if sharedLib then ["-fpic"] else [])
 | 
						|
      (map (p: "-I" + (relativise (dirOf main) p)) localIncludePath)
 | 
						|
    ];
 | 
						|
  };
 | 
						|
 | 
						|
  
 | 
						|
  findIncludes = {main}: stdenv.mkDerivation {
 | 
						|
    name = "find-includes";
 | 
						|
    realBuilder = pkgs.perl ~ "bin/perl";
 | 
						|
    args = [ ./find-includes.pl ];
 | 
						|
    inherit main;
 | 
						|
  };
 | 
						|
 | 
						|
    
 | 
						|
  link = {objects, programName ? "program", libraries ? []}: stdenv.mkDerivation {
 | 
						|
    name = "link";
 | 
						|
    builder = ./link.sh;
 | 
						|
    inherit objects programName libraries;
 | 
						|
  };
 | 
						|
 | 
						|
  
 | 
						|
  makeLibrary = {objects, libraryName ? [], sharedLib ? false}:
 | 
						|
  # assert sharedLib -> fold (obj: x: assert obj.sharedLib && x) false objects
 | 
						|
  stdenv.mkDerivation {
 | 
						|
    name = "library";
 | 
						|
    builder = ./make-library.sh;
 | 
						|
    inherit objects libraryName sharedLib;
 | 
						|
  };
 | 
						|
 | 
						|
  
 | 
						|
}
 |