From 65f77bb9a9556033a0bfb7401dd9a00120e27524 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 4 Nov 2021 13:41:23 +0200 Subject: Do not apply install scope to update-for-install pre-operation --- libbuild2/cc/link-rule.cxx | 7 +++++++ libbuild2/cc/pkgconfig.cxx | 38 ++++++++++++++++++++++++++------------ libbuild2/install/rule.cxx | 4 ++-- libbuild2/install/utility.hxx | 4 ++++ 4 files changed, 39 insertions(+), 14 deletions(-) (limited to 'libbuild2') diff --git a/libbuild2/cc/link-rule.cxx b/libbuild2/cc/link-rule.cxx index fa9a1f1..79de01c 100644 --- a/libbuild2/cc/link-rule.cxx +++ b/libbuild2/cc/link-rule.cxx @@ -2379,6 +2379,13 @@ namespace build2 // install or no install, the reason is unless and until we are updating // for install, we have no idea where-to things will be installed. // + // There is a further complication: we may have no intention of + // installing the library but still need to update it for install (see + // install_scope() for background). In which case we may still not have + // the installation directories. We handle this in pkconfig_save() by + // skipping the generation of .pc files (and letting the install rule + // complain if we do end up trying to install them). + // if (for_install && lt.library () && !lt.utility) { bool la (lt.static_library ()); diff --git a/libbuild2/cc/pkgconfig.cxx b/libbuild2/cc/pkgconfig.cxx index 3033a2b..54fc05f 100644 --- a/libbuild2/cc/pkgconfig.cxx +++ b/libbuild2/cc/pkgconfig.cxx @@ -1461,18 +1461,6 @@ namespace build2 /* */ pcs::static_type))); assert (t != nullptr); - // This is the lib{} group if we are generating the common file and the - // target itself otherwise. - // - const file& g (common ? l.group->as () : l); - - // By default we assume things go into install.{include, lib}. - // - using install::resolve_dir; - - dir_path idir (resolve_dir (g, cast (g["install.include"]))); - dir_path ldir (resolve_dir (g, cast (g["install.lib"]))); - const path& p (t->path ()); // If we are uninstalling, skip regenerating the file if it already @@ -1485,6 +1473,32 @@ namespace build2 return; } + // This is the lib{} group if we are generating the common file and the + // target itself otherwise. + // + const file& g (common ? l.group->as () : l); + + // By default we assume things go into install.{include, lib}. + // + // If include.lib does not resolve, then assume this is update-for- + // install without actual install and remove the file if it exists. + // + // @@ Shouldn't we use target's install value rather than install.lib + // in case it gets installed into a custom location? + // + using install::resolve_dir; + + dir_path ldir (resolve_dir (g, + cast (g["install.lib"]), + false /* fail_unknown */)); + if (ldir.empty ()) + { + rmfile (ctx, p, 3 /* verbosity */); + return; + } + + dir_path idir (resolve_dir (g, cast (g["install.include"]))); + // Note that generation can take some time if we have a large number of // prerequisite libraries. // diff --git a/libbuild2/install/rule.cxx b/libbuild2/install/rule.cxx index 2d81067..d4c70c0 100644 --- a/libbuild2/install/rule.cxx +++ b/libbuild2/install/rule.cxx @@ -105,7 +105,7 @@ namespace build2 // iterates over all its members. // if (!is) - is = install_scope (t); + is = a.operation () != update_id ? install_scope (t) : nullptr; const target* pt (filter (*is, a, t, i)); if (pt == nullptr) @@ -366,7 +366,7 @@ namespace build2 // iterates over all its members. // if (!is) - is = install_scope (t); + is = a.operation () != update_id ? install_scope (t) : nullptr; const target* pt (filter (*is, a, t, i)); diff --git a/libbuild2/install/utility.hxx b/libbuild2/install/utility.hxx index cc5cd53..52b9a54 100644 --- a/libbuild2/install/utility.hxx +++ b/libbuild2/install/utility.hxx @@ -61,6 +61,10 @@ namespace build2 // belong to projects outside of this scope. If it's NULL, install // prerequisites from all projects. See also config.install.scope. // + // Note that this should not apply to update-for-install. Failed that we + // may end up using incompatibly-built prerequisites (e.g., a library) in + // a target built for install (e.g., an executable). + // LIBBUILD2_SYMEXPORT const scope* install_scope (const target&); -- cgit v1.1