diff options
Diffstat (limited to 'build2/cc/link.hxx')
-rw-r--r-- | build2/cc/link.hxx | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/build2/cc/link.hxx b/build2/cc/link.hxx new file mode 100644 index 0000000..4dc722a --- /dev/null +++ b/build2/cc/link.hxx @@ -0,0 +1,130 @@ +// file : build2/cc/link.hxx -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BUILD2_CC_LINK_HXX +#define BUILD2_CC_LINK_HXX + +#include <set> + +#include <build2/types.hxx> +#include <build2/utility.hxx> + +#include <build2/rule.hxx> + +#include <build2/cc/types.hxx> +#include <build2/cc/common.hxx> + +namespace build2 +{ + namespace cc + { + class link: public rule, virtual common + { + public: + link (data&&); + + virtual match_result + match (action, target&, const string&) const override; + + virtual recipe + apply (action, target&) const override; + + target_state + perform_update (action, const target&) const; + + target_state + perform_clean (action, const target&) const; + + private: + friend class install; + + // Shared library paths. + // + struct libs_paths + { + // If any (except real) is empty, then it is the same as the next + // one. Except for intermediate, for which empty indicates that it is + // not used. + // + // The libs{} path is always the real path. On Windows the link path + // is the import library. + // + const path link; // What we link: libfoo.so + const path soname; // SONAME: libfoo-1.so, libfoo.so.1 + const path interm; // Intermediate: libfoo.so.1.2 + const path& real; // Real: libfoo.so.1.2.3 + + inline const path& + effect_link () const {return link.empty () ? effect_soname () : link;} + + inline const path& + effect_soname () const {return soname.empty () ? real : soname;} + + // Cleanup pattern used to remove previous versions. If empty, no + // cleanup is performed. The above (current) names are automatically + // filtered out. + // + const path clean; + }; + + libs_paths + derive_libs_paths (file&) const; + + // Library handling. + // + void + append_libraries (strings&, + const file&, bool, + const scope&, action, lorder) const; + + void + hash_libraries (sha256&, + const file&, bool, + const scope&, action, lorder) const; + + void + rpath_libraries (strings&, + const target&, + const scope&, action, lorder, + bool) const; + + // Windows rpath emulation (windows-rpath.cxx). + // + struct windows_dll + { + const string& dll; + const string* pdb; // NULL if none. + string pdb_storage; + + bool operator< (const windows_dll& y) const {return dll < y.dll;} + }; + + using windows_dlls = std::set<windows_dll>; + + timestamp + windows_rpath_timestamp (const file&, + const scope&, + action, lorder) const; + + windows_dlls + windows_rpath_dlls (const file&, const scope&, action, lorder) const; + + void + windows_rpath_assembly (const file&, const scope&, action, lorder, + const string&, + timestamp, + bool) const; + + // Windows-specific (windows-manifest.cxx). + // + pair<path, bool> + windows_manifest (const file&, bool rpath_assembly) const; + + private: + const string rule_id; + }; + } +} + +#endif // BUILD2_CC_LINK_HXX |