diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2017-08-02 11:18:38 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2017-08-02 11:33:51 +0200 |
commit | e65c406301c3a7b30174f8706ba39584e80ddf25 (patch) | |
tree | 39ab598476f4965616979f498e016e3f7913008c /build2/cc/pkgconfig.cxx | |
parent | e8ef2fbd339afd8113bd92d371bc49d7d570c32f (diff) |
Save module map to pkg-config files
Diffstat (limited to 'build2/cc/pkgconfig.cxx')
-rw-r--r-- | build2/cc/pkgconfig.cxx | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/build2/cc/pkgconfig.cxx b/build2/cc/pkgconfig.cxx index 8d0ea25..d320060 100644 --- a/build2/cc/pkgconfig.cxx +++ b/build2/cc/pkgconfig.cxx @@ -733,6 +733,56 @@ namespace build2 os << endl; + // If we have modules, list them in the modules variable. This code + // is pretty similar to compiler::search_modules(). + // + if (modules) + { + os << endl + << "modules ="; + + for (const target* pt: l.prerequisite_targets) + { + // @@ UTL: we need to (recursively) see through libux{} (and + // also in search_modules()). + // + if (pt != nullptr && + (pt->is_a<bmis> () || + pt->is_a<bmia> () || + pt->is_a<bmie> ())) + { + // What we have is a binary module interface. What we need is + // a module interface source it was built from. We assume it's + // the first mxx{} target that we see. + // + const target* mt (nullptr); + for (const target* t: pt->prerequisite_targets) + { + if ((mt = t->is_a (*x_mod))) + break; + } + + // Can/should there be a bmi{} without mxx{}? Can't think of a + // reason. + // + assert (mt != nullptr); + + path p (install::resolve_file (mt->as<file> ())); + + if (p.empty ()) // Not installed. + continue; + + const string& n (cast<string> (pt->vars[c_module_name])); + + // Module name shouldn't require escaping. + // + os << ' ' << n << '=' << escape (p.string ()); + } + } + + os << endl; + } + os.close (); arm.cancel (); } |