+/* $Id$
+
+This file is part of builder
+Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
#include <iostream>
-#include <msp/algo.h>
#include "builder.h"
#include "component.h"
#include "executable.h"
*/
void Executable::find_depends()
{
- const string &staticlibs=package->get_config().get_option("staticlibs").value;
- unsigned libmode=0;
- if(staticlibs=="all")
- libmode=2;
- else if(staticlibs=="local")
- libmode=1;
-
- //XXX Duplicate libraries?
+ LibMode libmode=comp.get_package().get_library_mode();
+
list<const Component *> queue;
+ list<Target *> dep_libs;
queue.push_back(&comp);
while(!queue.empty())
{
const Component *c=queue.front();
queue.erase(queue.begin());
-
+
+ const StringList &libpath=c->get_build_info().libpath;
+ const string &arch=c->get_package().get_arch();
+
const list<string> &libs=c->get_build_info().libs;
for(StringList::const_iterator i=libs.begin(); i!=libs.end(); ++i)
{
- Target *lib=builder.get_library(*i, c->get_build_info().libpath, libmode);
+ Target *lib=builder.get_library(*i, arch, libpath, libmode);
if(lib)
{
- if(contains(depends, lib))
- continue;
- add_depend(lib);
+ dep_libs.push_back(lib);
if(dynamic_cast<Install *>(lib))
lib=lib->get_depends().front();
}
}
+ /* Add only the last occurrence of each library to the actual dependencies.
+ This ensures that static library ordering is correct. */
+ for(list<Target *>::iterator i=dep_libs.begin(); i!=dep_libs.end(); ++i)
+ {
+ bool last=true;
+ for(list<Target *>::iterator j=i; (last && j!=dep_libs.end()); ++j)
+ last=(j==i || *j!=*i);
+ if(last)
+ add_depend(*i);
+ }
+
deps_ready=true;
}
string Executable::generate_target_name(const Component &c)
{
string prefix,suffix;
+ const string &arch=c.get_package().get_arch();
if(c.get_type()==Component::LIBRARY)
{
prefix="lib";
- suffix=".so";
+ if(arch=="win32")
+ suffix=".dll";
+ else
+ suffix=".so";
+ }
+ else if(c.get_type()==Component::MODULE)
+ suffix=".m";
+ else if(c.get_type()==Component::PROGRAM)
+ {
+ if(arch=="win32")
+ suffix=".exe";
}
- return (c.get_package().get_source()/(prefix+c.get_name()+suffix)).str();
+ return (c.get_package().get_out_dir()/(prefix+c.get_name()+suffix)).str();
}