cmCollectFlags.cxx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "cmCollectFlags.h"
  2. #include "cmMakefile.h"
  3. #include "cmSystemTools.h"
  4. #include <fstream>
  5. #include <iterator>
  6. #include <iostream>
  7. cmCollectFlags::cmCollectFlags()
  8. {
  9. }
  10. cmCollectFlags::~cmCollectFlags()
  11. {
  12. }
  13. void cmCollectFlags::Print()
  14. {
  15. std::ostream_iterator<std::string> out(std::cout, "\n");
  16. std::cout << "m_IncludeDirectories " << std::endl;
  17. std::copy(m_IncludeDirectories.begin(), m_IncludeDirectories.end(), out);
  18. std::cout << "m_linkdirectories " << std::endl;
  19. std::copy(m_LinkDirectories.begin(), m_LinkDirectories.end(), out);
  20. std::cout << "m_LinkLibraries " << std::endl;
  21. std::copy(m_LinkLibraries.begin(), m_LinkLibraries.end(), out);
  22. std::cout << "m_LinkLibrariesWin32 " << std::endl;
  23. std::copy(m_LinkLibrariesWin32.begin(), m_LinkLibrariesWin32.end(), out);
  24. std::cout << "m_LinkLibrariesUnix " << std::endl;
  25. std::copy(m_LinkLibrariesUnix.begin(), m_LinkLibrariesUnix.end(), out);
  26. }
  27. void cmCollectFlags::SetSourceHomeDirectory(const char* dir)
  28. {
  29. m_SourceHomeDirectory = dir;
  30. cmSystemTools::ConvertToUnixSlashes(m_SourceHomeDirectory);
  31. }
  32. void cmCollectFlags::SetStartDirectory(const char* dir)
  33. {
  34. m_StartDirectory = dir;
  35. cmSystemTools::ConvertToUnixSlashes(m_StartDirectory);
  36. }
  37. void cmCollectFlags::ParseDirectories()
  38. {
  39. this->ParseDirectory(m_StartDirectory.c_str());
  40. }
  41. void cmCollectFlags::ParseFile(const char* filename)
  42. {
  43. std::ifstream fin(filename);
  44. if(!fin)
  45. {
  46. std::cerr << "error can not open file " << filename << std::endl;
  47. return;
  48. }
  49. char inbuffer[2048];
  50. while ( fin.getline(inbuffer, 2047 ) )
  51. {
  52. std::string line = inbuffer;
  53. if(line.find("INCLUDE_DIRECTORIES") != std::string::npos)
  54. {
  55. cmSystemTools::ReadList(m_IncludeDirectories, fin);
  56. }
  57. if(line.find("LINK_DIRECTORIES") != std::string::npos)
  58. {
  59. cmSystemTools::ReadList(m_LinkDirectories, fin);
  60. }
  61. if(line.find("LINK_LIBRARIES") != std::string::npos)
  62. {
  63. cmSystemTools::ReadList(m_LinkLibraries, fin);
  64. }
  65. if(line.find("WIN32_LIBRARIES") != std::string::npos)
  66. {
  67. cmSystemTools::ReadList(m_LinkLibrariesWin32, fin);
  68. }
  69. if(line.find("UNIX_LIBRARIES") != std::string::npos)
  70. {
  71. cmSystemTools::ReadList(m_LinkLibrariesUnix, fin);
  72. }
  73. }
  74. }
  75. // Go until directory == m_cmHomeDirectory
  76. // 1. fix slashes
  77. // 2. peal off /dir until home found, go no higher
  78. void cmCollectFlags::ParseDirectory(const char* dir)
  79. {
  80. std::string listsFile = dir;
  81. listsFile += "/CMakeLists.txt";
  82. if(cmSystemTools::FileExists(listsFile.c_str()))
  83. {
  84. this->ParseFile(listsFile.c_str());
  85. }
  86. if(m_SourceHomeDirectory == dir)
  87. {
  88. return;
  89. }
  90. std::string dotdotDir = dir;
  91. std::string::size_type pos = dotdotDir.rfind('/');
  92. if(pos != std::string::npos)
  93. {
  94. dotdotDir = dotdotDir.substr(0, pos);
  95. this->ParseDirectory(dotdotDir.c_str());
  96. }
  97. }
  98. // expance CMAKE_BINARY_DIR and CMAKE_SOURCE_ROOT in the
  99. // include and library directories.
  100. void cmCollectFlags::ExpandVaribles(cmMakefile* makefile)
  101. {
  102. // Now replace varibles
  103. std::vector<std::string>& includes = m_IncludeDirectories;
  104. std::vector<std::string>::iterator j, begin, end;
  105. begin = m_IncludeDirectories.begin();
  106. end = m_IncludeDirectories.end();
  107. for(j = begin; j != end; ++j)
  108. {
  109. cmSystemTools::ReplaceString(*j, "${CMAKE_BINARY_DIR}",
  110. makefile->GetOutputHomeDirectory() );
  111. cmSystemTools::ReplaceString(*j, "${CMAKE_SOURCE_ROOT}",
  112. makefile->GetHomeDirectory() );
  113. }
  114. begin = m_LinkDirectories.begin();
  115. end = m_LinkDirectories.end();
  116. for(j = begin; j != end; ++j)
  117. {
  118. cmSystemTools::ReplaceString(*j, "${CMAKE_BINARY_DIR}",
  119. makefile->GetOutputHomeDirectory() );
  120. cmSystemTools::ReplaceString(*j, "${CMAKE_SOURCE_ROOT}",
  121. makefile->GetHomeDirectory() );
  122. }
  123. }