diplomska_naloga/build.cpp
2024-07-19 04:09:51 +02:00

118 lines
2.8 KiB
C++

#ifdef _WIN32
#define EXT_LINK
#endif
#define EXT_INC
#include "build.hpp"
#include <unordered_set>
#ifdef _WIN32
std::vector<std::string> LINK = {"-lopengl32", "-lkernel32", "-luser32", "-lshell32","-lwinmm","-lgdi32"};
#endif
std::vector<std::string> RAYINCLUDE = {"-Iraylib/src", "-Iraylib/src/external/glfw/include", "-Iraylib/src/external/glfw/deps/mingw"};
std::filesystem::path RAYLIB_DIR = "raylib";
bool build = false;
bool clear = false;
bool run = false;
void compile_raylib_dir()
{
std::filesystem::path out_dir = OBJ_DIR / RAYLIB_DIR;
std::filesystem::path ray_src_dir = RAYLIB_DIR / "src";
std::filesystem::create_directory(out_dir);
std::vector<std::filesystem::path> ray_srcs = {"rcore.c", "rshapes.c", "rtextures.c", "rtext.c", "utils.c", "rmodels.c", "raudio.c", "rglfw.c"};
std::vector<std::string> ray_flags = {"-D_GNU_SOURCE", "-DPLATFORM_DESKTOP", "-DGRAPHICS_API_OPENGL_33"};
command.clear();
command.push_back(c_compiler);
command.push_back("-c");
int src_loc = command.size();
command.push_back("");
command.push_back("-o");
int obj_loc = command.size();
command.push_back("");
command.insert(command.end(), ray_flags.begin(), ray_flags.end());
command.push_back(opt_flags);
command.insert(command.end(), RAYINCLUDE.begin(), RAYINCLUDE.end());
std::filesystem::path out, src;
for (size_t i = 0; i < ray_srcs.size(); i++)
{
src = ray_src_dir / ray_srcs[i];
out = out_dir / ray_srcs[i].replace_extension(".o");
if (check_if_rebuild(src, out))
{
command[src_loc] = src.string();
command[obj_loc] = out.string();
nob_cmd_run_sync(command);
}
}
}
int main(int argc, char const *argv[])
{
if (rebuild_my_self(__FILE__, argc, argv))
return 0;
for (int i = 1; i < argc; ++i)
{
if (!std::strcmp(argv[i], "opt"))
opt_flags = "-O3";
if (!std::strcmp(argv[i], "build"))
build = true;
if (!std::strcmp(argv[i], "run"))
run = true;
if (!std::strcmp(argv[i], "clear"))
{
clear_all_build();
clear = true;
}
}
if (clear && !build)
{
return 0;
}
if (!std::filesystem::is_directory(RAYLIB_DIR))
{
command = {"git", "clone", "--depth", "1", "--branch", "5.0", "https://github.com/raysan5/raylib.git"};
nob_cmd_run_sync(command);
std::filesystem::remove_all("raylib/.git");
}
if (!std::filesystem::is_directory(RAYLIB_DIR))
return 0;
std::filesystem::create_directory(OBJ_DIR);
compile_raylib_dir();
int res = compile_src_dir(RAYINCLUDE);
switch (res)
{
case 1:
compile_obj_dir(LINK);
break;
case -1:
return 0;
}
if (!std::filesystem::exists(BUILD_FILE))
compile_obj_dir(LINK);
if (run)
{
command = {"./" + BUILD_FILE.string()};
nob_cmd_run_sync(command);
}
return 0;
}