Subject: [bug#47435] gnu: mail: Make the sendmail package actually output its binary

From: Rovanion Luckey <[email-masked]>
Date: Fri, 9 Apr 2021 21:30:49 +0200

> On the commit message, the convention is that all titles end with a
> period, also all statements in the subtext also end with a period, and
> that the subtext is wrapped to 80 columns (unless links). Look at other
> commit messages for examples.
>

Should be fixed in the attached patch.

> It seems in your latest patches applied on top of master, the
> 'sendmail' package does not build.
>

This too.

> I noticed it builds as a static library:
>
> /gnu/store/vdg98ynngj637sdn1xazgafb8af8fv2j-libmilter-
> 1.0.1/lib/libmilter.so.: ELF 64-bit LSB shared object, x86-64, version
> 1 (SYSV), statically linked, not stripped
>
> Is there any build flag to disable that? If so, I think we probably
> should, for security updates of it's dependencies, but it doesnt look
> like it has any, not even the glibc? Maybe it's not so important here.
>

I thought the patch I pulled in from Debian made it into a shared library.
It brought it from a .a that pymilter would not build against to a .so that
it would build against. This is the first time I build C libraries for
distribution so I have no idea what I'm doing.

I seem to have misplaced my package definition for pymilter when I rebased
on master so I have to confirm again that this libmilter is actually
usable. There was something about the pymilter tests not running IIRC.

> I also noticed that there was a weird naming for the actual so file, it
> ends with a dot '.':
>

I think something somewhere in the build system wants to add a number after
that dot, but that there was no number available so it just added an empty
string after the dot.

$ tree $(./pre-inst-env guix build libmilter)
> /gnu/store/vdg98ynngj637sdn1xazgafb8af8fv2j-libmilter-1.0.1
> ├── include
> │   └── libmilter
> │       ├── mfapi.h
> │       └── mfdef.h
> ├── lib
> │   ├── libmilter.a
> │   ├── libmilter.so -> libmilter.so. <<-- here
> │   └── libmilter.so. <<-- also here
> └── share
>     └── doc
>         └── libmilter-1.0.1
>             └── LICENSE
>
> 6 directories, 6 files
>
> Again it will work anyways I believe, not crucial.
>
> > +(define-public libmilter
> > +  (package
> > +    (inherit sendmail)
> > +    (name "libmilter")
> > +    (version "1.0.1")
>
> Where does this version come from?

I think I just took it from Debian for some reason:
https://packages.debian.org/experimental/libmilter1.0.1

> Are you sure about that?

Hard no on that.

> Also do
> note that changing the version field here in libmilter does not change
> the version used in the origin of the inherited package So it's using
> the same sources as sendmail exactly, that's what you want?
>

Yeah, that is what I intended. I intended to only change the metadata
attached to the libmilter package in the Guix package repository.

> > +    (arguments
> > +     (substitute-keyword-arguments (package-arguments sendmail)
> > +       ((#:phases phases)
> > +        `(modify-phases ,phases
> > +           (replace 'build
> > +             (lambda* _
> > +               (with-directory-excursion "libmilter"
> > +                 (invoke "sh" "Build"))
> > +               #t))
> > +           (delete 'pre-install)
> > +           (replace 'install
> > +             (lambda* _
> > +               (with-directory-excursion "libmilter"
> > +                 (mkdir-p (string-append (assoc-ref %outputs "out")
> > "/lib"))
> > +                 (invoke "make" "install"))
> > +               #t))))))
> > +    (synopsis "Sendmail library for creating mail filters.")))
> > +
>
> I suggest adding a dedicated synopsis and description here, also
> synopsises as I see it should not be sentences and not end with a
> period, descriptions on the other hand should be full sentences, look
> at the other packages for inspiration.

Added a description and removed the period from the synopsis.

I will keep the website as sendmail.org despite the redirect, the patch
will not start with the filename for libmilter. I do not know what to do
about there being no "updater" for sendmail, but then again the last
release was in 2016.
From 87d1ede0d39dd952f625de63f39df025a4dddbe8 Mon Sep 17 00:00:00 2001
From: Rovanion Luckey <[email-masked]>
Date: Mon, 29 Mar 2021 16:04:41 +0200
Subject: [PATCH 3/3] gnu: sendmail: Update to 8.16.1.

* gnu/packages/mail.scm (sendmail): Update to 8.16.1.
---
 gnu/packages/mail.scm | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index 0a6e710611..5844c94c90 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -2768,7 +2768,7 @@ powerful user customization features.")
 (define-public sendmail
   (package
     (name "sendmail")
-    (version "8.15.2")
+    (version "8.16.1")
     (source
      (origin
        (method url-fetch)
@@ -2777,7 +2777,7 @@ powerful user customization features.")
              version ".tar.gz"))
        (sha256
         (base32
-         "0fdl9ndmspqspdlmghzxlaqk56j3yajk52d7jxcg21b7sxglpy94"))
+         "1fk49v63w4lrpw4jjzl495vpi02w633vkd9jbwbqcss39gfdb1kq"))
        (patches (search-patches "sendmail-libmilter-shared-library.patch"))))
     (build-system gnu-build-system)
     (arguments
-- 
2.30.0

From 812b45c66d04648444a9df3944de8e1e94d32180 Mon Sep 17 00:00:00 2001
From: Rovanion Luckey <[email-masked]>
Date: Mon, 29 Mar 2021 15:56:25 +0200
Subject: [PATCH 2/3] gnu: Add libmilter.

* gnu/packages/mail.scm (libmilter): New variable. A Sendmail API library for
  building mail filters.
---
 gnu/packages/mail.scm | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index 8cb548044e..0a6e710611 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -2869,6 +2869,32 @@ transfer protocols.")
     (license (license:non-copyleft "file://LICENSE"
                                    "See LICENSE in the distribution."))))
 
+(define-public libmilter
+  (package
+    (inherit sendmail)
+    (name "libmilter")
+    (version "1.0.1")
+    (arguments
+     (substitute-keyword-arguments (package-arguments sendmail)
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (replace 'build
+             (lambda* _
+               (with-directory-excursion "libmilter"
+                 (invoke "sh" "Build"))
+               #t))
+           (delete 'pre-install)
+           (replace 'install
+             (lambda* _
+               (with-directory-excursion "libmilter"
+                 (mkdir-p (string-append (assoc-ref %outputs "out") "/lib"))
+                 (invoke "make" "install"))
+               #t))))))
+    (synopsis "Sendmail library for creating mail filters")
+    (description "The Sendmail Mail Filter API (Milter) is designed to allow
+third-party programs access to mail messages as they are being processed in
+order to filter meta-information(headers) and content.")))
+
 (define-public sieve-connect
   (package
     (name "sieve-connect")
-- 
2.30.0

From 0da70d62ffd2e4c4eef3ba0c069a217f78ed97fe Mon Sep 17 00:00:00 2001
From: Rovanion Luckey <[email-masked]>
Date: Sat, 27 Mar 2021 18:28:02 +0100
Subject: [PATCH 1/3] gnu: sendmail: Fix output's directory structure.

* gnu/packages/mail.scm (sendmail)[arguments]<#:phases>: Properly specify
  output directories in replacement 'configure and 'pre-> install.
---
 gnu/packages/mail.scm                         | 42 ++++++++++----
 .../sendmail-libmilter-shared-library.patch   | 56 +++++++++++++++++++
 2 files changed, 88 insertions(+), 10 deletions(-)
 create mode 100644 gnu/packages/patches/sendmail-libmilter-shared-library.patch

diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index 56fae3fcba..8cb548044e 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -2777,7 +2777,8 @@ powerful user customization features.")
              version ".tar.gz"))
        (sha256
         (base32
-         "0fdl9ndmspqspdlmghzxlaqk56j3yajk52d7jxcg21b7sxglpy94"))))
+         "0fdl9ndmspqspdlmghzxlaqk56j3yajk52d7jxcg21b7sxglpy94"))
+       (patches (search-patches "sendmail-libmilter-shared-library.patch"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
@@ -2796,23 +2797,44 @@ powerful user customization features.")
                (("SHELL=/bin/sh") (string-append "SHELL=" (which "sh"))))
              #t))
          (replace 'configure
-           (lambda _
+           (lambda* (#:key outputs #:allow-other-keys)
 
              ;; Render harmless any attempts to chown or chgrp
              (substitute* "devtools/bin/install.sh"
                (("owner=\\$2") "owner=''")
                (("group=\\$2") "group=''"))
 
-             (with-output-to-file "devtools/Site/site.config.m4"
-               (lambda ()
-                 (format #t "
+             (let ((out (assoc-ref outputs "out")))
+               (with-output-to-file "devtools/Site/site.config.m4"
+                 (lambda ()
+                   ;; See 'devtools/M4/UNIX/defines.m4' for the list of
+                   ;; installation directories.
+                   (format #t "
 define(`confCC', `gcc')
+define(`confAR', `ar')
+define(`confCCOPTS', `-fPIC')
 define(`confOPTIMIZE', `-g -O2')
 define(`confLIBS', `-lresolv')
 define(`confINSTALL', `~a/devtools/bin/install.sh')
 define(`confDEPEND_TYPE', `CC-M')
 define(`confINST_DEP', `')
-" (getcwd))))
+
+define(`confLIBDIR',     `~a/lib/')
+define(`confINCLUDEDIR', `~a/include')
+define(`confHFDIR',      `~a/etc/mail')
+define(`confSTDIR',      `~a/etc/mail')
+define(`confMBINDIR',    `~a/sbin')
+define(`confUBINDIR',    `~a/bin')
+define(`confSBINDIR',    `~a/sbin')
+define(`confEBINDIR',    `~a/libexec')
+define(`confMANROOT',    `~a/share/man')~%"
+                           (getcwd)
+                           out out out out out out out out out))))
+             (substitute* "cf/cf/Makefile"
+               (("^MAILDIR=.*")
+                (string-append "MAILDIR = "
+                               (assoc-ref outputs "out")
+                               "/etc/mail\n")))
              #t))
          (replace 'build
            (lambda _
@@ -2824,17 +2846,17 @@ define(`confINST_DEP', `')
          (add-before 'install 'pre-install
            (lambda _
              (let ((out (assoc-ref %outputs "out")))
-               (mkdir-p (string-append out "/usr/bin"))
-               (mkdir-p (string-append out "/usr/sbin"))
+               (mkdir-p (string-append out "/bin"))
+               (mkdir-p (string-append out "/sbin"))
                (mkdir-p (string-append out "/etc/mail"))
-               (setenv "DESTDIR" out)
+               (mkdir-p (string-append out "/var/spool/mail"))
                (with-directory-excursion "cf/cf"
                  (invoke "sh" "Build" "install-cf"))
                #t))))
        ;; There is no make check.  There are some post installation tests, but those
        ;; require root privileges
        #:tests? #f))
-    (inputs
+    (native-inputs
      `(("m4" ,m4)
        ("perl" ,perl)))
     (home-page "http://sendmail.org")
diff --git a/gnu/packages/patches/sendmail-libmilter-shared-library.patch b/gnu/packages/patches/sendmail-libmilter-shared-library.patch
new file mode 100644
index 0000000000..1e256c59ec
--- /dev/null
+++ b/gnu/packages/patches/sendmail-libmilter-shared-library.patch
@@ -0,0 +1,56 @@
+diff -Nru sendmail-8.14.3.orig/devtools/M4/UNIX/milterlibrary.m4 sendmail-8.14.3/devtools/M4/UNIX/milterlibrary.m4
+--- sendmail-8.14.3.orig/devtools/M4/UNIX/milterlibrary.m4	1970-01-01 01:00:00.000000000 +0100
++++ sendmail-8.14.3/devtools/M4/UNIX/milterlibrary.m4	2009-08-22 21:51:10.000000000 +0200
+@@ -0,0 +1,39 @@
++divert(-1)
++#
++# Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
++#	All rights reserved.
++#
++# By using this file, you agree to the terms and conditions set
++# forth in the LICENSE file which can be found at the top level of
++# the sendmail distribution.
++#
++#
++#  Definitions for Makefile construction for sendmail
++#
++divert(0)dnl
++include(confBUILDTOOLSDIR`/M4/'bldM4_TYPE_DIR`/links.m4')dnl
++define(`confSOEXT', ifdef(`confSOEXT', `confSOEXT', `so'))dnl
++bldLIST_PUSH_ITEM(`bldC_PRODUCTS', bldCURRENT_PRODUCT)dnl
++bldPUSH_TARGET(bldCURRENT_PRODUCT`.'confSOEXT bldCURRENT_PRODUCT`.a')dnl
++bldPUSH_INSTALL_TARGET(`install-'bldCURRENT_PRODUCT)dnl
++bldPUSH_CLEAN_TARGET(bldCURRENT_PRODUCT`-clean')dnl
++
++include(confBUILDTOOLSDIR`/M4/'bldM4_TYPE_DIR`/defines.m4')
++divert(bldTARGETS_SECTION)
++bldCURRENT_PRODUCT`.'confSOEXT: ${BEFORE} ${bldCURRENT_PRODUCT`OBJS'}
++	${CCLINK} ${LDOPTS_SO} -o bldCURRENT_PRODUCT.confSOEXT ifdef(`confSONAME',`-Wl,confSONAME,bldCURRENT_PRODUCT.confSOEXT.${MILTER_SOVER}') ${bldCURRENT_PRODUCT`OBJS'} -lc ${LIBS}
++bldCURRENT_PRODUCT.a: ${BEFORE} ${bldCURRENT_PRODUCT`OBJS'}
++	${AR} ${AROPTS} bldCURRENT_PRODUCT.a ${bldCURRENT_PRODUCT`OBJS'}
++	${RANLIB} ${RANLIBOPTS} bldCURRENT_PRODUCT.a
++ifdef(`bldLINK_SOURCES', `bldMAKE_SOURCE_LINKS(bldLINK_SOURCES)')
++
++install-`'bldCURRENT_PRODUCT: bldCURRENT_PRODUCT.confSOEXT bldCURRENT_PRODUCT.a
++ifdef(`bldINSTALLABLE', `	ifdef(`confMKDIR', `if [ ! -d "${DESTDIR}${bldINSTALL_DIR`'LIBDIR}" ]; then confMKDIR -p "${DESTDIR}${bldINSTALL_DIR`'LIBDIR}"; else :; fi ')
++	${INSTALL} -c bldCURRENT_PRODUCT.confSOEXT "${DESTDIR}${LIBDIR}/bldCURRENT_PRODUCT.confSOEXT.${MILTER_SOVER}"
++	${LN} ${LNOPTS} bldCURRENT_PRODUCT.confSOEXT.${MILTER_SOVER} "${DESTDIR}${LIBDIR}/bldCURRENT_PRODUCT.confSOEXT"
++	${INSTALL} -c -m 644 bldCURRENT_PRODUCT.a "${DESTDIR}${LIBDIR}"')
++
++bldCURRENT_PRODUCT-clean:
++	rm -f ${OBJS} bldCURRENT_PRODUCT.confSOEXT bldCURRENT_PRODUCT.a ${MANPAGES}
++
++divert(0)
++COPTS+= confCCOPTS_SO
+diff -Nru sendmail-8.14.3.orig/libmilter/Makefile.m4 sendmail-8.14.3/libmilter/Makefile.m4
+--- sendmail-8.14.3.orig/libmilter/Makefile.m4	2008-04-08 07:23:44.000000000 +0200
++++ sendmail-8.14.3/libmilter/Makefile.m4	2009-08-22 21:53:35.000000000 +0200
+@@ -9,7 +9,7 @@
+ SMSRCDIR=ifdef(`confSMSRCDIR', `confSMSRCDIR', `${SRCDIR}/sendmail')
+ PREPENDDEF(`confINCDIRS', `-I${SMSRCDIR} ')
+ 
+-bldPRODUCT_START(`library', `libmilter')
++bldPRODUCT_START(`milterlibrary', `libmilter')
+ define(`bldINSTALLABLE', `true')
+ define(`LIBMILTER_EXTRAS', `errstring.c strl.c')
+ APPENDDEF(`confENVDEF', `-DNOT_SENDMAIL -Dsm_snprintf=snprintf')
-- 
2.30.0