guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Add ant-build-system.


From: Ludovic Courtès
Subject: Re: [PATCH] Add ant-build-system.
Date: Thu, 10 Mar 2016 17:17:59 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Ricardo Wurmus <address@hidden> skribis:

> Ricardo Wurmus <address@hidden> writes:
>
>> Ludovic Courtès <address@hidden> 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’.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]