diff --git a/direct/src/configfiles/Configrc b/direct/src/configfiles/Configrc.direct similarity index 100% rename from direct/src/configfiles/Configrc rename to direct/src/configfiles/Configrc.direct diff --git a/direct/src/configfiles/Sources.pp b/direct/src/configfiles/Sources.pp index 9d55cfa8b0..7d819337dc 100644 --- a/direct/src/configfiles/Sources.pp +++ b/direct/src/configfiles/Sources.pp @@ -1,2 +1,8 @@ #define INSTALL_CONFIG \ - direct.init Configrc + Configrc.direct + +#if $[CTPROJS] + // These files only matter to ctattach users. + #define INSTALL_CONFIG $[INSTALL_CONFIG] direct.init +#endif + diff --git a/dtool/Config.pp b/dtool/Config.pp index 29e9e58416..803dfee95f 100644 --- a/dtool/Config.pp +++ b/dtool/Config.pp @@ -105,12 +105,13 @@ // The Configrc file is used by Panda for runtime configuration. -// Panda will look for it in the directory specified by the -// CONFIGRC_DIR environment variable, or in the directory named here -// if that environment variable is undefined. By default, we specify -// a dot, to indicate the current directory; you may redefine this if -// you have someplace in particular you'd rather put it. -#define DEFAULT_CONFIGRC_DIR . +// Panda will load up all files named Configrc* (with any and every +// extension) in the directory specified by the CONFIGRC_DIR +// environment variable, or in the directory named here if that +// environment variable is undefined. By default, we specify the +// install/etc dir, which is where the system-provided Configrc files +// get copied to. +#defer DEFAULT_CONFIGRC_DIR $[INSTALL_DIR]/etc // What level of compiler optimization/debug symbols should we build? diff --git a/dtool/src/dconfig/configTable.I b/dtool/src/dconfig/configTable.I index 42cecce4ee..d2e363cb6a 100644 --- a/dtool/src/dconfig/configTable.I +++ b/dtool/src/dconfig/configTable.I @@ -24,6 +24,10 @@ INLINE void ConfigTable::ConfigDbgDefault() { dconfig_cat->set_severity(NS_info); } +INLINE void ConfigTable::ConfigExeDefault() { + configexe = false; +} + INLINE void ConfigTable::ReadArgsDefault() { readargs = true; } @@ -45,7 +49,7 @@ INLINE void ConfigTable::ConfigNameDefault() { } INLINE void ConfigTable::ConfigSuffixDefault() { - configsuffix = ""; + configsuffix = "*"; } INLINE void ConfigTable::ConfigArgsDefault() { @@ -53,7 +57,7 @@ INLINE void ConfigTable::ConfigArgsDefault() { } INLINE void ConfigTable::ConfigPathDefault() { - configpath = "CFG_PATH"; + configpath = ""; } INLINE void ConfigTable::ConfigCmtDefault() { diff --git a/dtool/src/dconfig/configTable.cxx b/dtool/src/dconfig/configTable.cxx index c9cec850d1..2118fa08fc 100644 --- a/dtool/src/dconfig/configTable.cxx +++ b/dtool/src/dconfig/configTable.cxx @@ -137,6 +137,17 @@ void ConfigTable::ReadConfigFile() { // intuitive definition. DSearchPath config_search; + + // The configdir variable gets priority--it names a directory that + // ends up first on the search path. + if (!configdir.empty()) { + config_search.append_directory(Filename::from_os_specific(configdir)); + } + + // Then all of the directories named (indirectly) by configpath. + // This variable actually names a space-delimited list of + // environment variable names, each of which contains a space- or + // colon-delimited search path. while (!configpath.empty()) { int i = configpath.find_first_of(" "); ConfigString stmp = configpath.substr(0, i); @@ -160,50 +171,58 @@ void ConfigTable::ReadConfigFile() { CropString(configpath); } - // If the configpath is empty, use the configdir string instead. If - // the configdir string is empty, it gets its value from the - // CONFIGRC_DIR environment variable, or from the compiled-in - // default. - if (config_search.is_empty()) { - if (configdir.empty()) { - configdir = ExecutionEnvironment::get_environment_variable("CONFIGRC_DIR"); - if (configdir.empty()) { - configdir = DEFAULT_CONFIGRC_DIR; - } - } - - config_search.append_directory(Filename::from_os_specific(configdir)); - } - if (microconfig_cat->is_spam()) { microconfig_cat->spam() - << "search path from configpath is: " + << "search path from configdir and configpath is: " << config_search << endl; } DSearchPath::Results config_files; if (!configsuffix.empty()) { - if (microconfig_cat->is_spam()) - microconfig_cat->spam() << "agregate config name is: " - << (configname + configsuffix) << endl; - config_search.find_all_files(configname + configsuffix, config_files); - if (microconfig_cat->is_spam()) - microconfig_cat->spam() << "found " << config_files.get_num_files() - << " files" << endl; + if (configsuffix == "*") { + // A configsuffix of "*" is a special case: this means to find + // all files that begin with configname. We don't do full + // globbing, though. We also make a special case for files + // ending in ~, which we always ignore (these are usually just + // backup files). + if (microconfig_cat->is_spam()) + microconfig_cat->spam() << "searching for files matching: " + << (configname + configsuffix) << endl; + for (int di = 0; di < config_search.get_num_directories(); di++) { + const Filename &directory = config_search.get_directory(di); + vector_string files; + directory.scan_directory(files); + // Scan the files in reverse order to match Configrc overwrite + // rules, so that the alphabetically earliest file has + // precedence. + for (vector_string::reverse_iterator fi = files.rbegin(); + fi != files.rend(); + ++fi) { + if ((*fi).substr(0, configname.length()) == configname && + (*fi).substr((*fi).length() - 1) != string("~")) { + Filename file(directory, (*fi)); + config_files.add_file(file); + } + } + } + + } else { + if (microconfig_cat->is_spam()) + microconfig_cat->spam() << "aggregate config name is: " + << (configname + configsuffix) << endl; + config_search.find_all_files(configname + configsuffix, config_files); + } } else { if (microconfig_cat->is_spam()) microconfig_cat->spam() << "searching for '" << configname << "'" << endl; config_search.find_all_files(configname, config_files); - if (microconfig_cat->is_spam()) - microconfig_cat->spam() << "found " << config_files.get_num_files() - << " files" << endl; } if (microconfig_cat->is_spam()) - microconfig_cat->spam() << "configpath parsed and searched" - << endl; + microconfig_cat->spam() << "found " << config_files.get_num_files() + << " files" << endl; int num_config_files = config_files.get_num_files(); for (int i = num_config_files - 1; i >= 0; i--) { @@ -219,7 +238,7 @@ void ConfigTable::ReadConfigFile() { << "file is not a regular file, ignoring.\n"; } - } else if (config_file.is_executable()) { + } else if (configexe && config_file.is_executable()) { ConfigString line = config_file.to_os_specific() + " " + configargs; if (microconfig_cat->is_spam()) microconfig_cat->spam() << "file is executable, running '" @@ -353,6 +372,15 @@ void ConfigTable::ParseArgs() { } } +void ConfigTable::ConfigDirDefault() { + // The configdir default comes from $CONFIGRC_DIR, or from the + // compiled in DEFAULT_CONFIGRC_DIR if that's unspecified. + configdir = ExecutionEnvironment::get_environment_variable("CONFIGRC_DIR"); + if (configdir.empty()) { + configdir = DEFAULT_CONFIGRC_DIR; + } +} + void ConfigTable::MicroConfig() { /* #ifndef NDEBUG @@ -376,6 +404,7 @@ void ConfigTable::MicroConfig() { microconfig_cat->spam() << "CONFIG_CONFIG = '" << cc << "'" << endl; } bool cdbg = false; + bool cexe = false; bool psep = false; bool fsep = false; bool cname = false; @@ -537,6 +566,21 @@ void ConfigTable::MicroConfig() { << "got a microconfig configdbg directive, " << "setting the config spam state to " << configdbg << endl; + } else if (tok == "configexe") { + configexe = TrueOrFalse(rest); + cexe = true; + if (configexe) { + microconfig_cat->set_severity(NS_spam); + dconfig_cat->set_severity(NS_spam); + } else { + microconfig_cat->set_severity(NS_info); + dconfig_cat->set_severity(NS_info); + } + if (microconfig_cat->is_spam()) + microconfig_cat->spam() + << "got a microconfig configexe directive, " + << "setting the config spam state to " << configexe + << endl; } else if (tok == "readargs") { readargs = TrueOrFalse(rest); rdarg = true; @@ -565,6 +609,8 @@ void ConfigTable::MicroConfig() { microconfig_cat->spam() << "CONFIG_CONFIG is empty" << endl; if (!cdbg) ConfigDbgDefault(); + if (!cexe) + ConfigExeDefault(); if (!psep) { PathSepDefault(); if (microconfig_cat->is_spam()) @@ -608,9 +654,10 @@ void ConfigTable::MicroConfig() { << "'" << endl; } if (!cdir) { + ConfigDirDefault(); if (microconfig_cat->is_spam()) microconfig_cat->spam() << "no microconfig for configdir, " - << "leaving empty: '" << configdir + << "setting to default '" << configdir << "'" << endl; } if (!ccmt) { diff --git a/dtool/src/dconfig/configTable.h b/dtool/src/dconfig/configTable.h index 466a6a4e29..6a63eedc28 100644 --- a/dtool/src/dconfig/configTable.h +++ b/dtool/src/dconfig/configTable.h @@ -44,6 +44,7 @@ private: SymbolTable unqualified; TableMap qualified; bool _initializing; + bool configexe; bool configdbg; bool readargs; bool readenvs; @@ -69,6 +70,7 @@ private: void ParseCommandEnv(ConfigString&, const ConfigString&); void ParseArgs(); INLINE void ConfigDbgDefault(); + INLINE void ConfigExeDefault(); INLINE void ReadArgsDefault(); INLINE void ReadEnvsDefault(); INLINE void PathSepDefault(); @@ -77,6 +79,7 @@ private: INLINE void ConfigSuffixDefault(); INLINE void ConfigArgsDefault(); INLINE void ConfigPathDefault(); + void ConfigDirDefault(); INLINE void ConfigCmtDefault(); INLINE void ArgSuffixDefault(); INLINE void CommandStubDefault(); diff --git a/panda/src/configfiles/Configrc b/panda/src/configfiles/Configrc.panda similarity index 100% rename from panda/src/configfiles/Configrc rename to panda/src/configfiles/Configrc.panda diff --git a/panda/src/configfiles/Sources.pp b/panda/src/configfiles/Sources.pp index 23058353d6..40d3d4a123 100644 --- a/panda/src/configfiles/Sources.pp +++ b/panda/src/configfiles/Sources.pp @@ -1,2 +1,10 @@ + #define INSTALL_CONFIG \ - panda.emacs panda.emacs.Xdefaults panda.init Configrc + panda.emacs panda.emacs.Xdefaults Configrc.panda + + +#if $[CTPROJS] + // These files only matter to ctattach users. + #define INSTALL_CONFIG $[INSTALL_CONFIG] panda.init +#endif + diff --git a/panda/src/configfiles/panda.pth b/panda/src/configfiles/panda.pth deleted file mode 100644 index a65b41774a..0000000000 --- a/panda/src/configfiles/panda.pth +++ /dev/null @@ -1 +0,0 @@ -lib