]> git.tdb.fi Git - builder.git/commitdiff
Refactor the use of external tasks in tools
authorMikko Rasa <tdb@tdb.fi>
Tue, 27 Dec 2022 19:52:10 +0000 (21:52 +0200)
committerMikko Rasa <tdb@tdb.fi>
Tue, 27 Dec 2022 19:52:10 +0000 (21:52 +0200)
The run functions now just return the arguments, and a wrapper in the
Tool class creates the task object.

21 files changed:
source/androidassetpackagingtool.cpp
source/androidassetpackagingtool.h
source/apkbuilder.cpp
source/apkbuilder.h
source/gnuarchiver.cpp
source/gnuarchiver.h
source/gnucompiler.cpp
source/gnucompiler.h
source/gnulinker.cpp
source/gnulinker.h
source/jarsigner.cpp
source/jarsigner.h
source/msvcarchiver.cpp
source/msvcarchiver.h
source/msvccompiler.cpp
source/msvccompiler.h
source/msvclinker.cpp
source/msvclinker.h
source/sourcegenerator.cpp
source/sourcegenerator.h
source/tool.h

index a511da04986ba65eae493f31965e1becfbb4a5c5..eb638e96d6fb01763732c267d2e70b08d8cae588 100644 (file)
@@ -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<Target *> &sources, const string &)
@@ -49,7 +48,7 @@ Target *AndroidAssetPackagingTool::create_target(const vector<Target *> &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<const AndroidAssetPackagingTool &>(*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;
 }
index e4f0f770ad879ab606ae3d87a9f6d4732ee98981..252870f8a4243b230fe0b43383f346b1014f0462 100644 (file)
@@ -17,7 +17,7 @@ public:
        Target *create_target(const std::vector<Target *> &, const std::string &) override;
 
 private:
-       static Task *_run(const AndroidResourceBundle &);
+       static ExternalTask::Arguments _run(const AndroidResourceBundle &, Msp::FS::Path &);
 };
 
 #endif
index e426c89319d4fd4fb2314f9de302a64ae49ff9e3..f62e4851526b99d9d066b267e4718543a3b8ba05 100644 (file)
@@ -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<const AndroidPackageFile &>(tgt);
        const ApkBuilder &tool = dynamic_cast<const ApkBuilder &>(*apk.get_tool());
 
        ExternalTask::Arguments argv;
index 96525e017981ca12a301976444cbf3d6d79c1e16..8eaaeefbf1e76b69a23007839be1050c4005668a 100644 (file)
@@ -15,7 +15,7 @@ protected:
        void do_prepare(ToolData &) const override;
 
 private:
-       static Task *_run(const AndroidPackageFile &);
+       static Task *_run(const Target &);
 };
 
 #endif
index 629cb708637c6c090d55b92a74b3df649e8280a3..dc0b78494c90f4293ba3fa50379cbf12a2a3d479 100644 (file)
@@ -4,7 +4,6 @@
 #include <stdexcept>
 #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<Target *> &sources, const string &)
@@ -38,22 +37,19 @@ Target *GnuArchiver::create_target(const vector<Target *> &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<string> 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<ObjectFile *>(d))
                        argv.push_back(relative(obj->get_path(), work_dir).str());
 
-       return new ExternalTask(argv, work_dir);
+       return argv;
 }
index 4d21abebaf4c27c56dc45729d713d1f63192029c..4305827f7a8323d7270d417d3f089c7716de5bc2 100644 (file)
@@ -13,7 +13,7 @@ public:
        Target *create_target(const std::vector<Target *> &, const std::string &) override;
 
 private:
-       static Task *_run(const StaticLibrary &);
+       static ExternalTask::Arguments _run(const StaticLibrary &, Msp::FS::Path &);
 };
 
 #endif
index 0c5f2f8611db9eb588b8649fe3867f313153c5fc..3236631d756d69b10a0fc0172b4f580972d0a863 100644 (file)
@@ -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;
 }
index 54e1d76cdf27d9644fe2707f786d56f861dae0d1..b0d0ec9e0afc040edfdc722d5979c0a12ebe6d42 100644 (file)
@@ -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
index dacd54d5b1649e7b08fd7bc0885895df0dbcd3a1..b726dd5846cb6ed228955adfe3d7a73510d0ff96 100644 (file)
@@ -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<Target *> &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<const SharedLibrary *>(&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;
 }
index 9964ffa146277551d2413b8adc8f0cfcac89566d..a0632d6ab3fdabdb50c754896c90ed9351eaedf2 100644 (file)
@@ -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
index ac7c779b7c1c957c56d56c47505262c9f5bf6b3f..a2a1c731e1ce6d16e127d1abf87f58592212789c 100644 (file)
@@ -1,7 +1,6 @@
 #include <msp/core/environ.h>
 #include <msp/fs/utils.h>
 #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<Target *> &, const string &)
@@ -21,7 +20,7 @@ Target *JarSigner::create_target(const vector<Target *> &, 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;
 }
index f1b1c4fb6cc0669004e67f5fb8e22769ebaa113f..d836348ca71e822310b29a48979fbf9bb466db5e 100644 (file)
@@ -13,7 +13,7 @@ public:
        Target *create_target(const std::vector<Target *> &, const std::string &) override;
 
 private:
-       static Task *_run(const FileTarget &);
+       static ExternalTask::Arguments _run(const FileTarget &, Msp::FS::Path &);
 };
 
 #endif
index 26fbc1d980a81888b45062ddf11ecc164040d9d4..d0489cf10bd6cdeac5af213956dbc37cc5e816d2 100644 (file)
@@ -1,6 +1,5 @@
 #include <msp/fs/utils.h>
 #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<Target *> &sources, const string &)
@@ -36,22 +35,19 @@ Target *MsvcArchiver::create_target(const vector<Target *> &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<string> 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<ObjectFile *>(d))
                        argv.push_back(relative(obj->get_path(), work_dir).str());
 
-       return new ExternalTask(argv, work_dir);
+       return argv;
 }
index 8b31bd99523fba40bea18e538ce7946d2b697b65..7af9571834605a5772f0d50218aeedc307cd3ee6 100644 (file)
@@ -17,7 +17,7 @@ public:
        Target *create_target(const std::vector<Target *> &, const std::string &) override;
 
 private:
-       static Task *_run(const StaticLibrary &);
+       static ExternalTask::Arguments _run(const StaticLibrary &, Msp::FS::Path &);
 };
 
 #endif
index 7d751dea1882ecf2ea3cde2d946856c5768f10eb..56c99c33f4c096949b4b8ffd7c22ec82d324baec 100644 (file)
@@ -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;
 }
index f3b9a31b295d945e08247c485fe447a4d35beaaf..2782c23aee25a6649da04a523525993493f8afdc 100644 (file)
@@ -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
index 968bd5dd884cf6a75442d0587d843b185d338290..9352c0f51414626118c4a3a5fb857a9d92917fb8 100644 (file)
@@ -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<Target *> &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<const SharedLibrary *>(&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;
 }
index 44cb9863ddda65b1b483e51ae26f40c07b5f8a7d..4320e481a28d17681af4a522b35af1d69b596903 100644 (file)
@@ -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
index 72297fd5eed411b19528681a6743492e16ca5e4a..d30a2bc67fdefa3687e6c18193b0c9eaae504c7c 100644 (file)
@@ -2,7 +2,6 @@
 #include <msp/strings/format.h>
 #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<Target *> &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<const SourceGenerator &>(*out_src.get_tool());
 
        vector<string> 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;
 }
 
 
index e9fe3087e07e7eb864b00c32ab1b8985db3b24b7..b8dee24acfd8796de62900df56b5975261f98876 100644 (file)
@@ -38,7 +38,7 @@ public:
        Target *create_target(const std::vector<Target *> &, const std::string &) override;
 
 private:
-       static Task *_run(const SourceFile &);
+       static ExternalTask::Arguments _run(const SourceFile &, Msp::FS::Path &);
 };
 
 #endif
index dab39e7424882ffc10a840bbda2fe916bc938a59..b756563242ba4099152f0ce125bd93a6504d9ffb 100644 (file)
@@ -6,7 +6,10 @@
 #include <vector>
 #include <msp/fs/path.h>
 #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<Task *(const Target &)>);
 
        template<typename T>
-       void set_run(Task *(*)(const T &));
+       void set_run_external(ExternalTask::Arguments (*)(const T &, Msp::FS::Path &));
 
        template<typename T>
        void set_run_internal(bool (*)(const T &));
@@ -149,9 +151,13 @@ public:
 
 
 template<typename T>
-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<const T &>(t)); });
+       set_run([f](const Target &t){
+               Msp::FS::Path work_dir = t.get_package()->get_source_directory();
+               ExternalTask::Arguments args = f(dynamic_cast<const T &>(t), work_dir);
+               return new ExternalTask(args, work_dir);
+       });
 }
 
 template<typename T>