X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fbuilder.cpp;h=7135a8d97b1a42a4e6aa24860ade31c32fa4f9b4;hb=83d2a8a39e0a09733ffc666d7f885fc328b831f2;hp=b06b8ffb2fd0b1de4c7b288989cd8704ce295919;hpb=2edc25f87590bd81808792c3c38cab5ae8b94eb3;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index b06b8ff..7135a8d 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -6,6 +6,7 @@ Distributed under the LGPL */ #include +#include #include #include #include @@ -194,6 +195,25 @@ Builder::~Builder() int Builder::main() { + if(prefix.str()!="/usr") + { + FS::Path pcdir=prefix/"lib"/"pkgconfig"; + if(const char *pcp=getenv("PKG_CONFIG_PATH")) + { + vector path=split(pcp, ':'); + bool found=false; + for(vector::const_iterator i=path.begin(); (!found && i!=path.end()); ++i) + found=(*i==pcdir.str()); + if(!found) + { + path.push_back(pcdir.str()); + setenv("PKG_CONFIG_PATH", join(path.begin(), path.end(), ":").c_str(), true); + } + } + else + setenv("PKG_CONFIG_PATH", pcdir.str().c_str(), true); + } + if(load_build_file(cwd/build_file)) { if(help) @@ -269,8 +289,6 @@ int Builder::main() return 1; } - //if(create_makefile - if(clean) exit_code=do_clean(); else if(build) @@ -279,6 +297,32 @@ int Builder::main() return exit_code; } +string Builder::run_pkgconfig(const string &pkg, const string &what) +{ + list argv; + argv.push_back("pkg-config"); + if(what=="cflags" || what=="libs") + argv.push_back("--"+what); + else if(what=="flags") + { + argv.push_back("--cflags"); + argv.push_back("--libs"); + } + else + argv.push_back("--variable="+what); + argv.push_back(pkg); + + if(verbose>=4) + IO::print("Running %s\n", join(argv.begin(), argv.end())); + + int status; + string res=run_command(argv, &status); + if(status) + throw Exception(format("pkg-config for package %s failed", pkg)); + + return res; +} + Package *Builder::get_package(const string &name) { PackageMap::iterator i=packages.find(format("%s/%s", name, current_arch->get_name())); @@ -295,14 +339,19 @@ Package *Builder::get_package(const string &name) return i->second; } - // Package source not found - create a binary package - Package *pkg=BinaryPackage::from_pkgconfig(*this, name); + Package *pkg=0; + try + { + // Package source not found - create a binary package + pkg=BinaryPackage::from_pkgconfig(*this, name); + } + catch(...) + { + problem(name, "not found"); + } packages.insert(PackageMap::value_type(name, pkg)); - if(!pkg) - problem(name, "not found"); - return pkg; } @@ -458,16 +507,15 @@ FS::Path Builder::get_package_location(const string &name) if(verbose>=3) IO::print("Looking for package %s\n", name); - // Try to get source directory with pkgconfig - list argv; - argv.push_back("pkg-config"); - argv.push_back("--variable=source"); - argv.push_back(name); - if(verbose>=4) - IO::print("Running %s\n", join(argv.begin(), argv.end())); - string srcdir=strip(run_command(argv)); - if(!srcdir.empty()) - return srcdir; + try + { + // Try to get source directory with pkgconfig + string srcdir=strip(run_pkgconfig(name, "source")); + if(!srcdir.empty()) + return srcdir; + } + catch(...) + { } if(pkg_dirs.empty()) { @@ -612,7 +660,7 @@ int Builder::create_targets() return 0; } -Target *Builder::get_header(const Msp::FS::Path &fn) +Target *Builder::get_header(const FS::Path &fn) { Target *tgt=get_target(fn.str()); if(tgt) return tgt; @@ -757,7 +805,7 @@ int Builder::do_clean() Target *tgt=queue.front(); queue.erase(queue.begin()); - if(tgt->get_buildable() && (tgt->get_package()==main_pkg || clean>=2)) + if(tgt->is_buildable() && (tgt->get_package()==main_pkg || clean>=2)) clean_tgts.insert(tgt); const TargetList &deps=tgt->get_depends();