summaryrefslogtreecommitdiffhomepage
path: root/xmake.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xmake.cpp')
-rw-r--r--xmake.cpp49
1 files changed, 48 insertions, 1 deletions
diff --git a/xmake.cpp b/xmake.cpp
index 9d953cc..c1095f4 100644
--- a/xmake.cpp
+++ b/xmake.cpp
@@ -1,14 +1,19 @@
#include "xmake.h"
+#include <cstdlib>
#include <filesystem>
#include <iostream>
#include <sstream>
+#include <stdexcept>
#include <string>
+#include <vector>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/process.hpp>
+#include <fmt/format.h>
+
namespace fs = std::filesystem;
namespace bp = boost::process;
namespace pt = boost::property_tree;
@@ -54,9 +59,51 @@ int xmake(int argc, char* argv[])
// TODO: clearlist
// TODO: dependencies
// TODO: buildlist
+ std::string target{ptree.get<std::string>("xmake.build.name")};
+
+ std::vector<std::string> sources;
+ for (pt::ptree::value_type &v: ptree.get_child("xmake.build")) {
+ if (v.first == "source")
+ sources.push_back(v.second.data());
+ }
+
+ std::cout << "Target: " << target << std::endl;
+
+ std::cout << "Sources: " << std::endl;
+ for (auto &i: sources) {
+ std::cout << " " << i << std::endl;
+ }
+
+ std::vector<std::string> commands;
+ // compile
+ for (auto &i: sources) {
+ fs::path p{i};
+ commands.push_back(fmt::format("g++ -std=c++17 -c {} -o {}", p.string(), p.replace_extension("o").string()));
+ }
+ // link
+ std::string link_command{"g++"};
+ for (auto &i: sources) {
+ link_command += fmt::format(" {}", fs::path{i}.replace_extension("o").string());
+ }
+ link_command += fmt::format(" -o {}", target);
+ commands.push_back(link_command);
+
+ std::cout << "Commands: " << std::endl;
+ for (auto &i: commands) {
+ std::cout << " " << i << std::endl;
+ }
+
+ std::cout << "Running commands: " << std::endl;
+ for (auto &i: commands) {
+ std::cout << i << std::endl;
+ int result{system(i.c_str())};
+ if (result != 0) {
+ throw std::runtime_error(fmt::format("Error {}", result));
+ }
+ }
} catch (const std::exception& ex) {
- std::cerr << "Error: " << ex.what() << std::endl;
+ std::cerr << "xmake: " << ex.what() << std::endl;
return 1;
}