cmCollectFlags.cxx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "cmCollectFlags.h"
  2. #include "cmSystemTools.h"
  3. #include <fstream>
  4. #include <iterator>
  5. #include <iostream>
  6. cmCollectFlags::cmCollectFlags()
  7. {
  8. }
  9. cmCollectFlags::~cmCollectFlags()
  10. {
  11. }
  12. void cmCollectFlags::Print()
  13. {
  14. std::ostream_iterator<std::string> out(std::cout, "\n");
  15. std::cout << "m_IncludeDirectories " << std::endl;
  16. std::copy(m_IncludeDirectories.begin(), m_IncludeDirectories.end(), out);
  17. std::cout << "m_linkdirectories " << std::endl;
  18. std::copy(m_LinkDirectories.begin(), m_LinkDirectories.end(), out);
  19. std::cout << "m_LinkLibraries " << std::endl;
  20. std::copy(m_LinkLibraries.begin(), m_LinkLibraries.end(), out);
  21. std::cout << "m_LinkLibrariesWin32 " << std::endl;
  22. std::copy(m_LinkLibrariesWin32.begin(), m_LinkLibrariesWin32.end(), out);
  23. std::cout << "m_LinkLibrariesUnix " << std::endl;
  24. std::copy(m_LinkLibrariesUnix.begin(), m_LinkLibrariesUnix.end(), out);
  25. }
  26. void cmCollectFlags::SetSourceHomeDirectory(const char* dir)
  27. {
  28. m_SourceHomeDirectory = dir;
  29. cmSystemTools::ConvertToUnixSlashes(m_SourceHomeDirectory);
  30. }
  31. void cmCollectFlags::SetStartDirectory(const char* dir)
  32. {
  33. m_StartDirectory = dir;
  34. cmSystemTools::ConvertToUnixSlashes(m_StartDirectory);
  35. }
  36. void cmCollectFlags::ParseDirectories()
  37. {
  38. this->ParseDirectory(m_StartDirectory.c_str());
  39. }
  40. void cmCollectFlags::ParseFile(const char* filename)
  41. {
  42. std::ifstream fin(filename);
  43. if(!fin)
  44. {
  45. std::cerr << "error can not open file " << filename << std::endl;
  46. return;
  47. }
  48. char inbuffer[2048];
  49. while ( fin.getline(inbuffer, 2047 ) )
  50. {
  51. std::string line = inbuffer;
  52. if(line.find("INCLUDE_DIRECTORIES") != std::string::npos)
  53. {
  54. cmSystemTools::ReadList(m_IncludeDirectories, fin);
  55. }
  56. if(line.find("LINK_DIRECTORIES") != std::string::npos)
  57. {
  58. cmSystemTools::ReadList(m_LinkDirectories, fin);
  59. }
  60. if(line.find("LINK_LIBRARIES") != std::string::npos)
  61. {
  62. cmSystemTools::ReadList(m_LinkLibraries, fin);
  63. }
  64. if(line.find("WIN32_LIBRARIES") != std::string::npos)
  65. {
  66. cmSystemTools::ReadList(m_LinkLibrariesWin32, fin);
  67. }
  68. if(line.find("UNIX_LIBRARIES") != std::string::npos)
  69. {
  70. cmSystemTools::ReadList(m_LinkLibrariesUnix, fin);
  71. }
  72. }
  73. }
  74. // Go until directory == m_cmHomeDirectory
  75. // 1. fix slashes
  76. // 2. peal off /dir until home found, go no higher
  77. void cmCollectFlags::ParseDirectory(const char* dir)
  78. {
  79. std::string listsFile = dir;
  80. listsFile += "/CMakeLists.txt";
  81. if(cmSystemTools::FileExists(listsFile.c_str()))
  82. {
  83. this->ParseFile(listsFile.c_str());
  84. }
  85. if(m_SourceHomeDirectory == dir)
  86. {
  87. return;
  88. }
  89. std::string dotdotDir = dir;
  90. std::string::size_type pos = dotdotDir.rfind('/');
  91. if(pos != std::string::npos)
  92. {
  93. dotdotDir = dotdotDir.substr(0, pos);
  94. this->ParseDirectory(dotdotDir.c_str());
  95. }
  96. }