diff --git a/src/commands.cpp b/src/commands.cpp index eba5505..d140507 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -1,4 +1,4 @@ -#include +#include #include "app.h" #include "types.h" @@ -8,112 +8,45 @@ void Application::buildProject() { m_Taskflow.emplace([this]() { this->checkBuildDirs(); }) .name("checkBuildDirs"); if (m_BuildType == BuildType::none) { - auto configureDirDebugTask = - m_Taskflow - .emplace( - [this]() { this->configureDir("build/debug", "debug"); }) - .name("configureDir(build/debug)"); - auto buildDirDebugTask = - m_Taskflow.emplace([this]() { this->buildDir("build/debug"); }) - .name("buildDir(build/debug)"); + tf::Task previousBuildTask; + for (BuildType type : buildTypes) { + std::string dir = BuildTypeToDir(type); + std::string name = BuildTypeToString(type); - auto configureDirReleaseTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/release", "Release"); - }) - .name("configureDir(build/release)"); - auto buildDirReleaseTask = - m_Taskflow.emplace([this]() { this->buildDir("build/release"); }) - .name("buildDir(build/release)"); + auto configureTask = + m_Taskflow + .emplace( + [this, dir, name]() { this->configureDir(dir, name); }) + .name(std::format("configureDir({})", dir)); - auto configureDirRelWithDebTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/relwithdeb", "RelWithDebInfo"); - }) - .name("configureDir(build/relwithdeb)"); - auto buildDirRelWithDebTask = - m_Taskflow.emplace([this]() { this->buildDir("build/relwithdeb"); }) - .name("buildDir(build/relwithdeb)"); + auto buildTask = + m_Taskflow.emplace([this, dir]() { this->buildDir(dir); }) + .name(std::format("buildDir({})", dir)); + configureTask.succeed(checkBuildDirsTask); + buildTask.succeed(configureTask); + if (!previousBuildTask.empty()) { + buildTask.succeed(previousBuildTask); + } + previousBuildTask = buildTask; + } - auto configureDirMinSizeRelTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/minsizerel", "MinSizeRel"); - }) - .name("configureDir(build/minsizerel)"); - auto buildDirMinSizeRelTask = - m_Taskflow.emplace([this]() { this->buildDir("build/minsizerel"); }) - .name("buildDir(build/minsizerel)"); - - configureDirDebugTask.succeed(checkBuildDirsTask); - configureDirReleaseTask.succeed(checkBuildDirsTask); - configureDirRelWithDebTask.succeed(checkBuildDirsTask); - configureDirMinSizeRelTask.succeed(checkBuildDirsTask); - - buildDirDebugTask.succeed(configureDirDebugTask); - buildDirReleaseTask.succeed(configureDirReleaseTask); - buildDirRelWithDebTask.succeed(configureDirRelWithDebTask); - buildDirMinSizeRelTask.succeed(configureDirMinSizeRelTask); - - buildDirReleaseTask.succeed(buildDirDebugTask); - buildDirRelWithDebTask.succeed(buildDirReleaseTask); - buildDirMinSizeRelTask.succeed(buildDirRelWithDebTask); - - } else if (m_BuildType == BuildType::debug) { - auto configureDirTask = - m_Taskflow - .emplace( - [this]() { this->configureDir("build/debug", "Debug"); }) - .name("configureDir(build/debug)"); - auto buildDirTask = - m_Taskflow.emplace([this]() { this->buildDir("build/debug"); }) - .name("buildDir(build/debug)"); - - configureDirTask.precede(buildDirTask); - checkBuildDirsTask.precede(configureDirTask); - - } else if (m_BuildType == BuildType::release) { - auto configureDirTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/release", "Release"); - }) - .name("configureDir(build/release)"); - auto buildDirTask = - m_Taskflow.emplace([this]() { this->buildDir("build/release"); }) - .name("buildDir(build/release)"); - - configureDirTask.precede(buildDirTask); - checkBuildDirsTask.precede(configureDirTask); - } else if (m_BuildType == BuildType::relwithdeb) { - auto configureDirTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/relwithdeb", "RelWithDebInfo"); - }) - .name("configureDir(build/relwithdeb)"); - auto buildDirTask = - m_Taskflow.emplace([this]() { this->buildDir("build/relwithdeb"); }) - .name("buildDir(build/relwithdeb)"); - - configureDirTask.precede(buildDirTask); - checkBuildDirsTask.precede(configureDirTask); - } else if (m_BuildType == BuildType::minsizerel) { - auto configureDirTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/minsizerel", "MinSizeRel"); - }) - .name("configureDir(build/minsizerel)"); - auto buildDirTask = - m_Taskflow.emplace([this]() { this->buildDir("build/minsizerel"); }) - .name("buildDir(build/minsizerel)"); - - configureDirTask.precede(buildDirTask); - checkBuildDirsTask.precede(configureDirTask); + return; } + + auto configureDirTask = + m_Taskflow + .emplace([this]() { + this->configureDir(BuildTypeToDir(m_BuildType), + BuildTypeToString(m_BuildType)); + }) + .name(std::format("configureDir({})", BuildTypeToDir(m_BuildType))); + auto buildDirTask = + m_Taskflow + .emplace([this]() { this->buildDir(BuildTypeToDir(m_BuildType)); }) + .name(std::format("buildDir({})", BuildTypeToDir(m_BuildType))); + + configureDirTask.precede(buildDirTask); + checkBuildDirsTask.precede(configureDirTask); } void Application::configureProject() { @@ -121,72 +54,27 @@ void Application::configureProject() { m_Taskflow.emplace([this]() { this->checkBuildDirs(); }) .name("checkBuildDirs"); if (m_BuildType == BuildType::none) { - auto configureDirDebugTask = - m_Taskflow - .emplace( - [this]() { this->configureDir("build/debug", "Debug"); }) - .name("configureDir(build/debug)"); - checkBuildDirsTask.precede(configureDirDebugTask); - - auto configureDirReleaseTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/release", "Release"); - }) - .name("configureDir(build/release)"); - checkBuildDirsTask.precede(configureDirReleaseTask); - - auto configureDirRelWithDebTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/relwithdeb", "RelWithDebInfo"); - }) - .name("configureDir(build/relwithdeb)"); - checkBuildDirsTask.precede(configureDirRelWithDebTask); - - auto configureDirMinSizeRelTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/minsizerel", "MinSizeRel"); - }) - .name("configureDir(build/minsizerel)"); - checkBuildDirsTask.precede(configureDirMinSizeRelTask); - - } else if (m_BuildType == BuildType::debug) { - auto configureDirDebugTask = - m_Taskflow - .emplace( - [this]() { this->configureDir("build/debug", "Debug"); }) - .name("configureDir(build/debug)"); - checkBuildDirsTask.precede(configureDirDebugTask); - - } else if (m_BuildType == BuildType::release) { - auto configureDirReleaseTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/release", "Release"); - }) - .name("configureDir(build/release)"); - checkBuildDirsTask.precede(configureDirReleaseTask); - - } else if (m_BuildType == BuildType::relwithdeb) { - auto configureDirRelWithDebTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/relwithdeb", "RelWithDebInfo"); - }) - .name("configureDir(build/relwithdeb)"); - checkBuildDirsTask.precede(configureDirRelWithDebTask); - - } else if (m_BuildType == BuildType::minsizerel) { - auto configureDirMinSizeRelTask = - m_Taskflow - .emplace([this]() { - this->configureDir("build/minsizerel", "MinSizeRel"); - }) - .name("configureDir(build/minsizerel)"); - checkBuildDirsTask.precede(configureDirMinSizeRelTask); + for (BuildType type : buildTypes) { + std::string dir = BuildTypeToDir(type); + std::string name = BuildTypeToString(type); + auto configureDirTask = + m_Taskflow + .emplace( + [this, dir, name]() { this->configureDir(dir, name); }) + .name(std::format("configureDir({})", dir)); + checkBuildDirsTask.precede(configureDirTask); + } + return; } + + auto configureDirDebugTask = + m_Taskflow + .emplace([this]() { + this->configureDir(BuildTypeToDir(m_BuildType), + BuildTypeToString(m_BuildType)); + }) + .name(std::format("configureDir({})", BuildTypeToDir(m_BuildType))); + checkBuildDirsTask.precede(configureDirDebugTask); } void Application::cleanProject() { @@ -195,72 +83,29 @@ void Application::cleanProject() { .name("checkBuildDirs"); if (m_BuildType == BuildType::none) { - auto cleanDirDebugTask = - m_Taskflow.emplace([this]() { this->cleanDir("build/debug"); }) - .name("cleanDir(build/debug)"); - checkBuildDirsTask.precede(cleanDirDebugTask); - - auto cleanDirReleaseTask = - m_Taskflow.emplace([this]() { this->cleanDir("build/release"); }) - .name("cleanDir(build/release)"); - checkBuildDirsTask.precede(cleanDirReleaseTask); - - auto cleanDirRelWithDebTask = - m_Taskflow.emplace([this]() { this->cleanDir("build/relwithdeb"); }) - .name("cleanDir(build/relwithdeb)"); - checkBuildDirsTask.precede(cleanDirRelWithDebTask); - auto cleanDirMinSizeRelTask = - m_Taskflow.emplace([this]() { this->cleanDir("build/minsizerel"); }) - .name("cleanDir(build/minsizerel)"); - checkBuildDirsTask.precede(cleanDirMinSizeRelTask); - - } else if (m_BuildType == BuildType::debug) { - auto cleanDirDebugTask = - m_Taskflow.emplace([this]() { this->cleanDir("build/debug"); }) - .name("cleanDir(build/debug)"); - checkBuildDirsTask.precede(cleanDirDebugTask); - - } else if (m_BuildType == BuildType::release) { - auto cleanDirReleaseTask = - m_Taskflow.emplace([this]() { this->cleanDir("build/release"); }) - .name("cleanDir(build/release)"); - checkBuildDirsTask.precede(cleanDirReleaseTask); - - } else if (m_BuildType == BuildType::relwithdeb) { - auto cleanDirRelWithDebTask = - m_Taskflow.emplace([this]() { this->cleanDir("build/relwithdeb"); }) - .name("cleanDir(build/relwithdeb)"); - checkBuildDirsTask.precede(cleanDirRelWithDebTask); - - } else if (m_BuildType == BuildType::minsizerel) { - auto cleanDirMinSizeRelTask = - m_Taskflow.emplace([this]() { this->cleanDir("build/minsizerel"); }) - .name("cleanDir(build/minsizerel)"); - checkBuildDirsTask.precede(cleanDirMinSizeRelTask); + for (BuildType type : buildTypes) { + std::string dir = BuildTypeToDir(type); + auto cleanDirTask = + m_Taskflow.emplace([this, dir]() { this->cleanDir(dir); }) + .name(std::format("cleanDir({})", dir)); + checkBuildDirsTask.precede(cleanDirTask); + } + return; } + + auto cleanDirDebugTask = + m_Taskflow + .emplace([this]() { this->cleanDir(BuildTypeToDir(m_BuildType)); }) + .name(std::format("cleanDir({})", BuildTypeToDir(m_BuildType))); + checkBuildDirsTask.precede(cleanDirDebugTask); } void Application::deleteProject() { - // No point in using taskflow for this... - // In all cases its just deleting a single directory... - // Bit overkill for that - switch (m_BuildType) { - case none: - deleteDir("build"); - break; - case debug: - deleteDir("build/debug"); - break; - case release: - deleteDir("build/release"); - break; - case relwithdeb: - deleteDir("build/relwithdeb"); - break; - case minsizerel: - deleteDir("build/minsizerel"); - break; + if (m_BuildType == BuildType::none) { + deleteDir("build"); + return; } + deleteDir(BuildTypeToDir(m_BuildType)); } void Application::rebuildProject() { diff --git a/src/filesystem.cpp b/src/filesystem.cpp index 64fa714..eba5aa2 100644 --- a/src/filesystem.cpp +++ b/src/filesystem.cpp @@ -3,6 +3,7 @@ #include "app.h" #include "logging.h" +#include "types.h" void Application::deleteDir(const std::filesystem::path& path) { if (m_DryRun) { @@ -59,26 +60,14 @@ void Application::checkDir(std::string path) { void Application::checkBuildDirs() { checkDir("build"); - switch (m_BuildType) { - case none: - checkDir("build/debug"); - checkDir("build/release"); - checkDir("build/relwithdeb"); - checkDir("build/minsizerel"); - break; - case debug: - checkDir("build/debug"); - break; - case release: - checkDir("build/release"); - break; - case relwithdeb: - checkDir("build/relwithdeb"); - break; - case minsizerel: - checkDir("build/minsizerel"); - break; + if (m_BuildType == BuildType::none) { + checkDir("build/debug"); + checkDir("build/release"); + checkDir("build/relwithdeb"); + checkDir("build/minsizerel"); + return; } + checkDir(BuildTypeToDir(m_BuildType)); spdlog::get("filesystem")->info("All directories checked."); } diff --git a/src/types.h b/src/types.h index 40b8cb3..4e358ab 100644 --- a/src/types.h +++ b/src/types.h @@ -1,6 +1,9 @@ #ifndef BUILD_SCRIPT_TYPES #define BUILD_SCRIPT_TYPES +#include +#include + enum Command { build, configure, @@ -17,4 +20,34 @@ enum BuildType { minsizerel, }; +std::string BuildTypeToString(BuildType buildType) { + // clang-format off + switch (buildType) { + case BuildType::none: return "none"; + case BuildType::debug: return "Debug"; + case BuildType::release: return "Release"; + case BuildType::relwithdeb: return "RelWithDebInfo"; + case BuildType::minsizerel: return "MinSizeRel"; + default: assert("BuildTypeToString() default case"); return ""; + } + // clang-format on +} + +std::string BuildTypeToDir(BuildType buildType) { + // clang-format off + switch (buildType) { + case BuildType::none: assert("BuildType::toDir() called with None value"); + case BuildType::debug: return "build/debug"; + case BuildType::release: return "build/release"; + case BuildType::relwithdeb: return "build/relwithdeb"; + case BuildType::minsizerel: return "build/minsizerel"; + default: assert("BuildTypeToDir() default case"); return ""; + } + // clang-format on +} + +const std::vector buildTypes = {BuildType::debug, BuildType::release, + BuildType::relwithdeb, + BuildType::minsizerel}; + #endif // !BUILD_SCRIPT_TYPES