]> git.tdb.fi Git - builder.git/blob - source/msvcarchiver.cpp
Refactor the use of external tasks in tools
[builder.git] / source / msvcarchiver.cpp
1 #include <msp/fs/utils.h>
2 #include "component.h"
3 #include "microsofttools.h"
4 #include "msvcarchiver.h"
5 #include "objectfile.h"
6 #include "sourcepackage.h"
7 #include "staticlibrary.h"
8
9 using namespace std;
10 using namespace Msp;
11
12 MsvcArchiver::MsvcArchiver(Builder &b, const Architecture &a, const MicrosoftTools &m):
13         Tool(b, &a, "AR"),
14         ms_tools(m)
15 {
16         input_suffixes.push_back(".o");
17         processing_unit = COMPONENT;
18         set_command((ms_tools.get_vc_bin_dir()/"lib.exe").str(), false);
19         set_run_external(_run);
20 }
21
22 Target *MsvcArchiver::create_target(const vector<Target *> &sources, const string &)
23 {
24         if(sources.empty())
25                 throw invalid_argument("MsvcArchiver::create_target");
26
27         vector<ObjectFile *> objs;
28         objs.reserve(sources.size());
29         for(Target *s: sources)
30                 objs.push_back(&dynamic_cast<ObjectFile &>(*s));
31
32         const Component &comp = *objs.front()->get_component();
33         StaticLibrary *lib = new StaticLibrary(builder, comp, objs);
34         lib->set_tool(*this);
35         return lib;
36 }
37
38 ExternalTask::Arguments MsvcArchiver::_run(const StaticLibrary &lib, FS::Path &work_dir)
39 {
40         const Tool &tool = *lib.get_tool();
41
42         vector<string> argv;
43         argv.push_back(tool.get_executable()->get_path().str());
44         argv.push_back("/NOLOGO");
45
46         argv.push_back("/OUT:"+relative(lib.get_path(), work_dir).str());
47
48         for(Target *d: lib.get_dependencies())
49                 if(ObjectFile *obj = dynamic_cast<ObjectFile *>(d))
50                         argv.push_back(relative(obj->get_path(), work_dir).str());
51
52         return argv;
53 }