Implement the correct search for configuration files. llvmc will now try

the following in this order:
 1. -config-dir=/path/to/configs
 2. LLVM_CONFIG_DIR=/path/to/configs
 3. ~/.llvm/etc
 4. $prefix/etc
 5. /etc/llvm

llvm-svn: 15950
This commit is contained in:
Reid Spencer 2004-08-20 09:24:07 +00:00
parent 6ad57b2491
commit a17a413cc1
1 changed files with 42 additions and 16 deletions

View File

@ -15,6 +15,7 @@
#include "Configuration.h"
#include "ConfigLexer.h"
#include "CompilerDriver.h"
#include "Config/config.h"
#include "Support/CommandLine.h"
#include "Support/StringExtras.h"
#include <iostream>
@ -22,6 +23,11 @@
using namespace llvm;
namespace sys {
// From CompilerDriver.cpp (for now)
extern bool FileReadable(const std::string& fname);
}
namespace llvm {
ConfigLexerInfo ConfigLexerState;
InputProvider* ConfigLexerInput = 0;
@ -389,27 +395,47 @@ namespace {
CompilerDriver::ConfigData*
LLVMC_ConfigDataProvider::ReadConfigData(const std::string& ftype) {
CompilerDriver::ConfigData* result = 0;
std::string dir_name;
if (configDir.empty()) {
FileInputProvider fip( std::string("/etc/llvm/") + ftype );
if (!fip.okay()) {
fip.error("Configuration for '" + ftype + "' is not available.");
fip.checkErrors();
}
else {
result = new CompilerDriver::ConfigData();
ParseConfigData(fip,*result);
// Try the environment variable
const char* conf = getenv("LLVM_CONFIG_DIR");
if (conf) {
dir_name = conf;
dir_name += "/";
if (!::sys::FileReadable(dir_name + ftype))
throw "Configuration file for '" + ftype + "' is not available.";
} else {
// Try the user's home directory
const char* home = getenv("HOME");
if (home) {
dir_name = home;
dir_name += "/.llvm/etc/";
if (!::sys::FileReadable(dir_name + ftype)) {
// Okay, try the LLVM installation directory
dir_name = LLVM_ETCDIR;
dir_name += "/";
if (!::sys::FileReadable(dir_name + ftype)) {
// Okay, try the "standard" place
dir_name = "/etc/llvm/";
if (!::sys::FileReadable(dir_name + ftype)) {
throw "Configuration file for '" + ftype + "' is not available.";
}
}
}
}
}
} else {
FileInputProvider fip( configDir + "/" + ftype );
if (!fip.okay()) {
fip.error("Configuration for '" + ftype + "' is not available.");
fip.checkErrors();
}
else {
result = new CompilerDriver::ConfigData();
ParseConfigData(fip,*result);
dir_name = configDir + "/";
if (!::sys::FileReadable(dir_name + ftype)) {
throw "Configuration file for '" + ftype + "' is not available.";
}
}
FileInputProvider fip( dir_name + ftype );
if (!fip.okay()) {
throw "Configuration file for '" + ftype + "' is not available.";
}
result = new CompilerDriver::ConfigData();
ParseConfigData(fip,*result);
return result;
}