i->second->force_rebuild();
}
- for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i)
- if(SourcePackage *spkg = dynamic_cast<SourcePackage *>(i->second))
- spkg->get_deps_cache().save();
+ if(!dry_run)
+ {
+ for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i)
+ i->second->save_caches();
+ }
return 0;
}
Config::Config(SourcePackage &p):
package(p),
- freeze_mtime(false)
+ freeze_mtime(false),
+ changed(false)
{ }
void Config::add_option(const string &n, const string &v, const string &d)
{
set_option("profile", profile);
- if(!package.get_builder().get_dry_run())
- {
- IO::BufferedFile out((package.get_source()/".profile").str(), IO::M_WRITE);
- IO::print(out, "%s\n", profile);
- }
-
freeze_mtime = true;
package.get_builder().apply_profile_template(*this, profile);
freeze_mtime = false;
bool Config::update(const StringMap &opts)
{
- bool changed = false;
+ bool changed_now = false;
for(StringMap::const_iterator i=opts.begin(); i!=opts.end(); ++i)
{
if(set_option(i->first, i->second) && i->first!="profile")
- changed = true;
+ changed_now = true;
}
- if(changed && !freeze_mtime)
+ if(changed_now && !freeze_mtime)
+ {
mtime = Time::now();
+ changed = true;
+ }
- return changed;
+ return changed_now;
}
void Config::finish()
void Config::save() const
{
+ if(!changed)
+ return;
+
FS::Path fn = package.get_source()/".options";
OptionMap::const_iterator i = options.find("profile");
if(i!=options.end())
+ {
fn = package.get_source()/(".options."+i->second.value);
+ IO::BufferedFile profile_out((package.get_source()/".profile").str(), IO::M_WRITE);
+ IO::print(profile_out, "%s\n", i->second.value);
+ }
+
IO::BufferedFile out(fn.str(), IO::M_WRITE);
for(i=options.begin(); i!=options.end(); ++i)
OptionMap options;
Msp::Time::TimeStamp mtime;
bool freeze_mtime;
+ bool changed;
public:
Config(SourcePackage &);
present, the default profile is assumed. */
void select_last_profile();
- /** Selects a profile. The profile cache file is updated, unless doing a
- dry run. */
+ /** Selects a profile. */
void select_profile(const std::string &);
/** Processes options from the given raw option map. Nonexistent options
void DependencyCache::save() const
{
- if(deps.empty() || !changed || package.get_builder().get_dry_run())
+ if(deps.empty() || !changed)
return;
IO::BufferedFile out((package.get_source()/".deps").str(), IO::M_WRITE);
public:
virtual void create_targets() { }
+
+ virtual void save_caches() { }
};
#endif
config.select_last_profile();
if(flag && config.update(opts))
- {
builder.get_logger().log("configure", format("Configuration of %s changed", name));
- if(!builder.get_dry_run())
- config.save();
- }
config.finish();
}
}
+void SourcePackage::save_caches()
+{
+ config.save();
+ deps_cache.save();
+}
+
SourcePackage::Loader::Loader(SourcePackage &p):
DataFile::DerivedObjectLoader<SourcePackage, Package>(p)
virtual void create_build_info();
virtual void create_targets();
+
+ virtual void save_caches();
};
#endif