From a63fc8c311155582a1efb3bc07f010cf159f299c Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Mon, 11 May 2009 20:43:21 +0000 Subject: [PATCH] Set PKG_CONFIG_PATH to include prefix More intelligent checking for pkg-config errors --- Build | 4 +- source/binarypackage.cpp | 14 +------ source/builder.cpp | 82 +++++++++++++++++++++++++++++++--------- source/builder.h | 2 + source/misc.cpp | 14 ++++++- source/misc.h | 4 +- 6 files changed, 84 insertions(+), 36 deletions(-) diff --git a/Build b/Build index 2754b9e..c2d976f 100644 --- a/Build +++ b/Build @@ -17,10 +17,10 @@ package "builder" install true; }; - tarball "@src" + /*tarball "@src" { source "bootstrap.sh"; source "Readme.txt"; source "License.txt"; - }; + };*/ }; diff --git a/source/binarypackage.cpp b/source/binarypackage.cpp index 4589e24..8cfc874 100644 --- a/source/binarypackage.cpp +++ b/source/binarypackage.cpp @@ -38,19 +38,7 @@ void BinaryPackage::create_build_info() BinaryPackage *BinaryPackage::from_pkgconfig(Builder &builder, const string &name) { - list argv; - argv.push_back("pkg-config"); - argv.push_back("--silence-errors"); - argv.push_back("--cflags"); - argv.push_back("--libs"); - argv.push_back(name); - if(builder.get_verbose()>=4) - IO::print("Running %s\n", join(argv.begin(), argv.end())); - string info=run_command(argv); - - if(info.empty()) - return 0; - + string info=builder.run_pkgconfig(name, "flags"); BinaryPackage *pkg=new BinaryPackage(builder, name); pkg->use_pkgconfig=true; 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()) { diff --git a/source/builder.h b/source/builder.h index 81f5f13..977785c 100644 --- a/source/builder.h +++ b/source/builder.h @@ -117,6 +117,8 @@ public: SourcePackage *get_main_package() const { return main_pkg; } + std::string run_pkgconfig(const std::string &, const std::string &); + /** Looks up a target by name. Returns 0 if no such target exists. */ Target *get_target(const std::string &) const; diff --git a/source/misc.cpp b/source/misc.cpp index cf97c55..2409e05 100644 --- a/source/misc.cpp +++ b/source/misc.cpp @@ -15,7 +15,7 @@ Distributed under the LGPL using namespace std; using namespace Msp; -string run_command(const StringList &argv) +string run_command(const StringList &argv, int *status) { int pfd[2]; pipe(pfd); @@ -53,8 +53,18 @@ string run_command(const StringList &argv) int len=read(pfd[0], buf, sizeof(buf)); if(len<=0) { - if(waitpid(pid, 0, WNOHANG)) + int s; + if(waitpid(pid, &s, WNOHANG)) + { + if(status) + { + if(WIFEXITED(s)) + *status=WEXITSTATUS(s); + else + *status=-1; + } break; + } } else result.append(buf, len); diff --git a/source/misc.h b/source/misc.h index 508a9b0..99e41f0 100644 --- a/source/misc.h +++ b/source/misc.h @@ -25,7 +25,7 @@ typedef std::list PathList; typedef std::map StringMap; /** Runs a command and returns its output as a string. The exit status of the -command is lost. */ -std::string run_command(const StringList &); +command is returned in the second parameter if it is not null. */ +std::string run_command(const StringList &, int * =0); #endif -- 2.43.0