Added support for passing an (impure) NIX_BUILD_CORES variable to build expressions.
This patch adds the configuration file variable "build-cores" and the command line argument "--cores". These settings specify the number of CPU cores to utilize for parallel building within a job, i.e. by passing an appropriate "-j" flag to GNU Make. The default value is 1, which means that parallel building is *disabled*. If the number of build cores is specified as 0 (synonymously: "guess" or "auto"), then the actual value is supposed to be auto-detected by builders at run-time, i.e by calling the nproc(1) utility from coreutils. The environment variable $NIX_BUILD_CORES is available to builders, but the contents of that variable does *not* influence the hash that goes into the $out store path, i.e. the number of build cores to be utilized can be changed at will without requiring any re-builds.
This commit is contained in:
		
							parent
							
								
									819548d92f
								
							
						
					
					
						commit
						8b7f8b56f1
					
				
					 5 changed files with 35 additions and 0 deletions
				
			
		|  | @ -59,6 +59,18 @@ | ||||||
| #build-max-jobs = 1 | #build-max-jobs = 1 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | ### Option `build-cores' | ||||||
|  | # | ||||||
|  | # This option defines the number of CPU cores to utilize in parallel | ||||||
|  | # within a build job, i.e. by passing an appropriate `-jN' flag to | ||||||
|  | # GNU make. The default is 1, meaning that parallel building within | ||||||
|  | # jobs is disabled. Passing the special values `0', `auto', or | ||||||
|  | # `guess' causes Nix to try and auto-detect the number of available | ||||||
|  | # cores on the local host. This setting can be overridden using the | ||||||
|  | # `--cores' command line switch. | ||||||
|  | #build-cores = 1 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| ### Option `build-max-silent-time' | ### Option `build-max-silent-time' | ||||||
| # | # | ||||||
| # This option defines the maximum number of seconds that a builder can | # This option defines the maximum number of seconds that a builder can | ||||||
|  |  | ||||||
|  | @ -135,6 +135,12 @@ static void initAndRun(int argc, char * * argv) | ||||||
|     /* Get some settings from the configuration file. */ |     /* Get some settings from the configuration file. */ | ||||||
|     thisSystem = querySetting("system", SYSTEM); |     thisSystem = querySetting("system", SYSTEM); | ||||||
|     maxBuildJobs = queryIntSetting("build-max-jobs", 1); |     maxBuildJobs = queryIntSetting("build-max-jobs", 1); | ||||||
|  |     string tmp = querySetting("build-cores", "/UNDEFINED"); | ||||||
|  |     std::transform(tmp.begin(), tmp.end(), tmp.begin(), tolower); | ||||||
|  |     if (tmp == "auto" || tmp == "guess") | ||||||
|  |       buildCores = 0; | ||||||
|  |     else | ||||||
|  |       buildCores = queryIntSetting("build-cores", 1); | ||||||
|     maxSilentTime = queryIntSetting("build-max-silent-time", 0); |     maxSilentTime = queryIntSetting("build-max-silent-time", 0); | ||||||
| 
 | 
 | ||||||
|     /* Catch SIGINT. */ |     /* Catch SIGINT. */ | ||||||
|  | @ -226,6 +232,14 @@ static void initAndRun(int argc, char * * argv) | ||||||
|             tryFallback = true; |             tryFallback = true; | ||||||
|         else if (arg == "--max-jobs" || arg == "-j") |         else if (arg == "--max-jobs" || arg == "-j") | ||||||
|             maxBuildJobs = getIntArg<unsigned int>(arg, i, args.end()); |             maxBuildJobs = getIntArg<unsigned int>(arg, i, args.end()); | ||||||
|  |         else if (arg == "--cores") { | ||||||
|  |             string tmp = *(++i); | ||||||
|  |             std::transform(tmp.begin(), tmp.end(), tmp.begin(), tolower); | ||||||
|  |             if (tmp == "auto" || tmp == "guess") | ||||||
|  |               buildCores = 0u; | ||||||
|  |             else | ||||||
|  |               buildCores = getIntArg<unsigned int>(arg, --i, args.end()); | ||||||
|  |         } | ||||||
|         else if (arg == "--readonly-mode") |         else if (arg == "--readonly-mode") | ||||||
|             readOnlyMode = true; |             readOnlyMode = true; | ||||||
|         else if (arg == "--max-silent-time") |         else if (arg == "--max-silent-time") | ||||||
|  |  | ||||||
|  | @ -1411,6 +1411,9 @@ void DerivationGoal::startBuilder() | ||||||
|        in the store or in the build directory). */ |        in the store or in the build directory). */ | ||||||
|     env["NIX_STORE"] = nixStore; |     env["NIX_STORE"] = nixStore; | ||||||
| 
 | 
 | ||||||
|  |     /* The maximum number of cores to utilize for parallel building. */ | ||||||
|  |     env["NIX_BUILD_CORES"] = (format("%d") % buildCores).str(); | ||||||
|  | 
 | ||||||
|     /* Add all bindings specified in the derivation. */ |     /* Add all bindings specified in the derivation. */ | ||||||
|     foreach (StringPairs::iterator, i, drv.env) |     foreach (StringPairs::iterator, i, drv.env) | ||||||
|         env[i->first] = i->second; |         env[i->first] = i->second; | ||||||
|  |  | ||||||
|  | @ -22,6 +22,7 @@ bool keepGoing = false; | ||||||
| bool tryFallback = false; | bool tryFallback = false; | ||||||
| Verbosity buildVerbosity = lvlInfo; | Verbosity buildVerbosity = lvlInfo; | ||||||
| unsigned int maxBuildJobs = 1; | unsigned int maxBuildJobs = 1; | ||||||
|  | unsigned int buildCores = 1; | ||||||
| bool readOnlyMode = false; | bool readOnlyMode = false; | ||||||
| string thisSystem = "unset"; | string thisSystem = "unset"; | ||||||
| time_t maxSilentTime = 0; | time_t maxSilentTime = 0; | ||||||
|  |  | ||||||
|  | @ -55,6 +55,11 @@ extern Verbosity buildVerbosity; | ||||||
| /* Maximum number of parallel build jobs.  0 means unlimited. */ | /* Maximum number of parallel build jobs.  0 means unlimited. */ | ||||||
| extern unsigned int maxBuildJobs; | extern unsigned int maxBuildJobs; | ||||||
| 
 | 
 | ||||||
|  | /* Number of CPU cores to utilize in parallel within a build, i.e. by passing
 | ||||||
|  |    this number to Make via '-j'. 0 means that the number of actual CPU cores on | ||||||
|  |    the local host ought to be auto-detected. */ | ||||||
|  | extern unsigned int buildCores; | ||||||
|  | 
 | ||||||
| /* Read-only mode.  Don't copy stuff to the store, don't change the
 | /* Read-only mode.  Don't copy stuff to the store, don't change the
 | ||||||
|    database. */ |    database. */ | ||||||
| extern bool readOnlyMode; | extern bool readOnlyMode; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue