From: Leo Famulari <leo@famulari.name>
To: Ricardo Wurmus <ricardo.wurmus@mdc-berlin.de>
Cc: guix-devel <guix-devel@gnu.org>
Subject: Re: [PATCH] Improve ant-build-system.
Date: Thu, 24 Mar 2016 11:33:41 -0400 [thread overview]
Message-ID: <20160324153341.GA27637@jasmine> (raw)
In-Reply-To: <idjh9fwq69t.fsf@bimsb-sys02.mdc-berlin.net>
On Thu, Mar 24, 2016 at 03:50:38PM +0100, Ricardo Wurmus wrote:
> Hi Guix,
>
> our ant-build-system currently throws away the jar manifest, because it
> was difficult to control its timestamp. Without a manifest many jars
> cannot be used, though. Oops!
>
> The manifest and the directory it is in always get the current time,
> which is very annoying. Since controlling the timestamp is not possible
> with “jar”, this patch repacks the jar archive with “zip”. The only
> thing we need to take care of is to ensure that the manifest file
> appears first.
So, the timestamp issue is avoided by using "zip"? Just curious, I would
want to block this change regardless.
>
> With these changes the jars actually work properly.
>
> Thanks to Roel for reporting these issues to me privately and assisting
> in debugging all of this!
>
> ~~ Ricardo
>
> From 0839fc0c10f6ace360ff88a48951340b5b25e376 Mon Sep 17 00:00:00 2001
> From: Ricardo Wurmus <ricardo.wurmus@mdc-berlin.de>
> Date: Thu, 24 Mar 2016 15:33:21 +0100
> Subject: [PATCH 1/2] build-system/ant: Add zip.
>
> * guix/build-system/ant.scm (default-zip): New variable.
> (lower): Add zip to native inputs.
> ---
> guix/build-system/ant.scm | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/guix/build-system/ant.scm b/guix/build-system/ant.scm
> index d3054e5..f333aa5 100644
> --- a/guix/build-system/ant.scm
> +++ b/guix/build-system/ant.scm
> @@ -54,15 +54,22 @@
> (let ((jdk-mod (resolve-interface '(gnu packages java))))
> (module-ref jdk-mod 'ant)))
>
> +(define (default-zip)
> + "Return the default ZIP package."
> + ;; Lazily resolve the binding to avoid a circular dependency.
> + (let ((zip-mod (resolve-interface '(gnu packages zip))))
> + (module-ref zip-mod 'zip)))
> +
> (define* (lower name
> #:key source inputs native-inputs outputs system target
> (jdk (default-jdk))
> (ant (default-ant))
> + (zip (default-zip))
> #:allow-other-keys
> #:rest arguments)
> "Return a bag for NAME."
> (define private-keywords
> - '(#:source #:target #:jdk #:ant #:inputs #:native-inputs))
> + '(#:source #:target #:jdk #:ant #:zip #:inputs #:native-inputs))
>
> (and (not target) ;XXX: no cross-compilation
> (bag
> @@ -77,6 +84,7 @@
> ,@(standard-packages)))
> (build-inputs `(("jdk" ,jdk "jdk")
> ("ant" ,ant)
> + ("zip" ,zip)
> ,@native-inputs))
> (outputs outputs)
> (build ant-build)
> --
> 2.1.0
>
> From 7a3ac4d2eb7c7e9f3a96927f6c68c2a182082b6a Mon Sep 17 00:00:00 2001
> From: Ricardo Wurmus <ricardo.wurmus@mdc-berlin.de>
> Date: Thu, 24 Mar 2016 15:39:45 +0100
> Subject: [PATCH 2/2] ant-build-system: Keep jar manifest.
>
> * guix/build/ant-build-system.scm (default-build.xml): Generate default
> manifest.
> (strip-jar-timestamps): Repack jar archive with zip.
> ---
> guix/build/ant-build-system.scm | 29 +++++++++++++++++------------
> 1 file changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/guix/build/ant-build-system.scm b/guix/build/ant-build-system.scm
> index d302b94..27277af 100644
> --- a/guix/build/ant-build-system.scm
> +++ b/guix/build/ant-build-system.scm
> @@ -65,13 +65,8 @@
> (target (@ (name "jar")
> (depends "compile"))
> (mkdir (@ (dir "${jar.dir}")))
> - ;; We cannot use the simpler "jar" task here, because
> - ;; there is no way to disable generation of a
> - ;; manifest. We do not include a generated manifest
> - ;; to ensure determinism, because we cannot easily
> - ;; reset the ctime/mtime before creating the archive.
> (exec (@ (executable "jar"))
> - (arg (@ (line ,(string-append "-Mcf ${jar.dir}/" jar-name
> + (arg (@ (line ,(string-append "-cf ${jar.dir}/" jar-name
> " -C ${classes.dir} ."))))))
>
> (target (@ (name "install"))
> @@ -105,16 +100,15 @@ INPUTS."
> (zero? (apply system* `("ant" ,build-target ,@make-flags))))
>
> (define* (strip-jar-timestamps #:key outputs
> - #:allow-other-keys)
> + #: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."
> (define (repack-archive jar)
> (format #t "repacking ~a\n" jar)
> - (let ((dir (mkdtemp! "jar-contents.XXXXXX")))
> + (let* ((dir (mkdtemp! "jar-contents.XXXXXX"))
> + (manifest (string-append dir "/META-INF/MANIFEST.MF")))
> (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)
> ;; XXX: copied from (gnu build install)
> (for-each (lambda (file)
> @@ -122,8 +116,19 @@ repack them. This is necessary to ensure that archives are reproducible."
> (unless (eq? (stat:type s) 'symlink)
> (utime file 0 0 0 0))))
> (find-files dir #:directories? #t))
> - (unless (zero? (system* "jar" "-Mcf" jar "-C" dir "."))
> - (error "'jar' failed"))
> +
> + ;; The jar tool will always set the timestamp on the manifest file
> + ;; and the containing directory to the current time, even when we
> + ;; reuse an existing manifest file. To avoid this we use "zip"
> + ;; instead of "jar". It is important that the manifest appears
> + ;; first.
> + (with-directory-excursion dir
> + (let* ((files (find-files "." ".*" #:directories? #t))
> + (command (if (file-exists? manifest)
> + `("zip" "-X" ,jar ,manifest ,@files)
> + `("zip" "-X" ,jar ,@files))))
> + (unless (zero? (apply system* command))
> + (error "'zip' failed"))))
> (utime jar 0 0)
> #t)))
>
> --
> 2.1.0
>
next prev parent reply other threads:[~2016-03-24 15:33 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-24 14:50 [PATCH] Improve ant-build-system Ricardo Wurmus
2016-03-24 15:33 ` Leo Famulari [this message]
2016-03-24 15:57 ` Ricardo Wurmus
2016-03-24 16:08 ` Leo Famulari
2016-03-31 15:23 ` Ricardo Wurmus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160324153341.GA27637@jasmine \
--to=leo@famulari.name \
--cc=guix-devel@gnu.org \
--cc=ricardo.wurmus@mdc-berlin.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).