106 lines
No EOL
2.6 KiB
C++
106 lines
No EOL
2.6 KiB
C++
#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<FileSystemPath> 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<String> 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<String>& args, const BuildLibrary& lib)
|
|
{
|
|
for(const auto& include_dir : lib.get_include_dirs())
|
|
{
|
|
args.push_back(_s("-I") + include_dir.str());
|
|
}
|
|
} |