static void setupEnvVar(std::istringstream& iss, const char** var, const char* varname) { std::string line; std::string value; std::getline(iss, line); if (!iss.good() || line.find(varname) == std::string::npos) { INT_FATAL(astr("Parsing ", varname)); } value = line.substr(line.find('=')+1, std::string::npos); *var = astr(value.c_str()); // astr call is to canonicalize parseCmdLineConfig(varname, astr("\"", *var, "\"")); }
static void readConfig(ArgumentState* arg_state, char* arg_unused) { // Expect arg_unused to be a string of either of these forms: // 1. name=value -- set the config param "name" to "value" // 2. name -- set the boolean config param "name" to NOT("name") // if name is not type bool, set it to 0. char *name = strdup(arg_unused); char *value; value = strstr(name, "="); if (value) { *value = '\0'; value++; if (value[0]) { // arg_unused was name=value parseCmdLineConfig(name, value); } else { // arg_unused was name= <blank> USR_FATAL("Missing config param value"); } } else { // arg_unused was just name parseCmdLineConfig(name, ""); } }
static void setWarnDomainLiteral(ArgumentState* arg_state, char* unused) { const char *val = fNoWarnDomainLiteral ? "false" : "true"; parseCmdLineConfig("CHPL_WARN_DOMAIN_LITERAL", astr("\"", val, "\"")); }
static void setWarnTupleIteration(ArgumentState* arg_state, char* unused) { const char *val = fNoWarnTupleIteration ? "false" : "true"; parseCmdLineConfig("CHPL_WARN_TUPLE_ITERATION", astr("\"", val, "\"")); }
static const char* setupEnvVar(const char* varname, const char* script) { const char* val = runUtilScript(script); parseCmdLineConfig(varname, astr("\"", val, "\"")); return val; }
static void setupChplHome(const char* argv0) { const char* chpl_home = getenv("CHPL_HOME"); char* guess = NULL; // Get the executable path. guess = findProgramPath(argv0); if (guess) { // Determine CHPL_HOME based on the exe path. // Determined exe path, but don't have a env var set // Look for ../../../util/chplenv // Remove the /bin/some-platform/chpl part // from the path. if( guess[0] ) { int j = strlen(guess) - 5; // /bin and '\0' for( ; j >= 0; j-- ) { if( guess[j] == '/' && guess[j+1] == 'b' && guess[j+2] == 'i' && guess[j+3] == 'n' ) { guess[j] = '\0'; break; } } } if( isMaybeChplHome(guess) ) { // OK! } else { // Maybe we are in e.g. /usr/bin. free(guess); guess = NULL; } } if( chpl_home ) { if( strlen(chpl_home) > FILENAME_MAX ) USR_FATAL("$CHPL_HOME=%s path too long", chpl_home); if( guess == NULL ) { // Could not find exe path, but have a env var set strncpy(CHPL_HOME, chpl_home, FILENAME_MAX); } else { // We have env var and found exe path. // Check that they match and emit a warning if not. if( ! isSameFile(chpl_home, guess) ) { // Not the same. Emit warning. USR_WARN("$CHPL_HOME=%s mismatched with executable home=%s", chpl_home, guess); } // Since we have an enviro var, always use that. strncpy(CHPL_HOME, chpl_home, FILENAME_MAX); } } else { if( guess == NULL ) { // Could not find enviro var, and could not // guess at exe's path name. USR_FATAL("$CHPL_HOME must be set to run chpl"); } else { int rc; if( strlen(guess) > FILENAME_MAX ) USR_FATAL("chpl guessed home %s too long", guess); // Determined exe path, but don't have a env var set strncpy(CHPL_HOME, guess, FILENAME_MAX); // Also need to setenv in this case. rc = setenv("CHPL_HOME", guess, 0); if( rc ) USR_FATAL("Could not setenv CHPL_HOME"); } } // Check that the resulting path is a Chapel distribution. if( ! isMaybeChplHome(CHPL_HOME) ) { // Bad enviro var. USR_WARN("CHPL_HOME=%s is not a Chapel distribution", CHPL_HOME); } if( guess ) free(guess); parseCmdLineConfig("CHPL_HOME", astr("\"", CHPL_HOME, "\"")); }
static void setWarnDomainLiteral(const ArgumentDescription* desc, const char* unused) { const char *val = fNoWarnDomainLiteral ? "false" : "true"; parseCmdLineConfig("CHPL_WARN_DOMAIN_LITERAL", astr("\"", val, "\"")); }
static void setCacheEnable(const ArgumentDescription* desc, const char* unused) { const char *val = fCacheRemote ? "true" : "false"; parseCmdLineConfig("CHPL_CACHE_REMOTE", val); }