aboutsummaryrefslogtreecommitdiff
path: root/build2/cxx/link
diff options
context:
space:
mode:
Diffstat (limited to 'build2/cxx/link')
-rw-r--r--build2/cxx/link70
1 files changed, 70 insertions, 0 deletions
diff --git a/build2/cxx/link b/build2/cxx/link
new file mode 100644
index 0000000..c7f7019
--- /dev/null
+++ b/build2/cxx/link
@@ -0,0 +1,70 @@
+// file : build2/cxx/link -*- C++ -*-
+// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef BUILD2_CXX_LINK
+#define BUILD2_CXX_LINK
+
+#include <vector>
+
+#include <butl/optional>
+
+#include <build2/types>
+#include <build2/rule>
+
+#include <build2/bin/target>
+
+namespace build2
+{
+ namespace cxx
+ {
+ class link: public rule
+ {
+ public:
+ virtual match_result
+ match (action, target&, const std::string& hint) const;
+
+ virtual recipe
+ apply (action, target&, const match_result&) const;
+
+ static target_state
+ perform_update (action, target&);
+
+ static link instance;
+
+ public:
+ enum class type {e, a, so};
+ enum class order {a, so, a_so, so_a};
+
+ static type
+ link_type (target& t)
+ {
+ return t.is_a<bin::exe> ()
+ ? type::e
+ : (t.is_a<bin::liba> () ? type::a : type::so);
+ }
+
+ static order
+ link_order (target&);
+
+ // Determine the library member (liba or libso) to link.
+ //
+ static target&
+ link_member (bin::lib&, order);
+
+ private:
+ friend class compile;
+
+ using search_paths = std::vector<dir_path>;
+ using search_paths_cache = butl::optional<search_paths>;
+
+ static target*
+ search_library (search_paths_cache&, prerequisite&);
+
+ static search_paths
+ extract_library_paths (scope&);
+ };
+ }
+}
+
+#endif // BUILD2_CXX_LINK