#include "BuildSession.h" #include "Logger.h" #include "Process.h" #include "Directory.h" BuildSession::BuildSession(const String& source_dir, const String& build_dir) : m_source_dir(source_dir) { if (build_dir.empty()) { m_build_dir = FileSystemPath::current_dir().value(); } else { m_build_dir = build_dir; } const auto build_str = m_build_dir.str() + "/build"; m_build_dir = FileSystemPath(build_str); m_compiler_flags.push_back("-g"); m_compiler_flags.push_back("-fno-exceptions"); m_compiler_flags.push_back("-fno-rtti"); } Status BuildSession::scan() { LOG_INFO("Scanning sources at:" << m_source_dir); Vector ini_files; STATUS_CHECK(Directory::getFilesWithExtension( m_source_dir, ".ini", ini_files, true), "Error looking for build files"); for(const auto& ini_file : ini_files) { if (ini_file.file_name() == "build") { STATUS_CHECK(add_library(ini_file), "Error adding library"); } } return {}; } Status BuildSession::add_library(const FileSystemPath& config_path) { LOG_INFO("Adding library at: " << config_path); BuildLibrary lib(config_path); STATUS_CHECK(lib.scan(), "Error scanning library"); m_libraries.push_back(lib); return {}; } Status BuildSession::build() { Directory::create(m_build_dir, true); for(auto& library : m_libraries) { const auto run_status = compile_library(library); if (!run_status.ok()) { return run_status; } //break; } return {}; } Status BuildSession::compile_library(BuildLibrary& lib) { for(const auto& source : lib.get_sources()) { const auto run_status = compile_source_file(source, lib); if (!run_status.ok()) { return run_status; } //break; } return {}; } Status BuildSession::compile_source_file(const FileSystemPath& source, const BuildLibrary& lib) { Vector args = m_compiler_flags; args.push_back("-c"); add_include_dirs(args, lib); args.push_back(source.str()); const auto output_path = m_build_dir / source.file_name(); args.push_back("-o"); args.push_back(output_path.str() + ".o"); LOG_INFO("Compiling " << source.file_name()); return Process::launch(m_compiler_command, args); } void BuildSession::add_include_dirs(Vector& args, const BuildLibrary& lib) { for(const auto& include_dir : lib.get_include_dirs()) { args.push_back(_s("-I") + include_dir.str()); } }