summaryrefslogtreecommitdiff
blob: 0eed136d3d5e81ef4a28d7f14fb6e5b0fcfe5020 (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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# Copyright 1999-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=7

inherit autotools bash-completion-r1 eutils linux-info systemd

DESCRIPTION="Fast, dense and secure container management"
HOMEPAGE="https://linuxcontainers.org/lxd/introduction/ https://github.com/lxc/lxd"
SRC_URI="https://linuxcontainers.org/downloads/${PN}/${P}.tar.gz"

# Needs to include licenses for all bundled programs and libraries.
LICENSE="Apache-2.0 BSD BSD-2 LGPL-3 MIT MPL-2.0"
SLOT="0"
KEYWORDS="amd64"
IUSE="apparmor +ipv6 nls"

DEPEND="app-arch/xz-utils
	>=app-emulation/lxc-3.0.0[apparmor?,seccomp]
	dev-lang/tcl
	dev-libs/libuv
	dev-libs/lzo
	net-dns/dnsmasq[dhcp,ipv6?]"
RDEPEND="${DEPEND}
	acct-group/lxd
	net-firewall/ebtables
	net-firewall/iptables[ipv6?]
	sys-apps/iproute2[ipv6?]
	sys-fs/fuse:0=
	sys-fs/lxcfs
	sys-fs/squashfs-tools
	virtual/acl"
BDEPEND="dev-lang/go
	nls? ( sys-devel/gettext )"

CONFIG_CHECK="
	~BRIDGE
	~DUMMY
	~IP6_NF_NAT
	~IP6_NF_TARGET_MASQUERADE
	~IPV6
	~IP_NF_NAT
	~IP_NF_TARGET_MASQUERADE
	~MACVLAN
	~NETFILTER_XT_MATCH_COMMENT
	~NET_IPGRE
	~NET_IPGRE_DEMUX
	~NET_IPIP
	~NF_NAT_MASQUERADE
	~VSOCKETS
	~VXLAN
"

# Uses internet connection.
RESTRICT="test"

# Go magic.
QA_PREBUILT="/usr/lib/lxd/libdqlite.so.0.0.1
	/usr/bin/fuidshift
	/usr/bin/lxc
	/usr/bin/lxc-to-lxd
	/usr/bin/lxd-agent
	/usr/bin/lxd-benchmark
	/usr/bin/lxd-p2c
	/usr/sbin/lxd"

EGO_PN="github.com/lxc/lxd"
GOPATH="${S}/_dist" # this seems to reset every now and then, though

common_op() {
	local i
	for i in dqlite raft; do
		cd "${GOPATH}"/deps/${i} || die "failed to switch dir to ${i}"
		"${@}"
		cd "${S}" || die "failed to switch dir back from ${i} to ${S}"
	done
}

src_prepare() {
	default

	export GOPATH="${S}/_dist"

	sed -i \
		-e "s:\./configure:./configure --prefix=/usr --libdir=${EPREFIX}/usr/lib/lxd:g" \
		-e "s:make:make ${MAKEOPTS}:g" \
		Makefile || die

	sed -i 's#lib$#lib/lxd#' "${GOPATH}"/deps/libco/Makefile || die
	sed -i 's#zfs version 2>/dev/null | cut -f 2 -d - | head -1#< /sys/module/zfs/version cut -f 1#' "${GOPATH}"/deps/raft/configure.ac || die

	common_op eautoreconf
}

src_configure() {
	export GOPATH="${S}/_dist"

	export CO_CFLAGS="-I${GOPATH}/deps/libco/"
	export CO_LIBS="${GOPATH}/deps/libco/"

	export RAFT_CFLAGS="-I${GOPATH}/deps/raft/include/"
	export RAFT_LIBS="${GOPATH}/deps/raft/.libs"

	export SQLITE_CFLAGS="-I${GOPATH}/deps/sqlite"
	export SQLITE_LIBS="${GOPATH}/deps/sqlite/.libs"

	export PKG_CONFIG_PATH="${GOPATH}/sqlite/:${GOPATH}/libco/:${GOPATH}/raft/"

	cd "${GOPATH}/deps/sqlite" || die
	econf --enable-replication --disable-amalgamation --disable-tcl --libdir="${EPREFIX}/usr/lib/lxd"

	common_op econf --libdir="${EPREFIX}"/usr/lib/lxd
}

src_compile() {
	export GOPATH="${S}/_dist"

	export CGO_CFLAGS="${CGO_CFLAGS} -I${GOPATH}/deps/sqlite/ -I${GOPATH}/deps/dqlite/include/ -I${GOPATH}/deps/raft/include/ -I${GOPATH}/deps/libco/"
	export CGO_LDFLAGS="${CGO_LDFLAGS} -L${GOPATH}/deps/sqlite/.libs/ -L${GOPATH}/deps/dqlite/.libs/ -L${GOPATH}/deps/raft/.libs -L${GOPATH}/deps/libco/ -Wl,-rpath,${EPREFIX}/usr/lib/lxd"
	export LD_LIBRARY_PATH="${GOPATH}/deps/sqlite/.libs/:${GOPATH}/deps/dqlite/.libs/:${GOPATH}/deps/raft/.libs:${GOPATH}/deps/libco/:${LD_LIBRARY_PATH}"

	local j
	for j in sqlite raft libco; do
		cd "${GOPATH}"/deps/${j} || die
		emake
	done

	ln -s libco.so.0.1.0 libco.so || die

	cd "${GOPATH}/deps/dqlite" || die
	emake CFLAGS="-I${GOPATH}/deps/sqlite -I${GOPATH}/deps/raft/include" LDFLAGS="-L${GOPATH}/deps/sqlite -L${GOPATH}/deps/raft"

	cd "${S}" || die

	for k in fuidshift lxd-agent lxd-benchmark lxd-p2c lxc lxc-to-lxd; do
		go install -v -x ${EGO_PN}/${k} || die "failed compiling ${k}"
	done

	go install -v -x -tags libsqlite3 ${EGO_PN}/lxd || die "Failed to build the daemon"

	use nls && emake build-mo
}

src_test() {
	export GOPATH="${S}/_dist"

	# This is mostly a copy/paste from the Makefile's "check" rule, but
	# patching the Makefile to work in a non "fully-qualified" go namespace
	# was more complicated than this modest copy/paste.
	# Also: sorry, for now a network connection is needed to run tests.
	# Will properly bundle test dependencies later.
	go get -v -x github.com/rogpeppe/godeps || die
	go get -v -x github.com/remyoudompheng/go-misc/deadcode || die
	go get -v -x github.com/golang/lint/golint || die
	go test -v ${EGO_PN}/lxd || die
}

src_install() {
	local bindir="_dist/bin"
	export GOPATH="${S}/_dist"

	dosbin ${bindir}/lxd

	for l in fuidshift lxd-agent lxd-benchmark lxd-p2c lxc lxc-to-lxd; do
		dobin ${bindir}/${l}
	done

	for m in dqlite libco raft sqlite; do
		cd "${GOPATH}"/deps/${m} || die "failed switching into ${GOPATH}/${m}"
		emake DESTDIR="${D}" install
	done

	cd "${S}" || die

	# We only need libraries, and we don't want anything to link against these.
	rm "${ED}"/usr/bin/sqlite3 || die
	rm -r "${ED}"/usr/include || die
	rm -r "${ED}"/usr/lib/lxd/*.a || die
	rm -r "${ED}"/usr/lib/lxd/pkgconfig || die

	newbashcomp scripts/bash/lxd-client lxc

	newconfd "${FILESDIR}"/lxd-4.0.0.confd lxd
	newinitd "${FILESDIR}"/lxd-4.0.0.initd lxd

	if use apparmor; then
		systemd_newunit "${FILESDIR}"/lxd-4.0.0_apparmor.service lxd.service
	else
		systemd_newunit "${FILESDIR}"/lxd-4.0.0.service lxd.service
	fi

	systemd_newunit "${FILESDIR}"/lxd-containers-4.0.0.service lxd-containers.service
	systemd_newunit "${FILESDIR}"/lxd-4.0.0.socket lxd.socket

	dodoc AUTHORS doc/*
	use nls && domo po/*.mo
}

pkg_postinst() {
	elog
	elog "Consult https://wiki.gentoo.org/wiki/LXD for more information,"
	elog "including a Quick Start."
	elog
	elog "Optional features:"
	optfeature "btrfs storage backend" sys-fs/btrfs-progs
	optfeature "lvm2 storage backend" sys-fs/lvm2
	optfeature "zfs storage backend" sys-fs/zfs
	elog
	elog "Be sure to add your local user to the lxd group."
}