forked from lix-project/lix
* Descriptor importing in Fix.
This commit is contained in:
parent
cc6eafb3d0
commit
f56b7312b2
28
src/fix.cc
28
src/fix.cc
|
@ -2,6 +2,7 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -15,9 +16,17 @@ static string nixDescriptorDir;
|
||||||
static string nixSourcesDir;
|
static string nixSourcesDir;
|
||||||
|
|
||||||
|
|
||||||
|
/* Mapping of Fix file names to the hashes of the resulting Nix
|
||||||
|
descriptors. */
|
||||||
typedef map<string, string> DescriptorMap;
|
typedef map<string, string> DescriptorMap;
|
||||||
|
|
||||||
|
|
||||||
|
/* Forward declarations. */
|
||||||
|
|
||||||
|
string instantiateDescriptor(string filename,
|
||||||
|
DescriptorMap & done);
|
||||||
|
|
||||||
|
|
||||||
void registerFile(string filename)
|
void registerFile(string filename)
|
||||||
{
|
{
|
||||||
int res = system(("nix regfile " + filename).c_str());
|
int res = system(("nix regfile " + filename).c_str());
|
||||||
|
@ -52,12 +61,15 @@ string fetchURL(string url)
|
||||||
{
|
{
|
||||||
string filename = baseNameOf(url);
|
string filename = baseNameOf(url);
|
||||||
string fullname = nixSourcesDir + "/" + filename;
|
string fullname = nixSourcesDir + "/" + filename;
|
||||||
|
struct stat st;
|
||||||
|
if (stat(fullname.c_str(), &st)) {
|
||||||
/* !!! quoting */
|
/* !!! quoting */
|
||||||
string shellCmd =
|
string shellCmd =
|
||||||
"cd " + nixSourcesDir + " && wget --quiet -N \"" + url + "\"";
|
"cd " + nixSourcesDir + " && wget --quiet -N \"" + url + "\"";
|
||||||
int res = system(shellCmd.c_str());
|
int res = system(shellCmd.c_str());
|
||||||
if (WEXITSTATUS(res) != 0)
|
if (WEXITSTATUS(res) != 0)
|
||||||
throw Error("cannot fetch " + url);
|
throw Error("cannot fetch " + url);
|
||||||
|
}
|
||||||
return fullname;
|
return fullname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,17 +113,21 @@ string evaluateFile(ATerm e, string dir)
|
||||||
throw Error("cannot copy " + filename);
|
throw Error("cannot copy " + filename);
|
||||||
registerFile(nixSourcesDir + "/" + baseNameOf(filename));
|
registerFile(nixSourcesDir + "/" + baseNameOf(filename));
|
||||||
return hashFile(filename);
|
return hashFile(filename);
|
||||||
} else throw Error("invalid hash expression");
|
} else throw Error("invalid file expression");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
string evaluatePkg(ATerm e, DescriptorMap & done)
|
string evaluatePkg(ATerm e, string dir, DescriptorMap & done)
|
||||||
{
|
{
|
||||||
char * s;
|
char * s;
|
||||||
|
ATerm t;
|
||||||
if (ATmatch(e, "<str>", &s)) {
|
if (ATmatch(e, "<str>", &s)) {
|
||||||
checkHash(s);
|
checkHash(s);
|
||||||
return s;
|
return s;
|
||||||
} else throw Error("invalid hash expression");
|
} else if (ATmatch(e, "Fix(<term>)", &t)) {
|
||||||
|
string filename = absPath(evaluateStr(t), dir); /* !!! */
|
||||||
|
return instantiateDescriptor(filename, done);
|
||||||
|
} else throw Error("invalid pkg expression");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -125,7 +141,7 @@ ATerm evaluate(ATerm e, string dir, DescriptorMap & done)
|
||||||
else if (ATmatch(e, "File(<term>)", &t))
|
else if (ATmatch(e, "File(<term>)", &t))
|
||||||
return ATmake("File(<str>)", evaluateFile(t, dir).c_str());
|
return ATmake("File(<str>)", evaluateFile(t, dir).c_str());
|
||||||
else if (ATmatch(e, "Pkg(<term>)", &t))
|
else if (ATmatch(e, "Pkg(<term>)", &t))
|
||||||
return ATmake("Pkg(<str>)", evaluatePkg(t, done).c_str());
|
return ATmake("Pkg(<str>)", evaluatePkg(t, dir, done).c_str());
|
||||||
else throw Error("invalid expression type");
|
else throw Error("invalid expression type");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,8 +231,8 @@ string instantiateDescriptor(string filename,
|
||||||
/* Register it with Nix. */
|
/* Register it with Nix. */
|
||||||
registerFile(outFilename);
|
registerFile(outFilename);
|
||||||
|
|
||||||
done[filename] = outFilename;
|
done[filename] = outHash;
|
||||||
return outFilename;
|
return outHash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
10
test/fixdescriptors/glib-2.2.1.fix
Normal file
10
test/fixdescriptors/glib-2.2.1.fix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
Descr(
|
||||||
|
[ Bind("pkgId", Str("glib-2.2.1"))
|
||||||
|
, Bind("releaseId", Str("1"))
|
||||||
|
|
||||||
|
, Bind("pkgconfig", Pkg(Fix("./pkgconfig-0.15.0.fix")))
|
||||||
|
|
||||||
|
, Bind("src", File(Url("ftp://ftp.gtk.org/pub/gtk/v2.2/glib-2.2.1.tar.bz2")))
|
||||||
|
, Bind("build", File(Local("../build/glib-build.sh")))
|
||||||
|
]
|
||||||
|
)
|
8
test/fixdescriptors/pkgconfig-0.15.0.fix
Normal file
8
test/fixdescriptors/pkgconfig-0.15.0.fix
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
Descr(
|
||||||
|
[ Bind("pkgId", Str("pkgconfig-0.15.0"))
|
||||||
|
, Bind("releaseId", Str("1"))
|
||||||
|
|
||||||
|
, Bind("src", File(Url("http://www.freedesktop.org/software/pkgconfig/releases/pkgconfig-0.15.0.tar.gz")))
|
||||||
|
, Bind("build", File(Local("../build/pkgconfig-build.sh")))
|
||||||
|
]
|
||||||
|
)
|
Loading…
Reference in a new issue