From edd4771292a2273080fbcbac266c6831834b0b86 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Tue, 27 Dec 2022 21:52:10 +0200 Subject: [PATCH] Refactor the use of external tasks in tools The run functions now just return the arguments, and a wrapper in the Tool class creates the task object. --- source/androidassetpackagingtool.cpp | 9 +++------ source/androidassetpackagingtool.h | 2 +- source/apkbuilder.cpp | 3 ++- source/apkbuilder.h | 2 +- source/gnuarchiver.cpp | 10 +++------- source/gnuarchiver.h | 2 +- source/gnucompiler.cpp | 8 +++----- source/gnucompiler.h | 2 +- source/gnulinker.cpp | 9 +++------ source/gnulinker.h | 2 +- source/jarsigner.cpp | 9 +++------ source/jarsigner.h | 2 +- source/msvcarchiver.cpp | 10 +++------- source/msvcarchiver.h | 2 +- source/msvccompiler.cpp | 8 +++----- source/msvccompiler.h | 2 +- source/msvclinker.cpp | 9 +++------ source/msvclinker.h | 2 +- source/sourcegenerator.cpp | 8 +++----- source/sourcegenerator.h | 2 +- source/tool.h | 14 ++++++++++---- 21 files changed, 49 insertions(+), 68 deletions(-) diff --git a/source/androidassetpackagingtool.cpp b/source/androidassetpackagingtool.cpp index a511da0..eb638e9 100644 --- a/source/androidassetpackagingtool.cpp +++ b/source/androidassetpackagingtool.cpp @@ -5,7 +5,6 @@ #include "androidresourcebundle.h" #include "androidtools.h" #include "component.h" -#include "externaltask.h" #include "sourcepackage.h" using namespace std; @@ -25,7 +24,7 @@ AndroidAssetPackagingTool::AndroidAssetPackagingTool(Builder &b, const AndroidSd if(sdk.get_platform_jar().empty()) problems.push_back("Android platform not found"); - set_run(_run); + set_run_external(_run); } Target *AndroidAssetPackagingTool::create_target(const vector &sources, const string &) @@ -49,7 +48,7 @@ Target *AndroidAssetPackagingTool::create_target(const vector &sources return res; } -Task *AndroidAssetPackagingTool::_run(const AndroidResourceBundle &res) +ExternalTask::Arguments AndroidAssetPackagingTool::_run(const AndroidResourceBundle &res, FS::Path &work_dir) { const AndroidAssetPackagingTool &tool = dynamic_cast(*res.get_tool()); @@ -57,8 +56,6 @@ Task *AndroidAssetPackagingTool::_run(const AndroidResourceBundle &res) argv.push_back(tool.get_executable()->get_path().str()); argv.push_back("package"); - FS::Path work_dir = res.get_component()->get_package().get_source_directory(); - argv.push_back("-I"); argv.push_back(tool.sdk.get_platform_jar().str()); @@ -92,5 +89,5 @@ Task *AndroidAssetPackagingTool::_run(const AndroidResourceBundle &res) argv.push_back(FS::relative(d, work_dir).str()); } - return new ExternalTask(argv, work_dir); + return argv; } diff --git a/source/androidassetpackagingtool.h b/source/androidassetpackagingtool.h index e4f0f77..252870f 100644 --- a/source/androidassetpackagingtool.h +++ b/source/androidassetpackagingtool.h @@ -17,7 +17,7 @@ public: Target *create_target(const std::vector &, const std::string &) override; private: - static Task *_run(const AndroidResourceBundle &); + static ExternalTask::Arguments _run(const AndroidResourceBundle &, Msp::FS::Path &); }; #endif diff --git a/source/apkbuilder.cpp b/source/apkbuilder.cpp index e426c89..f62e485 100644 --- a/source/apkbuilder.cpp +++ b/source/apkbuilder.cpp @@ -45,8 +45,9 @@ void ApkBuilder::do_prepare(ToolData &tool) const tool.extra_data = jarsigner; } -Task *ApkBuilder::_run(const AndroidPackageFile &apk) +Task *ApkBuilder::_run(const Target &tgt) { + const AndroidPackageFile &apk = dynamic_cast(tgt); const ApkBuilder &tool = dynamic_cast(*apk.get_tool()); ExternalTask::Arguments argv; diff --git a/source/apkbuilder.h b/source/apkbuilder.h index 96525e0..8eaaeef 100644 --- a/source/apkbuilder.h +++ b/source/apkbuilder.h @@ -15,7 +15,7 @@ protected: void do_prepare(ToolData &) const override; private: - static Task *_run(const AndroidPackageFile &); + static Task *_run(const Target &); }; #endif diff --git a/source/gnuarchiver.cpp b/source/gnuarchiver.cpp index 629cb70..dc0b784 100644 --- a/source/gnuarchiver.cpp +++ b/source/gnuarchiver.cpp @@ -4,7 +4,6 @@ #include #include "builder.h" #include "component.h" -#include "externaltask.h" #include "gnuarchiver.h" #include "objectfile.h" #include "sourcepackage.h" @@ -19,7 +18,7 @@ GnuArchiver::GnuArchiver(Builder &b, const Architecture &a): set_command("ar", true); input_suffixes.push_back(".o"); processing_unit = COMPONENT; - set_run(_run); + set_run_external(_run); } Target *GnuArchiver::create_target(const vector &sources, const string &) @@ -38,22 +37,19 @@ Target *GnuArchiver::create_target(const vector &sources, const string return lib; } -Task *GnuArchiver::_run(const StaticLibrary &lib) +ExternalTask::Arguments GnuArchiver::_run(const StaticLibrary &lib, FS::Path &work_dir) { const Tool &tool = *lib.get_tool(); - const Component &comp = *lib.get_component(); vector argv; argv.push_back(tool.get_executable()->get_path().str()); argv.push_back("rc"); - FS::Path work_dir = comp.get_package().get_source_directory(); - argv.push_back(relative(lib.get_path(), work_dir).str()); for(Target *d: lib.get_dependencies()) if(ObjectFile *obj = dynamic_cast(d)) argv.push_back(relative(obj->get_path(), work_dir).str()); - return new ExternalTask(argv, work_dir); + return argv; } diff --git a/source/gnuarchiver.h b/source/gnuarchiver.h index 4d21abe..4305827 100644 --- a/source/gnuarchiver.h +++ b/source/gnuarchiver.h @@ -13,7 +13,7 @@ public: Target *create_target(const std::vector &, const std::string &) override; private: - static Task *_run(const StaticLibrary &); + static ExternalTask::Arguments _run(const StaticLibrary &, Msp::FS::Path &); }; #endif diff --git a/source/gnucompiler.cpp b/source/gnucompiler.cpp index 0c5f2f8..3236631 100644 --- a/source/gnucompiler.cpp +++ b/source/gnucompiler.cpp @@ -6,7 +6,6 @@ #include "builder.h" #include "component.h" #include "csourcefile.h" -#include "externaltask.h" #include "gnucompiler.h" #include "objcsourcefile.h" #include "objectfile.h" @@ -50,7 +49,7 @@ GnuCompiler::GnuCompiler(Builder &b, const Architecture &a, const string &t): throw invalid_argument("GnuCompiler::GnuCompiler"); set_command((tag=="CXX" ? "g++" : "gcc"), true); - set_run(_run); + set_run_external(_run); } Target *GnuCompiler::create_source(const Component &comp, const FS::Path &path) const @@ -213,7 +212,7 @@ unsigned GnuCompiler::query_version(const string &exe_path, const string &arg) c return ver; } -Task *GnuCompiler::_run(const ObjectFile &object) +ExternalTask::Arguments GnuCompiler::_run(const ObjectFile &object, FS::Path &work_dir) { const Tool &tool = *object.get_tool(); const Architecture &arch = *tool.get_architecture(); @@ -345,11 +344,10 @@ Task *GnuCompiler::_run(const ObjectFile &object) FS::Path obj_path = object.get_path(); FS::Path src_path = object.get_source().get_path(); - FS::Path work_dir = object.get_component()->get_package().get_source_directory(); argv.push_back("-o"); argv.push_back(relative(obj_path, work_dir).str()); argv.push_back(relative(src_path, work_dir).str()); - return new ExternalTask(argv, work_dir); + return argv; } diff --git a/source/gnucompiler.h b/source/gnucompiler.h index 54e1d76..b0d0ec9 100644 --- a/source/gnucompiler.h +++ b/source/gnucompiler.h @@ -28,7 +28,7 @@ protected: unsigned query_version(const std::string &, const std::string &) const; private: - static Task *_run(const ObjectFile &); + static ExternalTask::Arguments _run(const ObjectFile &, Msp::FS::Path &); }; #endif diff --git a/source/gnulinker.cpp b/source/gnulinker.cpp index dacd54d..b726dd5 100644 --- a/source/gnulinker.cpp +++ b/source/gnulinker.cpp @@ -9,7 +9,6 @@ #include "component.h" #include "executable.h" #include "exportdefinitions.h" -#include "externaltask.h" #include "gnucompiler.h" #include "gnulinker.h" #include "importlibrary.h" @@ -31,7 +30,7 @@ GnuLinker::GnuLinker(Builder &b, const Architecture &a): processing_unit = COMPONENT; set_command("gcc", true); - set_run(_run); + set_run_external(_run); } Target *GnuLinker::create_target(const vector &sources, const string &arg) @@ -199,7 +198,7 @@ void GnuLinker::do_prepare(ToolData &tool) const } } -Task *GnuLinker::_run(const Binary &bin) +ExternalTask::Arguments GnuLinker::_run(const Binary &bin, FS::Path &work_dir) { const Tool &tool = *bin.get_tool(); const Builder &builder = tool.get_builder(); @@ -208,8 +207,6 @@ Task *GnuLinker::_run(const Binary &bin) ExternalTask::Arguments argv; argv.push_back(tool.get_executable()->get_path().str()); - FS::Path work_dir = bin.get_component()->get_package().get_source_directory(); - if(const SharedLibrary *shlib = dynamic_cast(&bin)) { argv.push_back("-shared"); @@ -324,5 +321,5 @@ Task *GnuLinker::_run(const Binary &bin) argv.push_back("-Wl,--enable-auto-import"); } - return new ExternalTask(argv, work_dir); + return argv; } diff --git a/source/gnulinker.h b/source/gnulinker.h index 9964ffa..a0632d6 100644 --- a/source/gnulinker.h +++ b/source/gnulinker.h @@ -23,7 +23,7 @@ public: protected: void do_prepare(ToolData &) const override; private: - static Task *_run(const Binary &); + static ExternalTask::Arguments _run(const Binary &, Msp::FS::Path &); }; #endif diff --git a/source/jarsigner.cpp b/source/jarsigner.cpp index ac7c779..a2a1c73 100644 --- a/source/jarsigner.cpp +++ b/source/jarsigner.cpp @@ -1,7 +1,6 @@ #include #include #include "component.h" -#include "externaltask.h" #include "filetarget.h" #include "jarsigner.h" #include "sourcepackage.h" @@ -13,7 +12,7 @@ JarSigner::JarSigner(Builder &b): Tool(b, "JSGN") { set_command("jarsigner"); - set_run(_run); + set_run_external(_run); } Target *JarSigner::create_target(const vector &, const string &) @@ -21,7 +20,7 @@ Target *JarSigner::create_target(const vector &, const string &) throw logic_error("not implemented"); } -Task *JarSigner::_run(const FileTarget &file) +ExternalTask::Arguments JarSigner::_run(const FileTarget &file, FS::Path &work_dir) { const Tool &tool = *file.get_tool(); @@ -35,10 +34,8 @@ Task *JarSigner::_run(const FileTarget &file) argv.push_back("-storepass"); argv.push_back("android"); - FS::Path work_dir = file.get_component()->get_package().get_source_directory(); - argv.push_back(FS::relative(file.get_path(), work_dir).str()); argv.push_back("androiddebugkey"); - return new ExternalTask(argv, work_dir); + return argv; } diff --git a/source/jarsigner.h b/source/jarsigner.h index f1b1c4f..d836348 100644 --- a/source/jarsigner.h +++ b/source/jarsigner.h @@ -13,7 +13,7 @@ public: Target *create_target(const std::vector &, const std::string &) override; private: - static Task *_run(const FileTarget &); + static ExternalTask::Arguments _run(const FileTarget &, Msp::FS::Path &); }; #endif diff --git a/source/msvcarchiver.cpp b/source/msvcarchiver.cpp index 26fbc1d..d0489cf 100644 --- a/source/msvcarchiver.cpp +++ b/source/msvcarchiver.cpp @@ -1,6 +1,5 @@ #include #include "component.h" -#include "externaltask.h" #include "microsofttools.h" #include "msvcarchiver.h" #include "objectfile.h" @@ -17,7 +16,7 @@ MsvcArchiver::MsvcArchiver(Builder &b, const Architecture &a, const MicrosoftToo input_suffixes.push_back(".o"); processing_unit = COMPONENT; set_command((ms_tools.get_vc_bin_dir()/"lib.exe").str(), false); - set_run(_run); + set_run_external(_run); } Target *MsvcArchiver::create_target(const vector &sources, const string &) @@ -36,22 +35,19 @@ Target *MsvcArchiver::create_target(const vector &sources, const strin return lib; } -Task *MsvcArchiver::_run(const StaticLibrary &lib) +ExternalTask::Arguments MsvcArchiver::_run(const StaticLibrary &lib, FS::Path &work_dir) { - const Component &comp = *lib.get_component(); const Tool &tool = *lib.get_tool(); vector argv; argv.push_back(tool.get_executable()->get_path().str()); argv.push_back("/NOLOGO"); - FS::Path work_dir = comp.get_package().get_source_directory(); - argv.push_back("/OUT:"+relative(lib.get_path(), work_dir).str()); for(Target *d: lib.get_dependencies()) if(ObjectFile *obj = dynamic_cast(d)) argv.push_back(relative(obj->get_path(), work_dir).str()); - return new ExternalTask(argv, work_dir); + return argv; } diff --git a/source/msvcarchiver.h b/source/msvcarchiver.h index 8b31bd9..7af9571 100644 --- a/source/msvcarchiver.h +++ b/source/msvcarchiver.h @@ -17,7 +17,7 @@ public: Target *create_target(const std::vector &, const std::string &) override; private: - static Task *_run(const StaticLibrary &); + static ExternalTask::Arguments _run(const StaticLibrary &, Msp::FS::Path &); }; #endif diff --git a/source/msvccompiler.cpp b/source/msvccompiler.cpp index 7d751de..56c99c3 100644 --- a/source/msvccompiler.cpp +++ b/source/msvccompiler.cpp @@ -6,7 +6,6 @@ #include "builder.h" #include "component.h" #include "csourcefile.h" -#include "externaltask.h" #include "microsofttools.h" #include "msvccompiler.h" #include "objectfile.h" @@ -34,7 +33,7 @@ MsvcCompiler::MsvcCompiler(Builder &b, const Architecture &a, const string &t, c throw invalid_argument("MsvcCompiler::MsvcCompiler"); set_command((ms_tools.get_vc_bin_dir()/"cl.exe").str(), false); - set_run(_run); + set_run_external(_run); } Target *MsvcCompiler::create_source(const Component &comp, const FS::Path &path) const @@ -96,7 +95,7 @@ void MsvcCompiler::do_prepare(ToolData &tool) const setenv("INCLUDE", path); } -Task *MsvcCompiler::_run(const ObjectFile &object) +ExternalTask::Arguments MsvcCompiler::_run(const ObjectFile &object, FS::Path &work_dir) { const Tool &tool = *object.get_tool(); @@ -174,10 +173,9 @@ Task *MsvcCompiler::_run(const ObjectFile &object) FS::Path obj_path = object.get_path(); FS::Path src_path = object.get_source().get_path(); - FS::Path work_dir = object.get_component()->get_package().get_source_directory(); argv.push_back("/Fo"+relative(obj_path, work_dir).str()); argv.push_back(relative(src_path, work_dir).str()); - return new ExternalTask(argv, work_dir); + return argv; } diff --git a/source/msvccompiler.h b/source/msvccompiler.h index f3b9a31..2782c23 100644 --- a/source/msvccompiler.h +++ b/source/msvccompiler.h @@ -23,7 +23,7 @@ protected: void do_prepare(ToolData &) const override; public: - static Task *_run(const ObjectFile &); + static ExternalTask::Arguments _run(const ObjectFile &, Msp::FS::Path &); }; #endif diff --git a/source/msvclinker.cpp b/source/msvclinker.cpp index 968bd5d..9352c0f 100644 --- a/source/msvclinker.cpp +++ b/source/msvclinker.cpp @@ -4,7 +4,6 @@ #include "builder.h" #include "component.h" #include "executable.h" -#include "externaltask.h" #include "importlibrary.h" #include "microsofttools.h" #include "msvclinker.h" @@ -26,7 +25,7 @@ MsvcLinker::MsvcLinker(Builder &b, const Architecture &a, const MicrosoftTools & processing_unit = COMPONENT; set_command((ms_tools.get_vc_bin_dir()/"link.exe").str(), false); - set_run(_run); + set_run_external(_run); } Target *MsvcLinker::create_target(const vector &sources, const string &arg) @@ -87,7 +86,7 @@ void MsvcLinker::do_prepare(ToolData &tool) const setenv("LIB", path); } -Task *MsvcLinker::_run(const Binary &bin) +ExternalTask::Arguments MsvcLinker::_run(const Binary &bin, FS::Path &work_dir) { const Tool &tool = *bin.get_tool(); @@ -95,8 +94,6 @@ Task *MsvcLinker::_run(const Binary &bin) argv.push_back(tool.get_executable()->get_path().str()); argv.push_back("/NOLOGO"); - FS::Path work_dir = bin.get_component()->get_package().get_source_directory(); - if(dynamic_cast(&bin)) argv.push_back("/DLL"); @@ -127,5 +124,5 @@ Task *MsvcLinker::_run(const Binary &bin) argv.push_back("/SUBSYSTEM:CONSOLE"); - return new ExternalTask(argv, work_dir); + return argv; } diff --git a/source/msvclinker.h b/source/msvclinker.h index 44cb986..4320e48 100644 --- a/source/msvclinker.h +++ b/source/msvclinker.h @@ -21,7 +21,7 @@ protected: void do_prepare(ToolData &data) const override; public: - static Task *_run(const Binary &); + static ExternalTask::Arguments _run(const Binary &, Msp::FS::Path &); }; #endif diff --git a/source/sourcegenerator.cpp b/source/sourcegenerator.cpp index 72297fd..d30a2bc 100644 --- a/source/sourcegenerator.cpp +++ b/source/sourcegenerator.cpp @@ -2,7 +2,6 @@ #include #include "builder.h" #include "executable.h" -#include "externaltask.h" #include "sourcegenerator.h" #include "sourcepackage.h" #include "templatefile.h" @@ -14,7 +13,7 @@ SourceGenerator::SourceGenerator(Builder &b, const SourcePackage &p, const strin Tool(b, t), package(p) { - set_run(&_run); + set_run_external(&_run); } Target *SourceGenerator::create_source(const Component &comp, const FS::Path &path) const @@ -71,9 +70,8 @@ Target *SourceGenerator::create_target(const vector &sources, const st return primary; } -Task *SourceGenerator::_run(const SourceFile &out_src) +ExternalTask::Arguments SourceGenerator::_run(const SourceFile &out_src, FS::Path &work_dir) { - const FS::Path &work_dir = out_src.get_package()->get_source_directory(); const SourceGenerator &tool = dynamic_cast(*out_src.get_tool()); vector args; @@ -88,7 +86,7 @@ Task *SourceGenerator::_run(const SourceFile &out_src) args.push_back(tool.out_argument); args.push_back(FS::relative(out_src.get_path(), work_dir).str()); - return new ExternalTask(args, work_dir); + return args; } diff --git a/source/sourcegenerator.h b/source/sourcegenerator.h index e9fe308..b8dee24 100644 --- a/source/sourcegenerator.h +++ b/source/sourcegenerator.h @@ -38,7 +38,7 @@ public: Target *create_target(const std::vector &, const std::string &) override; private: - static Task *_run(const SourceFile &); + static ExternalTask::Arguments _run(const SourceFile &, Msp::FS::Path &); }; #endif diff --git a/source/tool.h b/source/tool.h index dab39e7..b756563 100644 --- a/source/tool.h +++ b/source/tool.h @@ -6,7 +6,10 @@ #include #include #include "buildinfo.h" +#include "externaltask.h" #include "internaltask.h" +#include "sourcepackage.h" +#include "target.h" #include "virtualfilesystem.h" class Architecture; @@ -14,7 +17,6 @@ class Builder; class BuildInfo; class Component; class FileTarget; -class Target; class ToolData { @@ -71,7 +73,7 @@ protected: void set_run(std::function); template - void set_run(Task *(*)(const T &)); + void set_run_external(ExternalTask::Arguments (*)(const T &, Msp::FS::Path &)); template void set_run_internal(bool (*)(const T &)); @@ -149,9 +151,13 @@ public: template -void Tool::set_run(Task *(*f)(const T &)) +void Tool::set_run_external(ExternalTask::Arguments (*f)(const T &, Msp::FS::Path &)) { - set_run([f](const Target &t){ return f(dynamic_cast(t)); }); + set_run([f](const Target &t){ + Msp::FS::Path work_dir = t.get_package()->get_source_directory(); + ExternalTask::Arguments args = f(dynamic_cast(t), work_dir); + return new ExternalTask(args, work_dir); + }); } template -- 2.43.0