BinaryPackage *BinaryPackage::from_pkgconfig(Builder &builder, const string &name)
{
- list<string> 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;
*/
#include <set>
+#include <cstdlib>
#include <sys/utsname.h>
#include <msp/core/except.h>
#include <msp/core/getopt.h>
int Builder::main()
{
+ if(prefix.str()!="/usr")
+ {
+ FS::Path pcdir=prefix/"lib"/"pkgconfig";
+ if(const char *pcp=getenv("PKG_CONFIG_PATH"))
+ {
+ vector<string> path=split(pcp, ':');
+ bool found=false;
+ for(vector<string>::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)
return 1;
}
- //if(create_makefile
-
if(clean)
exit_code=do_clean();
else if(build)
return exit_code;
}
+string Builder::run_pkgconfig(const string &pkg, const string &what)
+{
+ list<string> 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()));
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;
}
if(verbose>=3)
IO::print("Looking for package %s\n", name);
- // Try to get source directory with pkgconfig
- list<string> 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())
{
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);
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);