You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cmkr/src/build.cpp

97 lines
2.4 KiB

#include "build.hpp"
4 years ago
#include "cmake.hpp"
#include "error.hpp"
#include "gen.hpp"
4 years ago
#include "fs.hpp"
4 years ago
#include <sstream>
#include <stddef.h>
#include <stdexcept>
#include <stdlib.h>
#include <system_error>
4 years ago
4 years ago
namespace cmkr {
namespace build {
4 years ago
int run(int argc, char **argv) {
4 years ago
cmake::CMake cmake(".", true);
if (argc > 2) {
for (size_t i = 2; i < argc; ++i) {
cmake.build_args.push_back(argv[i]);
}
}
4 years ago
std::stringstream ss;
if (gen::generate_cmake(fs::current_path().string().c_str()))
throw std::runtime_error("CMake generation failure!");
4 years ago
ss << "cmake -S. -B" << cmake.build_dir << " ";
4 years ago
if (!cmake.generator.empty()) {
ss << "-G \"" << cmake.generator << "\" ";
4 years ago
}
4 years ago
if (!cmake.config.empty()) {
ss << "-DCMAKE_BUILD_TYPE=" << cmake.config << " ";
}
4 years ago
if (!cmake.gen_args.empty()) {
for (const auto &arg : cmake.gen_args) {
ss << "-D" << arg << " ";
4 years ago
}
4 years ago
}
ss << "&& cmake --build " << cmake.build_dir << " --parallel";
4 years ago
if (argc > 2) {
for (const auto &arg : cmake.build_args) {
ss << " " << arg;
4 years ago
}
}
4 years ago
4 years ago
return ::system(ss.str().c_str());
}
int clean() {
4 years ago
bool ret = false;
cmake::CMake cmake(".", true);
if (fs::exists(cmake.build_dir)) {
ret = fs::remove_all(cmake.build_dir);
fs::create_directory(cmake.build_dir);
}
4 years ago
return !ret;
}
4 years ago
int install() {
cmake::CMake cmake(".", false);
auto cmd = "cmake --install " + cmake.build_dir;
4 years ago
return ::system(cmd.c_str());
}
4 years ago
} // namespace build
} // namespace cmkr
4 years ago
int cmkr_build_run(int argc, char **argv) {
4 years ago
try {
return cmkr::build::run(argc, argv);
} catch (const std::system_error &e) {
return e.code().value();
4 years ago
} catch (...) {
return cmkr::error::Status(cmkr::error::Status::Code::BuildError);
}
}
int cmkr_build_clean(void) {
try {
return cmkr::build::clean();
} catch (const std::system_error &e) {
return e.code().value();
} catch (...) {
4 years ago
return cmkr::error::Status(cmkr::error::Status::Code::CleanError);
}
}
int cmkr_build_install(void) {
try {
return cmkr::build::install();
} catch (const std::system_error &e) {
return e.code().value();
} catch (...) {
return cmkr::error::Status(cmkr::error::Status::Code::InstallError);
}
4 years ago
}