Ricardo Wurmus <ricardo.wur...@mdc-berlin.de> skribis: > Ricardo Wurmus <ricardo.wur...@mdc-berlin.de> writes: > >> Ludovic Courtès <l...@gnu.org> writes: >> >>>> The build.xml it generates contains a target “touch” which is run before >>>> wrapping up the compiled .class files in a jar archive; this target >>>> ensures that the timestamps of all archived files are reset, so the >>>> produced jars can be (and in case of the above-mentioned packages) >>>> deterministic. >>> >>> Cool. >>> >>> What should we do about packages that do provide a ‘build.xml’? I >>> suppose their jars will most likely include timestamps by default, >>> right? >>> >>> If that is the case, maybe we should instead add an additional phase >>> that would, say, unpack all the installed tarballs, reset timestamps, >>> and repack them? >> >> Yes, I think a generic build phase like that would be better. > > I have addressed the other issues with the build system already, so > here’s just an additional patch that adds a generic “repack” build phase > as discussed. > > I think it’s easier to review it this way, so I didn’t squash the > patches. If these changes are okay I’ll fold them into the (corrected) > patch adding the ant-build-system and push.
Thanks, it’s indeed easier this way. > +(define* (repack #:key outputs > + #:allow-other-keys) > + "Unpack all jar archives, reset the timestamp of all contained files, and > +repack them. This is necessary to ensure that archives are reproducible." I would call it ‘strip-jar-timestamps’ for clarify. (BTW, Debian’s ‘strip-nondeterminism’ tool does this kind of things too; I’m not suggesting that we should use it here, though.) > + (define (repack-archive jar) > + (format #t "repacking ~a\n" jar) > + (let ((dir (mkdtemp! "jar-contents.XXXXXX"))) > + (and (with-directory-excursion dir > + (zero? (system* "jar" "xf" jar))) > + ;; The manifest file contains timestamps > + (for-each delete-file (find-files dir "MANIFEST.MF")) > + (delete-file jar) > + (ftw dir (lambda (file stat flag) > + (utime file 0 0) > + #t)) I’d suggest copying ‘reset-timestamps’ from (gnu build install). Eventually we’ll move it to (guix build utils). > + (format #t "~a\n" (string-join (list "jar" "-Mcf" jar "-C" dir > "."))) > + (zero? (system* "jar" "-Mcf" jar "-C" dir ".")) > + (utime jar 0 0) > + #t))) The return value of ‘zero?’ is ignored. What about making it: (unless (zero? …) (error "'jar' failed")) OK with these changes! Ludo’.