X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=9db904a8d805af19a323f6d68ffe319b7343d819;hb=a63fc8c311155582a1efb3bc07f010cf159f299c;hp=b06b8ffb2fd0b1de4c7b288989cd8704ce295919;hpb=2edc25f87590bd81808792c3c38cab5ae8b94eb3;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index b06b8ff..9db904a 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()) {