Subject: bug#56253: closed (Re: bug#56253: [PATCH]: gnu: vpnc: Fix cross-compilation.)

From: [email-masked] (GNU bug Tracking System)
Date: Mon, 04 Jul 2022 10:29:02 +0000

Your bug report

#56253: [PATCH]: gnu: vpnc: Fix cross-compilation.

which was filed against the guix-patches package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
56253: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=56253
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#56253: [PATCH]: gnu: vpnc: Fix cross-compilation.
From: Ludovic Courtès <[email-masked]>
To: Jean Pierre De Jesus DIAZ <[email-masked]>
Cc: Maxime Devos <[email-masked]>, "[email-masked]" <[email-masked]>
Date: Mon, 04 Jul 2022 12:28:27 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Hi,

Jean Pierre De Jesus DIAZ <[email-masked]> skribis:

> From 3d3cb006c249a303c59300f8760e7f7b103b1037 Mon Sep 17 00:00:00 2001
> Message-Id: <[email-masked]>
> From: Jean-Pierre De Jesus DIAZ <[email-masked]>
> Date: Wed, 29 Jun 2022 12:51:55 +0200
> Subject: [PATCH 1/2] gnu: vpnc: Fix cross-compilation.
>
> * gnu/packages/vpn.scm (vpnc): Fix cross-compilation.
>   [native-inputs]: Add conditional input of `this-package' (vpnc)
>   to reuse the man page and add `pkg-config'.
>   [arguments]: Use G-Expressions.
>   [arguments]: Make use of `make-flags' instead of using substitutions.
>   [arguments]: Remove unneeded deletion of `configure'.
>   [arguments]: Use `pkg-config' to search for libgcrypt.

[...]

> From d94babd41579d19d9cbbb2cca2285e0f3c8c1e77 Mon Sep 17 00:00:00 2001
> Message-Id: <[email-masked]>
> In-Reply-To: <[email-masked]>
> References: <[email-masked]>
> From: Jean-Pierre De Jesus DIAZ <[email-masked]>
> Date: Wed, 29 Jun 2022 12:57:02 +0200
> Subject: [PATCH 2/2] gnu: vpnc: Add bsd-2 license.
>
> * gnu/packages/vpn.scm (vpnc)[license]: Add bsd-2.

Applied, thanks, and thanks Maxime for reviewing!

Ludo’.

Subject: [PATCH]: gnu: vpnc: Fix cross-compilation.
From: Jean Pierre De Jesus DIAZ <[email-masked]>
To: "[email-masked]" <[email-masked]>
Date: Mon, 27 Jun 2022 10:52:53 +0000
List-Id: <debbugs-submit.debbugs.gnu.org>

Fix cross-compilation for `vpnc'.

The error was because the `Makefile' tried to execute the resulting binary and
failed as a result. This is done to generate the manpage.

The solution I found was to compile twice the binary, one for the host and the
other for the target, this way the manpage is generated and installed first and
the binary for the target is built later. When not cross-compiling this is not
done.

The error can be seen by executing:

guix build vpnc \
           --target=aarch64-linux-gnu

I'm not entirely sure that I've made a correct git message, so feel free to
modify it if doesn't match the standards.

—
Jean-Pierre De Jesus DIAZ

From d9379ceef2a7f6ed7bf49839ed066eca06d2b874 Mon Sep 17 00:00:00 2001
Message-Id: <[email-masked]>
From: Jean-Pierre De Jesus DIAZ <[email-masked]>
Date: Mon, 27 Jun 2022 12:41:35 +0200
Subject: [PATCH] gnu: vpnc: Fix cross-compilation.

* gnu/packages/vpn.scm (vpnc): Fix cross-compilation of package. Use
  G-Exps. Remove substitutions in favour of `#:make-flags`. Fix manpage
  generation error when cross-compiling, as the manpage generation
  depends on the executable being built for the host machine it is built
  twice for the host and the target machine, when not cross-compiling
  the package is built only one time. Add bsd-2 to license section and
  list the files as comments that are bsd-2. Remove duplicate
  installation of license files.
---
 gnu/packages/vpn.scm | 95 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 76 insertions(+), 19 deletions(-)

diff --git a/gnu/packages/vpn.scm b/gnu/packages/vpn.scm
index e33821c97f..01f29996f2 100644
--- a/gnu/packages/vpn.scm
+++ b/gnu/packages/vpn.scm
@@ -21,6 +21,7 @@
 ;;; Copyright © 2022 Josselin Poiret <[email-masked]>
 ;;; Copyright © 2022 Lu hui <[email-masked]>
 ;;; Copyright © 2022 Maxim Cournoyer <[email-masked]>
+;;; Copyright © 2022 Jean-Pierre De Jesus DIAZ <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -477,25 +478,76 @@ (define-public vpnc
             (sha256 (base32
                      "1128860lis89g1s21hqxvap2nq426c9j4bvgghncc1zj0ays7kj6"))))
    (build-system gnu-build-system)
-   (inputs (list libgcrypt perl vpnc-scripts))
+   ;; libgcrypt and vpnc-scripts are duplicated on both inputs because when
+   ;; cross-compiling we build vpnc for the host (to generate the manpage)
+   ;; and the target system.
+   (native-inputs (list libgcrypt perl vpnc-scripts))
+   (inputs (list libgcrypt vpnc-scripts))
    (arguments
-    `(#:tests? #f ; there is no check target
-      #:phases
-      (modify-phases %standard-phases
-        (add-after 'unpack 'use-store-paths
-          (lambda* (#:key inputs outputs #:allow-other-keys)
-            (let ((out          (assoc-ref outputs "out"))
-                  (vpnc-scripts (assoc-ref inputs  "vpnc-scripts")))
-              (substitute* "config.c"
-                (("/etc/vpnc/vpnc-script")
-                 (string-append vpnc-scripts "/etc/vpnc/vpnc-script")))
-              (substitute* "Makefile"
-                (("ETCDIR=.*")
-                 (string-append "ETCDIR=" out "/etc/vpnc\n"))
-                (("PREFIX=.*")
-                 (string-append "PREFIX=" out "\n")))
-              #t)))
-        (delete 'configure))))          ; no configure script
+     (list #:tests? #f ;; There is no check target
+           #:make-flags
+           #~(let ((out (assoc-ref %outputs "out")))
+               (list (string-append "CC=" #$(cc-for-target))
+                     (string-append "ETCDIR=" out "/etc/vpnc")
+                     (string-append "PREFIX=" out)))
+           #:phases
+           #~(modify-phases %standard-phases
+               (delete 'configure) ;; No configure script.
+               (add-after 'unpack 'use-store-paths
+                 (lambda* (#:key inputs outputs #:allow-other-keys)
+                   (let ((vpnc-scripts (assoc-ref inputs  "vpnc-scripts")))
+                     (substitute* "config.c"
+                       (("/etc/vpnc/vpnc-script")
+                        (string-append vpnc-scripts "/etc/vpnc/vpnc-script"))))))
+               (add-before 'build 'build-manpage
+                 (lambda* (#:key outputs parallel-build? target
+                           #:allow-other-keys)
+                   ;; The Makefile tries to generate the manpage by executing
+                   ;; the resulting binary, so, when cross-compiling the vpnc
+                   ;; package must be built first on the host to generate the
+                   ;; manpage. This step is not necessary when the target is
+                   ;; the host.
+                   (when target
+                     (apply invoke "make" "vpnc.8" "CC=gcc"
+                            (if parallel-build?
+                               (list "-j" (number->string (parallel-job-count)))
+                               '()))
+                     (install-file "vpnc.8"
+                                   (string-append (assoc-ref outputs "out")
+                                                  "/share/man/man8"))
+                     (invoke "make" "clean"))))
+               (replace 'build
+                 (lambda* (#:key inputs make-flags parallel-build? target
+                           #:allow-other-keys)
+                   ;; When cross-compiling, the bash script 'libgcrypt-config'
+                   ;; must be accessible during the configure phase.
+                   (when target
+                     (setenv "PATH"
+                             (string-append
+                               (dirname
+                                 (search-input-file inputs
+                                                    "bin/libgcrypt-config"))
+                               ":" (getenv "PATH"))))
+                   (apply invoke "make" "vpnc" "cisco-decrypt" "vpnc-script"
+                          (append make-flags
+                                  ;; Build manpage only if not cross-compiling.
+                                  (if (not target) (list "vpnc.8") '())
+                                  (if parallel-build?
+                                    (list "-j" (number->string (parallel-job-count)))
+                                    '())))))
+               (add-before 'install 'patch-install
+                 (lambda* (#:key target #:allow-other-keys)
+                   ;; When cross-compiling the manpage is already installed by
+                   ;; this point.
+                   (when target
+                     (substitute* "Makefile"
+                       (("all : \\$\\(BINS\\) vpnc\\.8 vpnc-script")
+                        "all : $(BINS) vpnc-script")
+                       (("install -m644 vpnc\\.8.*") "")))
+                   ;; Remove installation of COPYING as 'install-license-files
+                   ;; phase does it with a proper version number.
+                   (substitute* "Makefile"
+                     (("install -m644 COPYING.*") "")))))))
    (synopsis "Client for Cisco VPN concentrators")
    (description
     "vpnc is a VPN client compatible with Cisco's EasyVPN equipment.
@@ -503,7 +555,12 @@ (define-public vpnc
 shared-secret IPSec authentication with Xauth, AES (256, 192, 128), 3DES,
 1DES, MD5, SHA1, DH1/2/5 and IP tunneling.  It runs entirely in userspace.
 Only \"Universal TUN/TAP device driver support\" is needed in the kernel.")
-   (license license:gpl2+) ; some file are bsd-2, see COPYING
+   (license (list license:gpl2+
+                  ;; dh.c
+                  ;; dh.h
+                  ;; math_group.c
+                  ;; math_group.h
+                  license:bsd-2))
    (home-page "https://www.unix-ag.uni-kl.de/~massar/vpnc/")))
 
 (define-public vpnc-scripts
-- 
2.36.1