diff --git a/.rootlogon.C b/.rootlogon.C index bc835ddb588932bd588d4bbf0462ffb8831fec05..025be51bcca847232897930f3689e12612539c23 100644 --- a/.rootlogon.C +++ b/.rootlogon.C @@ -7,9 +7,9 @@ void _rootlogon() { // check if we requested a special build directory through the environment, const char* build_dir_from_env = gSystem->Getenv("ROOT_BUILD_TMPDIR"); - const std::string build_dir = build_dir_from_env ? build_dir_from_env : "$HOME/.root_build_dir"; + const std::string build_dir = build_dir_from_env ? build_dir_from_env : "$PWD/.root_build_dir"; - // ensure the build directory exists to avoid crashes due a directory + // ensure the build directory exists to avoid crashes due to it missing // note: in principle this allows us to execute arbitrary code, but seeing // as this can only be manipulated through the shell environment in the // first place this should not be a safety concern. @@ -18,7 +18,12 @@ void _rootlogon() { // Communicate what build directory we are using std::cout << "---> Setting ACLiC build directory to: " << build_dir << "\n\n"; - gSystem->SetBuildDir(build_dir.c_str()); + // Make the ROOT build process use a flat build directory by setting + // second arg to kTRUE. This avoids an apparent race condition in ROOT + // associated with child directory creation in the default 'kFALSE' mode. + // The default mode will work correctly on the 2nd execution. OK for + // interactive use, but not great for the Farm environment. + gSystem->SetBuildDir(build_dir.c_str(), kTRUE); // Ensure we have our environment setup gROOT->ProcessLine(".include /usr/local/include/hcana");