From 618c44ec5e85f7d07540234a0de9fac6e2913243 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 31 Mar 2015 06:29:05 +0200 Subject: Save config.build --- build/config/module.cxx | 4 ++-- build/config/operation.cxx | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) (limited to 'build/config') diff --git a/build/config/module.cxx b/build/config/module.cxx index 41c2526..59fbb1f 100644 --- a/build/config/module.cxx +++ b/build/config/module.cxx @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -20,9 +21,8 @@ namespace build trigger (scope&, const path& p) { tracer trace ("config::trigger"); - level4 ([&]{trace << "intercepted sourcing of " << p;}); - return false; + return file_exists (p); } void diff --git a/build/config/operation.cxx b/build/config/operation.cxx index df4682e..baafc97 100644 --- a/build/config/operation.cxx +++ b/build/config/operation.cxx @@ -65,6 +65,56 @@ namespace build } static void + save_config (const path& out_root) + { + path f (out_root / config_file); + + if (verb >= 1) + text << "config::save_config " << f.string (); + else + text << "save " << f; + + try + { + ofstream ofs (f.string ()); + if (!ofs.is_open ()) + fail << "unable to open " << f; + + ofs.exceptions (ofstream::failbit | ofstream::badbit); + + // Save all the variables in the config. namespace that are set + // on the project's root scope. + // + scope& r (scopes.find (out_root)); + + /* + r.variables["config"] = "default interactive"; + r.variables["config.cxx"] = "g++-4.9"; + r.variables["config.cxx.options"] = "-O3 -g"; + */ + + for (auto p (r.variables.find_namespace ("config")); + p.first != p.second; + ++p.first) + { + const variable& var (p.first->first); + const value& val (*p.first->second); + + //@@ TODO: assuming list + // + const list_value& lv (dynamic_cast (val)); + + ofs << var.name << " = " << lv.data << endl; + text << var.name << " = " << lv.data; + } + } + catch (const ios_base::failure&) + { + fail << "failed to write to " << f; + } + } + + static void configure_execute (action a, const action_targets& ts) { tracer trace ("configure_execute"); @@ -98,6 +148,10 @@ namespace build // if (out_root != src_root) save_src_root (out_root, src_root); + + // Save config.build. + // + save_config (out_root); } else { -- cgit v1.1