Do not use static libraries when linking dynamic ones
{
const Component &comp=lib.get_component();
{
const Component &comp=lib.get_component();
+ work_dir=comp.get_package().get_source();
+
std::string tool="AR";
argv.push_back(builder.get_current_arch().get_tool(tool));
argv.push_back("rc");
std::string tool="AR";
argv.push_back(builder.get_current_arch().get_tool(tool));
argv.push_back("rc");
- argv.push_back(lib.get_name());
+ argv.push_back(relative(lib.get_name(), work_dir).str());
const TargetList &deps=lib.get_depends();
for(TargetList::const_iterator i=deps.begin(); i!=deps.end(); ++i)
if(dynamic_cast<ObjectFile *>(*i))
const TargetList &deps=lib.get_depends();
for(TargetList::const_iterator i=deps.begin(); i!=deps.end(); ++i)
if(dynamic_cast<ObjectFile *>(*i))
- argv.push_back((*i)->get_name());
+ argv.push_back(relative((*i)->get_name(), work_dir).str());
Path lpath=lib.get_name();
if(!builder.get_dry_run())
mkpath(lpath.subpath(0, lpath.size()-1), 0755);
Path lpath=lib.get_name();
if(!builder.get_dry_run())
mkpath(lpath.subpath(0, lpath.size()-1), 0755);
- announce(comp.get_package().get_name(), tool, relative(lpath, comp.get_package().get_source()).str());
+ announce(comp.get_package().get_name(), tool, relative(lpath, work_dir).str());
{
const Component &comp=obj.get_component();
{
const Component &comp=obj.get_component();
+ work_dir=comp.get_package().get_source();
+
const TargetList &deps=obj.get_depends();
Path spath=deps.front()->get_name();
const TargetList &deps=obj.get_depends();
Path spath=deps.front()->get_name();
Path opath=obj.get_name();
argv.push_back("-o");
Path opath=obj.get_name();
argv.push_back("-o");
- argv.push_back(opath.str());
- argv.push_back(spath.str());
+ argv.push_back(relative(opath, work_dir).str());
+ argv.push_back(relative(spath, work_dir).str());
if(!builder.get_dry_run())
mkpath(opath.subpath(0, opath.size()-1), 0755);
if(!builder.get_dry_run())
mkpath(opath.subpath(0, opath.size()-1), 0755);
- announce(comp.get_package().get_name(), tool, relative(opath, comp.get_package().get_source()).str());
+ announce(comp.get_package().get_name(), tool, relative(opath, work_dir).str());
#include "link.h"
#include "objectfile.h"
#include "package.h"
#include "link.h"
#include "objectfile.h"
#include "package.h"
+#include "sharedlibrary.h"
#include "staticlibrary.h"
using namespace std;
#include "staticlibrary.h"
using namespace std;
void Executable::find_depends()
{
LibMode libmode=comp.get_package().get_library_mode();
void Executable::find_depends()
{
LibMode libmode=comp.get_package().get_library_mode();
+ if(dynamic_cast<SharedLibrary *>(this))
+ libmode=DYNAMIC;
list<const Component *> queue;
list<Target *> dep_libs;
list<const Component *> queue;
list<Target *> dep_libs;
#include <sys/wait.h>
#include <iostream>
#include <sys/wait.h>
#include <iostream>
+#include <msp/path/utils.h>
#include "builder.h"
#include "externalaction.h"
#include "builder.h"
#include "externalaction.h"
argv_[j++]=strdup(i->c_str());
argv_[j]=0;
argv_[j++]=strdup(i->c_str());
argv_[j]=0;
+ if(!work_dir.empty())
+ chdir(work_dir);
execvp(argv_[0], argv_);
cout<<"Couldn't execute "<<argv.front()<<'\n';
exit(1);
execvp(argv_[0], argv_);
cout<<"Couldn't execute "<<argv.front()<<'\n';
exit(1);
int check();
protected:
StringList argv;
int check();
protected:
StringList argv;
{
const Component &comp=exe.get_component();
{
const Component &comp=exe.get_component();
+ work_dir=comp.get_package().get_source();
+
//XXX Determine whether to use g++ or gcc
string tool="LXX";
argv.push_back(builder.get_current_arch().get_tool(tool));
//XXX Determine whether to use g++ or gcc
string tool="LXX";
argv.push_back(builder.get_current_arch().get_tool(tool));
argv.push_back("-L"+*i);
argv.push_back("-o");
argv.push_back("-L"+*i);
argv.push_back("-o");
- argv.push_back(exe.get_name());
+ argv.push_back(relative(exe.get_name(), work_dir).str());
const TargetList &deps=exe.get_depends();
for(TargetList::const_iterator i=deps.begin(); i!=deps.end(); ++i)
{
const TargetList &deps=exe.get_depends();
for(TargetList::const_iterator i=deps.begin(); i!=deps.end(); ++i)
{
tgt=tgt->get_depends().front();
if(dynamic_cast<ObjectFile *>(tgt))
tgt=tgt->get_depends().front();
if(dynamic_cast<ObjectFile *>(tgt))
- argv.push_back((*i)->get_name());
+ argv.push_back(relative((*i)->get_name(), work_dir).str());
else if(SharedLibrary *shlib=dynamic_cast<SharedLibrary *>(tgt))
argv.push_back("-l"+shlib->get_libname());
else if(dynamic_cast<StaticLibrary *>(tgt))
else if(SharedLibrary *shlib=dynamic_cast<SharedLibrary *>(tgt))
argv.push_back("-l"+shlib->get_libname());
else if(dynamic_cast<StaticLibrary *>(tgt))
- argv.push_back((*i)->get_name());
+ argv.push_back(relative((*i)->get_name(), work_dir).str());
else if(SystemLibrary *syslib=dynamic_cast<SystemLibrary *>(tgt))
argv.push_back("-l"+syslib->get_libname());
}
else if(SystemLibrary *syslib=dynamic_cast<SystemLibrary *>(tgt))
argv.push_back("-l"+syslib->get_libname());
}
if(!builder.get_dry_run())
mkpath(epath.subpath(0, epath.size()-1), 0755);
if(!builder.get_dry_run())
mkpath(epath.subpath(0, epath.size()-1), 0755);
- announce(comp.get_package().get_name(), tool, relative(epath, comp.get_package().get_source()).str());
+ announce(comp.get_package().get_name(), tool, relative(epath, work_dir).str());
};
SourcePackage(Builder &, const std::string &, const Msp::Path &);
};
SourcePackage(Builder &, const std::string &, const Msp::Path &);
- void set_path(const Msp::Path &);
const std::string &get_name() const { return name; }
const std::string &get_version() const { return version; }
const std::string &get_description() const { return description; }
const std::string &get_name() const { return name; }
const std::string &get_version() const { return version; }
const std::string &get_description() const { return description; }