diff --git a/mob.ini b/mob.ini index 77a4555..53aaae5 100644 --- a/mob.ini +++ b/mob.ini @@ -101,6 +101,7 @@ boost = 1.85.0 boost_vs = 14.3 fmt = 10.2.1 gtest = main +directxtex = main libloot = 0.22.4 lz4 = v1.9.4 nmm = 0.71.2 diff --git a/src/main.cpp b/src/main.cpp index 4c74d3f..ce35867 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,7 +33,8 @@ namespace mob { .add_task() .add_task() .add_task() - .add_task(); + .add_task() + .add_task(); add_task() .add_task() diff --git a/src/tasks/directxtex.cpp b/src/tasks/directxtex.cpp new file mode 100644 index 0000000..b7d79f2 --- /dev/null +++ b/src/tasks/directxtex.cpp @@ -0,0 +1,80 @@ +#include "pch.h" +#include "tasks.h" + +namespace mob::tasks { + + namespace { + + msbuild create_msbuild_tool(arch a, config config, + msbuild::ops o = msbuild::build) + { + return std::move(msbuild(o).architecture(a).configuration(config).solution( + directxtex::source_path() / "DirectXTex" / + "DirectXTex_Desktop_2022.vcxproj")); + } + + } // namespace + + directxtex::directxtex() : basic_task("directxtex") {} + + std::string directxtex::version() + { + return conf().version().get("directxtex"); + } + + bool directxtex::prebuilt() + { + return false; + } + + fs::path directxtex::source_path() + { + return conf().path().build() / "DirectXTex"; + } + + void directxtex::do_clean(clean c) + { + if (is_set(c, clean::reclone)) { + git_wrap::delete_directory(cx(), source_path()); + return; + } + + if (is_set(c, clean::rebuild)) { + run_tool(create_msbuild_tool(arch::x64, config::release, msbuild::clean)); + run_tool(create_msbuild_tool(arch::x64, config::debug, msbuild::clean)); + } + } + + void directxtex::do_fetch() + { + run_tool(make_git() + .url(make_git_url("microsoft", "DirectXTex")) + .branch(version()) + .root(source_path())); + } + + void directxtex::do_build_and_install() + { + op::create_directories(cx(), directxtex::source_path() / "Include"); + op::create_directories(cx(), directxtex::source_path() / "Lib" / "Debug"); + op::create_directories(cx(), directxtex::source_path() / "Lib" / "Release"); + + // DO NOT run these in parallel because both generate files that are shared + // between release and debug + run_tool(create_msbuild_tool(arch::x64, config::release)); + run_tool(create_msbuild_tool(arch::x64, config::debug)); + + const auto binary_path = + source_path() / "DirectXTex" / "Bin" / "Desktop_2022" / "x64"; + + for (const auto& header : {"DDS.h", "DirectXTex.h", "DirectXTex.inl "}) { + op::copy_file_to_dir_if_better(cx(), source_path() / "DirectXTex" / header, + source_path() / "Include"); + } + op::copy_file_to_dir_if_better(cx(), binary_path / "Debug" / "DirectXTex.lib", + source_path() / "Lib" / "Debug"); + op::copy_file_to_dir_if_better(cx(), binary_path / "Release" / "DirectXTex.lib", + source_path() / "Lib" / "Release"); + } + +} // namespace mob::tasks diff --git a/src/tasks/modorganizer.cpp b/src/tasks/modorganizer.cpp index 2678c87..2ad8f9d 100644 --- a/src/tasks/modorganizer.cpp +++ b/src/tasks/modorganizer.cpp @@ -226,6 +226,7 @@ namespace mob::tasks { gtest::build_path(arch::x64, c == config::debug ? config::debug : config::release)) .def("OPENSSL_ROOT_DIR", openssl::source_path()) + .def("DIRECTXTEX_ROOT", directxtex::source_path()) .root(root)); } diff --git a/src/tasks/tasks.h b/src/tasks/tasks.h index 25efa26..8b9b116 100644 --- a/src/tasks/tasks.h +++ b/src/tasks/tasks.h @@ -77,6 +77,20 @@ namespace mob::tasks { void do_fetch() override; }; + class directxtex : public basic_task { + public: + directxtex(); + + static std::string version(); + static bool prebuilt(); + static fs::path source_path(); + + protected: + void do_clean(clean c) override; + void do_fetch() override; + void do_build_and_install() override; + }; + class explorerpp : public basic_task { public: explorerpp();