command_builder.cxx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "command_builder.h"
  2. namespace build {
  3. command_builder::command_builder(std::string const & cmd, int indent)
  4. : indent_{indent}, buffer_() {
  5. buffer_ << cmd;
  6. }
  7. template <typename T>
  8. command_builder && command_builder::operator<<(T const & value) && {
  9. return std::move((*this) << value);
  10. }
  11. template <typename T>
  12. command_builder & command_builder::operator<<(T const & value) & {
  13. buffer_ << ' ';
  14. write(value);
  15. return *this;
  16. }
  17. template <typename T>
  18. command_builder &
  19. command_builder::operator<<(std::vector<T> const & value) & {
  20. for (T const & v : value) {
  21. (*this) << v;
  22. }
  23. return *this;
  24. }
  25. void command_builder::write(version const & vers) {
  26. switch (vers) {
  27. case version::cxx11:
  28. buffer_ << "-std=c++11";
  29. break;
  30. case version::cxx14:
  31. buffer_ << "-std=c++14";
  32. break;
  33. case version::cxx17:
  34. buffer_ << "-std=c++17";
  35. break;
  36. case none:
  37. break;
  38. }
  39. }
  40. void command_builder::write(source_file const & file) {
  41. buffer_ << "-c " << file.get();
  42. }
  43. void command_builder::write(output_file const & file) {
  44. buffer_ << "-o " << file.get();
  45. }
  46. std::ostream & operator<<(std::ostream & os, indent_t const & value) {
  47. for (int i = 0; i < value.value; ++i) {
  48. os << " ";
  49. }
  50. return os;
  51. }
  52. int command_builder::execute() const {
  53. std::string cmdstr = buffer_.str();
  54. // TODO(samjaffe): Not sure this belongs here, so much as command_builder
  55. // should take a formatter object (including things like color config)
  56. std::cout << indent_ << cmdstr << std::endl;
  57. return std::system(cmdstr.c_str());
  58. }
  59. }