From b38e40564b78818f8ee3015e15a29078aac83d18 Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Fri, 20 Aug 2004 09:24:07 +0000 Subject: [PATCH] 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 --- tools/llvmc/Configuration.cpp | 58 +++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/tools/llvmc/Configuration.cpp b/tools/llvmc/Configuration.cpp index 1463ecaa7ee..1e0e681c921 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 @@ -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; }