diff --git a/configure.ac b/configure.ac index 0a0d491a0e..a1dc0f72fc 100644 --- a/configure.ac +++ b/configure.ac @@ -11,4 +11,4 @@ AC_PROG_CC AC_PROG_CXX AC_CONFIG_FILES([Makefile src/Makefile]) -AC_OUTPUT \ No newline at end of file +AC_OUTPUT diff --git a/src/nix-populate b/scripts/nix-populate similarity index 100% rename from src/nix-populate rename to scripts/nix-populate diff --git a/src/fix.cc b/src/fix.cc index bf335bc365..8d5cc6bf8e 100644 --- a/src/fix.cc +++ b/src/fix.cc @@ -2,6 +2,7 @@ #include #include +#include #include extern "C" { @@ -15,9 +16,17 @@ static string nixDescriptorDir; static string nixSourcesDir; +/* Mapping of Fix file names to the hashes of the resulting Nix + descriptors. */ typedef map DescriptorMap; +/* Forward declarations. */ + +string instantiateDescriptor(string filename, + DescriptorMap & done); + + void registerFile(string filename) { int res = system(("nix regfile " + filename).c_str()); @@ -52,12 +61,15 @@ string fetchURL(string url) { string filename = baseNameOf(url); string fullname = nixSourcesDir + "/" + filename; - /* !!! quoting */ - string shellCmd = - "cd " + nixSourcesDir + " && wget --quiet -N \"" + url + "\""; - int res = system(shellCmd.c_str()); - if (WEXITSTATUS(res) != 0) - throw Error("cannot fetch " + url); + struct stat st; + if (stat(fullname.c_str(), &st)) { + /* !!! quoting */ + string shellCmd = + "cd " + nixSourcesDir + " && wget --quiet -N \"" + url + "\""; + int res = system(shellCmd.c_str()); + if (WEXITSTATUS(res) != 0) + throw Error("cannot fetch " + url); + } return fullname; } @@ -101,17 +113,21 @@ string evaluateFile(ATerm e, string dir) throw Error("cannot copy " + filename); registerFile(nixSourcesDir + "/" + baseNameOf(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; + ATerm t; if (ATmatch(e, "", &s)) { checkHash(s); return s; - } else throw Error("invalid hash expression"); + } else if (ATmatch(e, "Fix()", &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()", &t)) return ATmake("File()", evaluateFile(t, dir).c_str()); else if (ATmatch(e, "Pkg()", &t)) - return ATmake("Pkg()", evaluatePkg(t, done).c_str()); + return ATmake("Pkg()", evaluatePkg(t, dir, done).c_str()); else throw Error("invalid expression type"); } @@ -215,8 +231,8 @@ string instantiateDescriptor(string filename, /* Register it with Nix. */ registerFile(outFilename); - done[filename] = outFilename; - return outFilename; + done[filename] = outHash; + return outHash; } diff --git a/test/fixdescriptors/aterm-2.0.fix b/test/fixdescriptors/aterm-2.0.fix index 0362314d6c..17e90ca8ba 100644 --- a/test/fixdescriptors/aterm-2.0.fix +++ b/test/fixdescriptors/aterm-2.0.fix @@ -7,4 +7,4 @@ Descr( , Bind("src", File(Url("http://www.cwi.nl/projects/MetaEnv/aterm/aterm-2.0.tar.gz"))) , Bind("build", File(Local("../build/aterm-build.sh"))) ] -) \ No newline at end of file +) diff --git a/test/fixdescriptors/glib-2.2.1.fix b/test/fixdescriptors/glib-2.2.1.fix new file mode 100644 index 0000000000..2585c7ffb5 --- /dev/null +++ b/test/fixdescriptors/glib-2.2.1.fix @@ -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"))) + ] +) diff --git a/test/fixdescriptors/pkgconfig-0.15.0.fix b/test/fixdescriptors/pkgconfig-0.15.0.fix new file mode 100644 index 0000000000..27f32aba64 --- /dev/null +++ b/test/fixdescriptors/pkgconfig-0.15.0.fix @@ -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"))) + ] +)