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

#include "cmExecutionStatus.h"
#include "cmMakefile.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"

bool cmSubdirCommand(std::vector<std::string> const& args,
                     cmExecutionStatus& status)
{
  if (args.empty()) {
    status.SetError("called with incorrect number of arguments");
    return false;
  }
  bool res = true;
  bool excludeFromAll = false;
  cmMakefile& mf = status.GetMakefile();

  for (std::string const& i : args) {
    if (i == "EXCLUDE_FROM_ALL") {
      excludeFromAll = true;
      continue;
    }
    if (i == "PREORDER") {
      // Ignored
      continue;
    }

    // if they specified a relative path then compute the full
    std::string srcPath = mf.GetCurrentSourceDirectory() + "/" + i;
    if (cmSystemTools::FileIsDirectory(srcPath)) {
      std::string binPath = mf.GetCurrentBinaryDirectory() + "/" + i;
      mf.AddSubDirectory(srcPath, binPath, excludeFromAll, false, false);
    }
    // otherwise it is a full path
    else if (cmSystemTools::FileIsDirectory(i)) {
      // we must compute the binPath from the srcPath, we just take the last
      // element from the source path and use that
      std::string binPath = mf.GetCurrentBinaryDirectory() + "/" +
        cmSystemTools::GetFilenameName(i);
      mf.AddSubDirectory(i, binPath, excludeFromAll, false, false);
    } else {
      status.SetError(cmStrCat("Incorrect SUBDIRS command. Directory: ", i,
                               " does not exist."));
      res = false;
    }
  }
  return res;
}
