@@ -191,7 +191,7 @@ void setupEnvironmentVariablesForPackageTree(ProjectNode root)
191191 // /Path to a specific package that is part of the package's dependency graph. $ must be in uppercase letters without the semver string.
192192 // <PKG>_PACKAGE_DIR ;
193193 foreach (ProjectNode mem; root.collapse)
194- setEnvVariable (asPackageVariable(mem.name)~ " _PACKAGE_DIR" , mem.requirements.cfg.workingDir.forceTrailingDirSeparator);
194+ setEnvVariableNoLock (asPackageVariable(mem.name)~ " _PACKAGE_DIR" , mem.requirements.cfg.workingDir.forceTrailingDirSeparator);
195195}
196196
197197/**
@@ -226,14 +226,12 @@ PackageDubVariables getEnvironmentVariablesForPackage(const BuildConfiguration c
226226 */
227227void setupEnvironmentVariablesForPackage (const BuildConfiguration cfg)
228228{
229- import std.process ;
230229 PackageDubVariables pack = getEnvironmentVariablesForPackage(cfg);
231230 static foreach (mem; __traits (allMembers, PackageDubVariables))
232- setEnvVariable (mem, __traits (getMember, pack, mem));
231+ setEnvVariableNoLock (mem, __traits (getMember, pack, mem));
233232}
234233string parseStringWithEnvironment (string str)
235234{
236- import std.process ;
237235 import std.exception ;
238236 import std.string ;
239237 import std.ascii :isAlphaNum;
@@ -338,7 +336,29 @@ unittest
338336 parseStringWithEnvironment(` C:\Users\Marcelo\Documents\D\test\sokol-d\${SOKOL_D_PACKAGE_DIR}\src\sokol\c\sokol_log.c` ) ==
339337 ` C:\Users\Marcelo\Documents\D\test\sokol-d\test\src\sokol\c\sokol_log.c`
340338 );
339+ }
341340
341+ /**
342+ * cfg = Config to parse environment inside the preGenerateCommands
343+ * outEnv = Output environment to be used for the preGenerateCommands
344+ */
345+ BuildConfiguration parseEnvironmentForPreGenerate (BuildConfiguration cfg, out string [string ] outEnv)
346+ {
347+ // In this part it does need to lock since it runs on parallel.
348+ PackageDubVariables pack = getEnvironmentVariablesForPackage(cfg);
349+ lockEnv();
350+ scope (exit)
351+ unlockEnv();
352+ static foreach (mem; __traits (allMembers, PackageDubVariables))
353+ setEnvVariableNoLock(mem, __traits (getMember, pack, mem));
354+ outEnv = getRedubEnv();
355+ redub.parsers.environment.setupEnvironmentVariablesForPackage(cfg);
356+ with (cfg)
357+ {
358+ if (cfg.commands.length > RedubCommands.preGenerate)
359+ cfg.commands[RedubCommands.preGenerate] = arrParseEnv(cfg.commands[RedubCommands.preGenerate]);
360+ }
361+ return cfg;
342362}
343363
344364/**
@@ -360,8 +380,6 @@ BuildConfiguration parseEnvironment(BuildConfiguration cfg)
360380 dFlags = arrParseEnv(dFlags);
361381 linkFlags = arrParseEnv(linkFlags);
362382
363- if (cfg.commands.length > RedubCommands.preGenerate)
364- cfg.commands[RedubCommands.preGenerate] = arrParseEnv(cfg.commands[RedubCommands.preGenerate]);
365383 if (cfg.commands.length > RedubCommands.postGenerate)
366384 cfg.commands[RedubCommands.postGenerate] = arrParseEnv(cfg.commands[RedubCommands.postGenerate]);
367385 if (cfg.commands.length > RedubCommands.preBuild)
@@ -447,7 +465,9 @@ version(AsLibrary) //Library version will use environment instead of redubEnv si
447465 * key =
448466 * value =
449467 */
468+
450469 void setEnvVariable (string key, string value){environment[key] = value;}
470+ alias setEnvVariableNoLock = setEnvVariable;
451471 /**
452472 * Gets the environment as a string[string] to be used inside a function
453473 * Returns:
@@ -478,6 +498,8 @@ version(AsLibrary) //Library version will use environment instead of redubEnv si
478498 }
479499 return null ;
480500 }
501+ void lockEnv (){}
502+ alias unlockEnv = lockEnv;
481503}
482504else
483505{
@@ -491,7 +513,12 @@ else
491513 redubEnv[key] = value;
492514 }
493515 }
516+
517+ void setEnvVariableNoLock (string key, string value){redubEnv[key] = value;}
494518 string [string ] getRedubEnv (){return redubEnv;}
519+
520+ void lockEnv (){envMutex.lock();}
521+ void unlockEnv (){envMutex.unlock();}
495522 string getEnvVariable (string key)
496523 {
497524 string * ret = key in redubEnv;
0 commit comments