| # Copyright 1999-2019 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| EAPI=6 |
| |
| DESCRIPTION="Fast, dense and secure container management" |
| HOMEPAGE="https://linuxcontainers.org/lxd/introduction/" |
| |
| # This list includes the subset of packages required for the LXD client library |
| # to build. |
| CROS_GO_PACKAGES=( |
| "github.com/Rican7/retry" |
| "github.com/Rican7/retry/backoff" |
| "github.com/Rican7/retry/jitter" |
| "github.com/Rican7/retry/strategy" |
| "github.com/canonical/go-dqlite/client" |
| "github.com/canonical/go-dqlite/driver" |
| "github.com/canonical/go-dqlite/internal/bindings" |
| "github.com/canonical/go-dqlite/internal/logging" |
| "github.com/canonical/go-dqlite/internal/protocol" |
| "github.com/flosch/pongo2" |
| "github.com/gosexy/gettext" |
| "github.com/juju/errors" |
| "github.com/juju/loggo" |
| "github.com/juju/webbrowser" |
| "github.com/lxc/lxd/client" |
| "github.com/lxc/lxd/lxd/db/cluster" |
| "github.com/lxc/lxd/lxd/db/node" |
| "github.com/lxc/lxd/lxd/db/query" |
| "github.com/lxc/lxd/lxd/db/schema" |
| "github.com/lxc/lxd/lxd/util" |
| "github.com/lxc/lxd/shared/..." |
| "github.com/mattn/go-colorable" |
| "github.com/mattn/go-isatty" |
| "github.com/mattn/go-sqlite3" |
| "github.com/rogpeppe/fastuuid" |
| "github.com/spf13/cobra" |
| "github.com/spf13/pflag" |
| "gopkg.in/errgo.v1" |
| "gopkg.in/httprequest.v1" |
| "gopkg.in/lxc/go-lxc.v2" |
| "gopkg.in/macaroon-bakery.v2/bakery" |
| "gopkg.in/macaroon-bakery.v2/bakery/checkers" |
| "gopkg.in/macaroon-bakery.v2/bakery/internal/macaroonpb" |
| "gopkg.in/macaroon-bakery.v2/httpbakery" |
| "gopkg.in/macaroon-bakery.v2/internal/httputil" |
| "gopkg.in/macaroon.v2" |
| "gopkg.in/robfig/cron.v2" |
| ) |
| |
| CROS_GO_WORKSPACE="${S}/_dist" |
| |
| LICENSE="Apache-2.0 BSD BSD-2 LGPL-2.1 LGPL-3 MIT MPL-2.0" |
| SLOT="0" |
| KEYWORDS="-* amd64 arm arm64" |
| |
| IUSE="+daemon +ipv6 +dnsmasq nls test tools" |
| |
| RESTRICT="test" |
| |
| inherit autotools bash-completion-r1 cros-go linux-info multilib systemd user |
| |
| SRC_URI="https://linuxcontainers.org/downloads/${PN}/${P}.tar.gz" |
| |
| DEPEND=" |
| dev-db/sqlite |
| dev-go/cmp |
| dev-go/crypto |
| dev-go/errors |
| dev-go/genproto |
| dev-go/glog |
| dev-go/go-sys |
| dev-go/httprouter |
| dev-go/net |
| dev-go/protobuf |
| dev-go/text |
| dev-go/websocket |
| dev-lang/tcl |
| >=dev-lang/go-1.9.4 |
| dev-libs/libuv |
| dev-libs/protobuf:= |
| nls? ( sys-devel/gettext ) |
| test? ( |
| app-misc/jq |
| net-misc/curl |
| sys-devel/gettext |
| ) |
| " |
| |
| RDEPEND=" |
| daemon? ( |
| app-arch/xz-utils |
| >=app-emulation/lxc-2.0.7[seccomp] |
| dev-libs/libuv |
| dev-libs/lzo |
| dev-util/xdelta:3 |
| dnsmasq? ( |
| net-dns/dnsmasq[dhcp,ipv6?] |
| ) |
| net-firewall/ebtables |
| net-firewall/iptables[ipv6?] |
| net-libs/libnfnetlink |
| net-libs/libnsl:0= |
| net-misc/rsync[xattr] |
| sys-apps/iproute2[ipv6?] |
| sys-fs/fuse |
| sys-fs/lxcfs |
| sys-fs/squashfs-tools |
| virtual/acl |
| ) |
| " |
| |
| 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_IPV4 |
| ~NF_NAT_MASQUERADE_IPV6 |
| ~VXLAN |
| " |
| |
| ERROR_BRIDGE="BRIDGE: needed for network commands" |
| ERROR_DUMMY="DUMMY: needed for network commands" |
| ERROR_IP6_NF_NAT="IP6_NF_NAT: needed for network commands" |
| ERROR_IP6_NF_TARGET_MASQUERADE="IP6_NF_TARGET_MASQUERADE: needed for network commands" |
| ERROR_IPV6="IPV6: needed for network commands" |
| ERROR_IP_NF_NAT="IP_NF_NAT: needed for network commands" |
| ERROR_IP_NF_TARGET_MASQUERADE="IP_NF_TARGET_MASQUERADE: needed for network commands" |
| ERROR_MACVLAN="MACVLAN: needed for network commands" |
| ERROR_NETFILTER_XT_MATCH_COMMENT="NETFILTER_XT_MATCH_COMMENT: needed for network commands" |
| ERROR_NET_IPGRE="NET_IPGRE: needed for network commands" |
| ERROR_NET_IPGRE_DEMUX="NET_IPGRE_DEMUX: needed for network commands" |
| ERROR_NET_IPIP="NET_IPIP: needed for network commands" |
| ERROR_NF_NAT_MASQUERADE_IPV4="NF_NAT_MASQUERADE_IPV4: needed for network commands" |
| ERROR_NF_NAT_MASQUERADE_IPV6="NF_NAT_MASQUERADE_IPV6: needed for network commands" |
| ERROR_VXLAN="VXLAN: needed for network commands" |
| |
| EGO_PN="github.com/lxc/lxd" |
| |
| src_unpack() { |
| unpack "${A}" |
| cd "${S}" |
| |
| # Instead of using the lxd symlink in the dist directory, move the lxd |
| # source into that directory. Otherwise, the cros-go_src_install stage |
| # will fail since it won't traverse symlinks. |
| rm "${S}/_dist/src/${EGO_PN}" |
| mkdir "${S}/_dist/src/${EGO_PN}" |
| find "${S}"/* -maxdepth 0 \ |
| -type d \ |
| ! -name "_dist" \ |
| -exec mv {} "${S}/_dist/src/${EGO_PN}" \; |
| } |
| |
| src_prepare() { |
| cd "${S}/_dist/src/${EGO_PN}" |
| eapply "${FILESDIR}/0001-lxd-util-Add-HasFilesystem.patch" # crbug.com/1024327 |
| eapply "${FILESDIR}/0002-lxd-Detect-built-in-shiftfs-too.patch" # crbug.com/1024327 |
| eapply_user |
| |
| cd "${S}/_dist/deps/libco" || die "Can't cd to libco dir" |
| eapply "${FILESDIR}/${P}-libco-arm-asm.patch" # crbug.com/1059078 |
| eapply "${FILESDIR}/${P}-libco-aarch64-asm.patch" # crbug.com/1059078 |
| eapply "${FILESDIR}/${P}-libco-amd64-asm.patch" # crbug.com/1059078 |
| |
| cd "${S}/_dist/deps/raft" || die "Can't cd to raft dir" |
| eautoreconf |
| |
| cd "${S}/_dist/deps/dqlite" || die "Can't cd to dqlite dir" |
| eautoreconf |
| } |
| |
| src_configure() { |
| export GOPATH="${S}/_dist" |
| cd "${GOPATH}/deps/sqlite" || die "Can't cd to sqlite dir" |
| econf --enable-replication --disable-amalgamation --disable-tcl --libdir="${EPREFIX}/usr/$(get_libdir)/lxd" |
| |
| cd "${GOPATH}/deps/raft" || die "Can't cd to raft dir" |
| PKG_CONFIG_PATH="${GOPATH}/deps/raft/" econf --libdir="${EPREFIX}/usr/$(get_libdir)/lxd" |
| |
| cd "${GOPATH}/deps/dqlite" || die "Can't cd to dqlite dir" |
| export RAFT_CFLAGS="-I${GOPATH}/deps/raft/include/" |
| export RAFT_LIBS="${GOPATH}/deps/raft/.libs" |
| export CO_CFLAGS="-I${GOPATH}/deps/libco/" |
| export CO_LIBS="${GOPATH}/deps/libco/" |
| PKG_CONFIG_PATH="${GOPATH}/deps/sqlite/" econf --libdir="${EPREFIX}/usr/$(get_libdir)/lxd" |
| } |
| |
| src_compile() { |
| export GOPATH="${S}/_dist" |
| |
| cd "${GOPATH}/deps/sqlite" || die "Can't cd to sqlite dir" |
| emake |
| |
| cd "${GOPATH}/deps/raft" || die "Can't cd to raft dir" |
| emake |
| |
| cd "${GOPATH}/deps/libco" || die "Can't cd to libco dir" |
| emake |
| |
| cd "${GOPATH}/deps/dqlite" || die "Can't cd to dqlite dir" |
| emake CFLAGS="${CFLAGS} -I${GOPATH}/deps/sqlite -I${GOPATH}/deps/raft/include" \ |
| LDFLAGS="${LDFLAGS} -L${GOPATH}/deps/sqlite -L${GOPATH}/deps/raft" |
| |
| # We don't use the Makefile here because it builds targets with the |
| # assumption that `pwd` is in a deep gopath namespace, which we're not. |
| # It's simpler to manually call "cros_go install" than patching the Makefile. |
| cd "${S}" |
| cros_go install -v -x ${EGO_PN}/lxc || die "Failed to build the client" |
| |
| if use daemon; then |
| |
| # LXD depends on a patched, bundled sqlite with replication |
| # capabilities. |
| export CGO_CFLAGS="-I${GOPATH}/deps/sqlite/ -I${GOPATH}/deps/dqlite/include/ -I${GOPATH}/deps/raft/include/ -I${GOPATH}/deps/libco/" |
| export 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/$(get_libdir)/lxd" |
| export LD_LIBRARY_PATH="${GOPATH}/deps/sqlite/.libs/:${GOPATH}/deps/dqlite/.libs/:${GOPATH}/deps/raft/.libs:${GOPATH}/deps/libco/" |
| |
| cros_go install -v -x -tags libsqlite3 ${EGO_PN}/lxd || die "Failed to build the daemon" |
| fi |
| |
| if use tools; then |
| cros_go install -v -x ${EGO_PN}/fuidshift || die "Failed to build fuidshift" |
| cros_go install -v -x ${EGO_PN}/lxc-to-lxd || die "Failed to build lxc-to-lxd" |
| cros_go install -v -x ${EGO_PN}/lxd-benchmark || die "Failed to build lxd-benchmark" |
| cros_go install -v -x ${EGO_PN}/lxd-p2c || die "Failed to build lxd-p2c" |
| fi |
| |
| use nls && emake build-mo |
| } |
| |
| src_test() { |
| if use daemon; then |
| 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. |
| cros_go get -v -x github.com/rogpeppe/godeps |
| cros_go get -v -x github.com/remyoudompheng/go-misc/deadcode |
| cros_go get -v -x github.com/golang/lint/golint |
| cros_go test -v ${EGO_PN}/lxd |
| else |
| einfo "No tests to run for client-only builds" |
| fi |
| } |
| |
| src_install() { |
| cros-go_src_install |
| |
| local bindir="_dist/bin" |
| if [[ ${ARCH} != "amd64" ]]; then |
| bindir="${bindir}/linux_${ARCH}" |
| fi |
| dobin ${bindir}/lxc |
| if use daemon; then |
| |
| export GOPATH="${S}/_dist" |
| cd "${GOPATH}/deps/sqlite" || die "Can't cd to sqlite dir" |
| emake DESTDIR="${D}" install |
| |
| cd "${GOPATH}/deps/raft" || die "Can't cd to raft dir" |
| emake DESTDIR="${D}" install |
| |
| cd "${GOPATH}/deps/libco" || die "Can't cd to libco dir" |
| dolib.so libco.so.0.1.0 || die "Can't install libco.so" |
| |
| cd "${GOPATH}/deps/dqlite" || die "Can't cd to dqlite dir" |
| emake DESTDIR="${D}" install |
| |
| # Must only install libs |
| rm "${D}/usr/bin/sqlite3" || die "Can't remove custom sqlite3 binary" |
| rm -r "${D}/usr/include" || die "Can't remove include directory" |
| |
| cd "${S}" || die "Can't cd to \${S}" |
| dosbin ${bindir}/lxd |
| fi |
| |
| if use tools; then |
| dobin ${bindir}/fuidshift |
| dobin ${bindir}/lxc-to-lxd |
| dobin ${bindir}/lxd-benchmark |
| dobin ${bindir}/lxd-p2c |
| fi |
| |
| if use nls; then |
| domo po/*.mo |
| fi |
| |
| # These C header files are dependencies of lxd/shared/idmap which don't |
| # get installed by the usual golang tools. |
| insinto "/usr/lib/gopath/src/github.com/lxc/lxd/lxd/" |
| doins -r "${S}/_dist/src/github.com/lxc/lxd/lxd/include" |
| |
| newbashcomp _dist/src/${EGO_PN}/scripts/bash/lxd-client lxc |
| |
| dodoc AUTHORS _dist/src/${EGO_PN}/doc/* |
| } |
| |
| pkg_postinst() { |
| cros-go_pkg_postinst |
| |
| elog |
| elog "Consult https://wiki.gentoo.org/wiki/LXD for more information," |
| elog "including a Quick Start." |
| |
| # The messaging below only applies to daemon installs |
| use daemon || return 0 |
| |
| # The control socket will be owned by (and writeable by) this group. |
| enewgroup lxd |
| |
| # Ubuntu also defines an lxd user but it appears unused (the daemon |
| # must run as root) |
| |
| elog |
| elog "Though not strictly required, some features are enabled at run-time" |
| elog "when the relevant helper programs are detected:" |
| elog "- sys-apps/apparmor" |
| elog "- sys-fs/btrfs-progs" |
| elog "- sys-fs/lvm2" |
| elog "- sys-fs/zfs" |
| elog "- sys-process/criu" |
| elog |
| elog "Since these features can't be disabled at build-time they are" |
| elog "not USE-conditional." |
| elog |
| elog "Be sure to add your local user to the lxd group." |
| elog |
| elog "Networks with bridge.mode=fan are unsupported due to requiring" |
| elog "a patched kernel and iproute2." |
| } |
| |
| # TODO: |
| # - man page, I don't see cobra generating it |
| # - maybe implement LXD_CLUSTER_UPDATE per |
| # https://discuss.linuxcontainers.org/t/lxd-3-5-has-been-released/2656 |
| # EM I'm not convinced it's a good design. |