cmTargetIncludeDirectoriesCommand.cxx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmTargetIncludeDirectoriesCommand.h"
  4. #include "cmGeneratorExpression.h"
  5. bool cmTargetIncludeDirectoriesCommand::InitialPass(
  6. std::vector<std::string> const& args, cmExecutionStatus&)
  7. {
  8. return this->HandleArguments(args, "INCLUDE_DIRECTORIES",
  9. ArgumentFlags(PROCESS_BEFORE | PROCESS_SYSTEM));
  10. }
  11. void cmTargetIncludeDirectoriesCommand::HandleImportedTarget(
  12. const std::string& tgt)
  13. {
  14. std::ostringstream e;
  15. e << "Cannot specify include directories for imported target \"" << tgt
  16. << "\".";
  17. this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
  18. }
  19. void cmTargetIncludeDirectoriesCommand::HandleMissingTarget(
  20. const std::string& name)
  21. {
  22. std::ostringstream e;
  23. e << "Cannot specify include directories for target \"" << name
  24. << "\" "
  25. "which is not built by this project.";
  26. this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
  27. }
  28. std::string cmTargetIncludeDirectoriesCommand::Join(
  29. const std::vector<std::string>& content)
  30. {
  31. std::string dirs;
  32. std::string sep;
  33. std::string prefix =
  34. this->Makefile->GetCurrentSourceDirectory() + std::string("/");
  35. for (std::vector<std::string>::const_iterator it = content.begin();
  36. it != content.end(); ++it) {
  37. if (cmSystemTools::FileIsFullPath(it->c_str()) ||
  38. cmGeneratorExpression::Find(*it) == 0) {
  39. dirs += sep + *it;
  40. } else {
  41. dirs += sep + prefix + *it;
  42. }
  43. sep = ";";
  44. }
  45. return dirs;
  46. }
  47. bool cmTargetIncludeDirectoriesCommand::HandleDirectContent(
  48. cmTarget* tgt, const std::vector<std::string>& content, bool prepend,
  49. bool system)
  50. {
  51. cmListFileBacktrace lfbt = this->Makefile->GetBacktrace();
  52. tgt->InsertInclude(this->Join(content), lfbt, prepend);
  53. if (system) {
  54. std::string prefix =
  55. this->Makefile->GetCurrentSourceDirectory() + std::string("/");
  56. std::set<std::string> sdirs;
  57. for (std::vector<std::string>::const_iterator it = content.begin();
  58. it != content.end(); ++it) {
  59. if (cmSystemTools::FileIsFullPath(it->c_str()) ||
  60. cmGeneratorExpression::Find(*it) == 0) {
  61. sdirs.insert(*it);
  62. } else {
  63. sdirs.insert(prefix + *it);
  64. }
  65. }
  66. tgt->AddSystemIncludeDirectories(sdirs);
  67. }
  68. return true;
  69. }
  70. void cmTargetIncludeDirectoriesCommand::HandleInterfaceContent(
  71. cmTarget* tgt, const std::vector<std::string>& content, bool prepend,
  72. bool system)
  73. {
  74. cmTargetPropCommandBase::HandleInterfaceContent(tgt, content, prepend,
  75. system);
  76. if (system) {
  77. std::string joined = this->Join(content);
  78. tgt->AppendProperty("INTERFACE_SYSTEM_INCLUDE_DIRECTORIES",
  79. joined.c_str());
  80. }
  81. }