diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-08-20 09:24:07 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-08-20 09:24:07 +0000 |
commit | b38e40564b78818f8ee3015e15a29078aac83d18 (patch) | |
tree | c414f6bd00bed1c4c792dcdddbe668f36d31c93b /tools/llvmc/Configuration.cpp | |
parent | aa43a4b0250369741f1bafd2a251aaadcd0ed0e7 (diff) |
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
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15950 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvmc/Configuration.cpp')
-rw-r--r-- | tools/llvmc/Configuration.cpp | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/tools/llvmc/Configuration.cpp b/tools/llvmc/Configuration.cpp index 1463ecaa7e..1e0e681c92 100644 --- a/tools/llvmc/Configuration.cpp +++ b/tools/llvmc/Configuration.cpp @@ -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; } |