]> git.tdb.fi Git - builder.git/blobdiff - source/gnulinker.cpp
More flexible way to manage filename patterns
[builder.git] / source / gnulinker.cpp
index faa62024e250aee1414caab7f52aed7ed794ebe8..2d37a4d93533b4486d865a043f691f3725ff4aa5 100644 (file)
@@ -85,8 +85,7 @@ Target *GnuLinker::create_install(Target &target) const
                        builder.get_build_graph().add_installed_target(*shlib->get_import_library());
                else
                {
-                       const Pattern &pattern = architecture->get_shared_library_patterns().front();
-                       string link_name = pattern.apply(shlib->get_libname());
+                       string link_name = architecture->create_filename<SharedLibrary>(shlib->get_libname());
                        if(link_name!=FS::basename(inst_tgt->get_path()))
                                inst_tgt->set_symlink(link_name);
                }
@@ -271,6 +270,16 @@ Task *GnuLinker::Linker::run(const Target &target) const
        if(!sysroot.empty())
                argv.push_back("--sysroot="+sysroot.str());
 
+       FS::Path lib_dir = builder.get_prefix()/"lib";
+       if(binfo.rpath_mode==BuildInfo::ABSOLUTE)
+               argv.push_back("-Wl,-rpath,"+lib_dir.str());
+       else
+       {
+               if(binfo.rpath_mode==BuildInfo::RELATIVE)
+                       argv.push_back("-Wl,-rpath,$ORIGIN/../lib");
+               argv.push_back("-Wl,-rpath-link,"+lib_dir.str());
+       }
+
        for(BuildInfo::PathList::const_iterator i=binfo.libpath.begin(); i!=binfo.libpath.end(); ++i)
                argv.push_back("-L"+i->str());
        if(binfo.strip)
@@ -290,9 +299,6 @@ Task *GnuLinker::Linker::run(const Target &target) const
 
        bool static_link_ok = (binfo.libmode<=BuildInfo::STATIC);
 
-       if(architecture->get_system()=="windows" && architecture->get_cross_prefix().find("mingw")!=string::npos)
-               argv.push_back("-lmingw32");
-
        const Target::Dependencies &depends = target.get_dependencies();
        for(Target::Dependencies::const_iterator i=depends.begin(); i!=depends.end(); ++i)
        {
@@ -328,8 +334,18 @@ Task *GnuLinker::Linker::run(const Target &target) const
 
        if(static_link_ok)
                argv.push_back("-static");
-       else if(architecture->get_system()=="windows")
-               argv.push_back("-Wl,--enable-auto-import");
+       else
+       {
+               if(compiler_tag=="CXX")
+               {
+                       BuildInfo::LibModeMap::const_iterator i = binfo.libmodes.find("stdc++");
+                       if(i!=binfo.libmodes.end() && i->second<=BuildInfo::STATIC)
+                               argv.push_back("-static-libstdc++");
+               }
+
+               if(architecture->get_system()=="windows")
+                       argv.push_back("-Wl,--enable-auto-import");
+       }
 
        return new ExternalTask(argv, work_dir);
 }