summaryrefslogtreecommitdiff
blob: 0e83aabe44de5ca280df6a34f1b1de5f7658318b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

# Note: please bump this together with mail-mta/sendmail

inherit toolchain-funcs

# This library is part of sendmail, but it does not share the version number with it.
# In order to find the right libmilter version number, check SMFI_VERSION definition
# that can be found in ${S}/include/libmilter/mfapi.h (see also SM_LM_VRS_* defines).
# For example, version 1.0.1 has a SMFI_VERSION of 0x01000001.
#
# See check in src_prepare too.
SENDMAIL_VER=8.17.1.9

DESCRIPTION="The Sendmail Filter API (Milter)"
HOMEPAGE="https://www.sendmail.org/"
if [[ -n $(ver_cut 4 ${SENDMAIL_VER}) ]] ; then
	# Snapshots have an extra version component (e.g. 8.17.1 vs 8.17.1.9)
	SRC_URI+="https://ftp.sendmail.org/snapshots/sendmail.${SENDMAIL_VER}.tar.gz
		ftp://ftp.sendmail.org/pub/sendmail/snapshots/sendmail.${SENDMAIL_VER}.tar.gz"
else
	SRC_URI="https://ftp.sendmail.org/sendmail.${SENDMAIL_VER}.tar.gz
		ftp://ftp.sendmail.org/pub/sendmail/sendmail.${SENDMAIL_VER}.tar.gz"
fi

S="${WORKDIR}/sendmail-${SENDMAIL_VER}"

LICENSE="Sendmail"
# We increment _pN when a new sendmail tarball comes out and change the actual
# "main version" (1.0.2 at time of writing) when the version
# of libmilter included in the tarball changes.
# We used to use $(ver_cut 1-3) here (assuming ABI stability between sendmail
# versions) but that doesn't seem to apply for sendmail snapshots.
SLOT="0/${PV}"
KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~mips ppc ppc64 ~riscv ~s390 sparc x86"
IUSE="ipv6 poll"

RDEPEND="!<mail-mta/sendmail-8.16.1"
BDEPEND="sys-devel/m4"

# build system patch copied from sendmail ebuild
PATCHES=(
	"${FILESDIR}"/sendmail-8.16.1-build-system.patch
	"${FILESDIR}"/${PN}-sharedlib.patch
)

src_prepare() {
	default

	extract_version_from_source() {
		# Extract "#  define SMFI_VERSION  0x01000002" from include/libmilter/mfapi.h
		local actual_libmilter_ver=$(grep -o -E -m 1 "0[xX][0-9a-fA-F]+" include/libmilter/mfapi.h)

		# SM_LM_VRS_MAJOR(v)      (((v) & 0x7f000000) >> 24)
		local actual_libmilter_ver_major=$(((actual_libmilter_ver & 0x7f000000) >> 24))

		# SM_LM_VRS_MINOR(v)      (((v) & 0x007fff00) >> 8)
		local actual_libmilter_ver_minor=$(((actual_libmilter_ver & 0x007fff00) >> 8))

		# SM_LM_VRS_PLVL(v)       ((v) & 0x0000007f)
		local actual_libmilter_ver_plvl=$((actual_libmilter_ver & 0x0000007f))

		einfo "Extracted version (hex): ${actual_libmilter_ver}"
		einfo "Extracted version (major): ${actual_libmilter_ver_major}"
		einfo "Extracted version (minor): ${actual_libmilter_ver_minor}"
		einfo "Extracted version (plvl): ${actual_libmilter_ver_plvl}"
		einfo "Extracted version (final): ${actual_libmilter_ver_major}.${actual_libmilter_ver_minor}.${actual_libmilter_ver_plvl}"

		echo ${actual_libmilter_ver_major}.${actual_libmilter_ver_minor}.${actual_libmilter_ver_plvl}
	}

	local actual_libmilter_ver_final=$(extract_version_from_source)
	if [[ $(ver_cut 1-3) != ${actual_libmilter_ver_final} ]] ; then
		eerror "Ebuild version ${PV} does not match detected version ${actual_libmilter_ver_final}!"
		eerror "Expected version: $(ver_cut 1-3)"
		eerror "Detected version: ${actual_libmilter_ver_final}"
		die "Package version ${PV} appears to be incorrect. Please check the source or rename the ebuild."
	fi

	local ENVDEF="-DNETUNIX -DNETINET -DHAS_GETHOSTBYNAME2=1"

	use ipv6 && ENVDEF+=" -DNETINET6"
	use poll && ENVDEF+=" -DSM_CONF_POLL=1"

	if use elibc_musl; then
		use ipv6 && ENVDEF+=" -DNEEDSGETIPNODE"

		eapply "${FILESDIR}"/${PN}-musl-stack-size.patch
		eapply "${FILESDIR}"/${PN}-musl-disable-cdefs.patch
	fi

	sed -e "s|@@CC@@|$(tc-getCC)|" \
		-e "s|@@CFLAGS@@|${CFLAGS}|" \
		-e "s|@@ENVDEF@@|${ENVDEF}|" \
		-e "s|@@LDFLAGS@@|${LDFLAGS}|" \
		"${FILESDIR}"/gentoo.config.m4 > devtools/Site/site.config.m4 \
		|| die "failed to generate site.config.m4"
}

src_compile() {
	emake -j1 -C libmilter AR="$(tc-getAR)" MILTER_SOVER=${PV}
}

src_install() {
	dodir /usr/$(get_libdir)

	local emakeargs=(
		DESTDIR="${D}" LIBDIR="/usr/$(get_libdir)"
		MANROOT=/usr/share/man/man
		SBINOWN=root SBINGRP=0 UBINOWN=root UBINGRP=0
		LIBOWN=root LIBGRP=0 GBINOWN=root GBINGRP=0
		MANOWN=root MANGRP=0 INCOWN=root INCGRP=0
		MSPQOWN=root CFOWN=root CFGRP=0
		MILTER_SOVER="$(ver_cut 1-3)"
	)
	emake -C obj.*/libmilter "${emakeargs[@]}" install

	dodoc libmilter/README

	docinto html
	dodoc -r libmilter/docs/.

	if [[ ${PV} != $(ver_cut 1-3) ]] ; then
		# Move the .so file to the more specific name so it becomes a chain like
		# .so -> .so.1.0.2 -> .so.1.0.2_p2, otherwise ldconfig can get confused
		# (bug #864563).
		#
		# See comment above ${SLOT} definition above.
		mv "${ED}"/usr/$(get_libdir)/"${PN}.so.$(ver_cut 1-3)" "${ED}"/usr/$(get_libdir)/${PN}.so.${PV}
		dosym ${PN}.so.${PV} /usr/$(get_libdir)/${PN}.so.$(ver_cut 1-3)
	fi

	find "${ED}" -name '*.a' -delete || die
}