// file      : libbuild2/cc/common.txx -*- C++ -*-
// license   : MIT; see accompanying LICENSE file

namespace build2
{
  namespace cc
  {
    // Insert a target "tagging" it with the specified process path and
    // verifying that it already exists if requested. Return the lock.
    //
    template <typename T>
    ulock common::
    insert_library (context& ctx,
                    T*& r,
                    string name,
                    dir_path dir,
                    const process_path& out,
                    optional<string> ext,
                    bool exist,
                    tracer& trace)
    {
      auto p (ctx.targets.insert_locked (
                T::static_type,
                move (dir),
                dir_path (out.effect_string ()).normalize (),
                name,
                move (ext),
                target_decl::implied,
                trace));

      if (exist && p.second)
        throw non_existent_library {p.first.template as<mtime_target> ()};

      r = &p.first.template as<T> ();
      return move (p.second);
    }
  }
}