// file      : build/file -*- C++ -*-
// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

#ifndef BUILD_FILE
#define BUILD_FILE

#include <build/path>
#include <build/name>
#include <build/variable> // list_value

namespace build
{
  class scope;
  class location;

  bool
  is_src_root (const dir_path&);

  bool
  is_out_root (const dir_path&);

  void
  source (const path& buildfile, scope& root, scope& base);

  // As above but first check if this buildfile has already been
  // sourced for the base scope.
  //
  void
  source_once (const path& buildfile, scope& root, scope& base);

  // As above but checks against the specified scope rather than base.
  //
  void
  source_once (const path& buildfile, scope& root, scope& base, scope& once);

  // Create project's root scope. Only set the src_root variable if the
  // passed src_root value is not empty.
  //
  scope&
  create_root (const dir_path& out_root, const dir_path& src_root);

  // Bootstrap the project's root scope, the out part.
  //
  void
  bootstrap_out (scope& root);

  // Bootstrap the project's root scope, the src part. Return true if
  // we loaded anything.
  //
  bool
  bootstrap_src (scope& root);

  // Create and bootstrap outer root scopes, if any. Loading is
  // done by load_root_pre() below.
  //
  void
  create_bootstrap_outer (scope& root);

  // Create and bootstrap inner root scopes between root and base,
  // if any. Return the innermost created root scope or root if
  // none were created. Loading is done by load_root_pre() below.
  //
  scope&
  create_bootstrap_inner (scope& root, const dir_path& out_base);

  // Load project's root[-pre].build unless already loaded. Also
  // make sure all outer root scopes are loaded prior to loading
  // this root scope.
  //
  void
  load_root_pre (scope& root);

  list_value
  import (scope& base, const name&, const location&);
}

#include <build/file.ixx>

#endif // BUILD_FILE