From 626bd6434662436423d0c5cd9689149076ebed07 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 22 Feb 2024 09:28:16 +0200 Subject: Detect non-cc::link_rule libraries not marked with cc.type=cc Fixes GH issue #368. --- libbuild2/target.hxx | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'libbuild2/target.hxx') diff --git a/libbuild2/target.hxx b/libbuild2/target.hxx index 0d4eece..20cd32d 100644 --- a/libbuild2/target.hxx +++ b/libbuild2/target.hxx @@ -1219,13 +1219,28 @@ namespace build2 } template - typename std::enable_if::value, T&>::type& + typename std::enable_if::value, T&>::type data (action a) const { using V = typename std::remove_cv::type; return state[a].recipe.target> ()->d; } + // Return NULL if there is no data or the data is of a different type. + // + template + typename std::enable_if::value, T*>::type + try_data (action a) const + { + using V = typename std::remove_cv::type; + + if (auto& r = state[a].recipe) + if (auto* t = r.target> ()) + return &t->d; + + return nullptr; + } + // Note that in this case we don't strip const (the expectation is that we // move the recipe in/out of data). // @@ -1250,12 +1265,20 @@ namespace build2 } template - typename std::enable_if::value, T&>::type& + typename std::enable_if::value, T&>::type data (action a) const { return *state[a].recipe.target (); } + template + typename std::enable_if::value, T*>::type + try_data (action a) const + { + auto& r = state[a].recipe; + return r ? r.target () : nullptr; + } + // Target type info and casting. // public: -- cgit v1.1