/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#include "cmAddDependenciesCommand.h"

#include "cmExecutionStatus.h"
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmRange.h"
#include "cmStringAlgorithms.h"
#include "cmTarget.h"

bool cmAddDependenciesCommand(std::vector<std::string> const& args,
                              cmExecutionStatus& status)
{
  if (args.empty()) {
    status.SetError("called with incorrect number of arguments");
    return false;
  }

  cmMakefile& mf = status.GetMakefile();
  std::string const& target_name = args[0];
  if (mf.IsAlias(target_name)) {
    mf.IssueMessage(
      MessageType::FATAL_ERROR,
      cmStrCat("Cannot add target-level dependencies to alias target \"",
               target_name, "\".\n"));
  }
  if (cmTarget* target = mf.FindTargetToUse(target_name)) {

    // skip over target_name
    for (std::string const& arg : cmMakeRange(args).advance(1)) {
      target->AddUtility(arg, false, &mf);
      target->AddCodegenDependency(arg);
    }
  } else {
    mf.IssueMessage(
      MessageType::FATAL_ERROR,
      cmStrCat(
        "Cannot add target-level dependencies to non-existent "
        "target \"",
        target_name,
        "\".\nThe add_dependencies works for "
        "top-level logical targets created by the add_executable, "
        "add_library, or add_custom_target commands.  If you want to add "
        "file-level dependencies see the DEPENDS option of the "
        "add_custom_target and add_custom_command commands."));
  }

  return true;
}
