+#include <cstdlib>
#include <msp/fs/dir.h>
#include <msp/fs/stat.h>
#include <msp/fs/utils.h>
PackageManager::PackageManager(Builder &b):
builder(b),
- no_externals(false)
+ no_externals(false),
+ env_set(false)
{
- pkg_path.push_back(builder.get_cwd()/".");
- pkg_path.push_back(builder.get_cwd()/"..");
+ pkg_path.push_back(builder.get_work_directory()/".");
+ pkg_path.push_back(builder.get_work_directory()/"..");
}
PackageManager::~PackageManager()
string PackageManager::run_pkgconfig(const string &pkg, const string &what)
{
+ if(!env_set)
+ {
+ const FS::Path &prefix = builder.get_prefix();
+ 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);
+ }
+ }
+
ExternalTask::Arguments argv;
argv.push_back("pkg-config");
if(what=="cflags" || what=="libs")
builder.get_logger().log("auxcommands", format("Running %s", join(argv.begin(), argv.end())));
- ExternalTask task(argv);
- task.set_stdout(ExternalTask::CAPTURE);
- task.set_stderr(ExternalTask::IGNORE);
- task.start();
- Task::Status status;
- while((status=task.check())==Task::RUNNING)
- Time::sleep(10*Time::msec);
- if(status==Task::ERROR)
- throw runtime_error(format("pkg-config for package %s failed", pkg));
-
- return task.get_output();
+ return ExternalTask::run_and_capture_output(argv);
}
FS::Path PackageManager::get_package_location(const string &name)
{
for(list<FS::Path>::const_iterator i=pkg_path.begin(); i!=pkg_path.end(); ++i)
{
+ builder.get_logger().log("files", format("Traversing %s", *i));
list<string> files = list_files(*i);
for(list<string>::const_iterator j=files.begin(); j!=files.end(); ++j)
{