github.com/mgoltzsche/ctnr@v0.7.1-alpha/Makefile (about) 1 BUILDIMAGE=local/ctnr-build:latest 2 LITEIDEIMAGE=local/ctnr-build:liteide 3 DOCKER=docker 4 USER=$(shell [ '${DOCKER}' = docker ] && id -u || echo 0) 5 DOCKERRUN=${DOCKER} run --name ctnr-build --rm -v "${REPODIR}:/work" -w /work 6 7 REPODIR=$(shell pwd) 8 GOPATH=${REPODIR}/build 9 LITEIDE_WORKSPACE=${GOPATH}/liteide-workspace 10 PKGNAME=github.com/mgoltzsche/ctnr 11 PKGRELATIVEROOT=$(shell echo /src/${PKGNAME} | sed -E 's/\/+[^\/]*/..\//g') 12 VENDORLOCK=${REPODIR}/vendor/ready 13 BINARY=ctnr 14 15 COMMIT_ID=$(shell git rev-parse HEAD) 16 COMMIT_TAG=$(shell git describe --exact-match ${COMMIT_ID} || echo -n "dev") 17 COMMIT_DATE=$(shell git show -s --format=%ci ${COMMIT_ID}) 18 19 # 'apparmor' tag cannot be used for runc yet since package is not yet available in alpine:3.7 20 BUILDTAGS_RUNC=seccomp selinux ambient 21 BUILDTAGS?=containers_image_ostree_stub containers_image_storage_stub containers_image_openpgp libdm_no_deferred_remove btrfs_noversion ${BUILDTAGS_RUNC} 22 BUILDTAGS_STATIC=${BUILDTAGS} linux static_build exclude_graphdriver_devicemapper mgoltzsche_ctnr_libcontainer 23 LDFLAGS+=-X main.commit=${COMMIT_ID} -X main.version=${COMMIT_TAG} -X 'main.date=${COMMIT_DATE}' 24 LDFLAGS_STATIC=${LDFLAGS} -extldflags '-static' 25 26 CNI_VERSION=0.6.0 27 CNIGOPATH=${GOPATH}/cni 28 29 COBRA=${GOPATH}/bin/cobra 30 PACKAGES:=$(shell go list $(BUILDFLAGS) . | grep -v github.com/mgoltzsche/ctnr/vendor) 31 32 export PATH := dist/bin:$(PATH) 33 34 all: binary-static cni-plugins-static 35 36 binary-static: .buildimage 37 ${DOCKERRUN} -u ${USER}:${USER} ${BUILDIMAGE} make binary BUILDTAGS="${BUILDTAGS_STATIC}" LDFLAGS="${LDFLAGS_STATIC}" 38 39 check: binary-static test-static 40 41 binary: dependencies 42 # Building application: 43 GOPATH="${GOPATH}" \ 44 go build -o dist/bin/${BINARY} -a -ldflags "${LDFLAGS}" -tags "${BUILDTAGS}" "${PKGNAME}" 45 ln -sf bin/${BINARY} dist/${BINARY}.linux-amd64 46 47 generate: dependencies 48 GOPATH="${GOPATH}" \ 49 go get github.com/golang/protobuf/protoc-gen-go 50 # GOPATH="${GOPATH}" 51 cd "${GOPATH}"/src/github.com/mgoltzsche/ctnr/vendor/github.com/rootless-containers/proto && \ 52 "${GOPATH}/bin/protoc-gen-go" --go_out=. rootlesscontainers.proto 53 54 test: dependencies 55 # Run tests 56 export GOPATH="${GOPATH}"; \ 57 go test -tags "${BUILDTAGS}" -coverprofile "${GOPATH}/coverage.out" -cover $(shell export GOPATH="${GOPATH}"; cd "${GOPATH}/src/${PKGNAME}" && go list -tags "${BUILDTAGS_STATIC}" ./... 2>/dev/null | grep -Ev '/vendor/|^${PKGNAME}/build/') 58 #export GOPATH="${GOPATH}"; cd "${GOPATH}/src/github.com/mgoltzsche/ctnr/image/builder" && go test -tags "${BUILDTAGS}" -run ImageBuilder 59 60 test-static: dependencies .buildimage 61 # Run tests using BUILDTAGS_STATIC 62 #export GOPATH="${GOPATH}"; \ 63 #go test -tags "${BUILDTAGS_STATIC}" -coverprofile "${GOPATH}/coverage.out" -cover $(shell export GOPATH="${GOPATH}"; cd "${GOPATH}/src/${PKGNAME}" && go list -tags "${BUILDTAGS_STATIC}" ./... 2>/dev/null | grep -Ev '/vendor/|^${PKGNAME}/build/') 64 ${DOCKERRUN} --privileged ${BUILDIMAGE} make test BUILDTAGS="${BUILDTAGS_STATIC}" LDFLAGS="${LDFLAGS_STATIC}" 65 66 test-coverage: test 67 GOPATH="${GOPATH}" go tool cover -html="${GOPATH}/coverage.out" 68 69 fmt: 70 # Format the go code 71 (find . -mindepth 1 -maxdepth 1 -type d; ls *.go) | grep -Ev '^(./vendor|./dist|./build|./.git)(/.*)?$$' | xargs -n1 gofmt -w 72 73 # TODO: Run lint per default if hints fixed 74 lint: 75 export GOPATH="${GOPATH}"; \ 76 go get golang.org/x/lint/golint && \ 77 "${GOPATH}/bin/golint" $(shell export GOPATH="${GOPATH}"; cd "${GOPATH}/src/${PKGNAME}" && go list -tags "${BUILDTAGS_STATIC}" ./... 2>/dev/null | grep -Ev '/vendor/|^${PKGNAME}/build/') 78 79 runc: dependencies 80 rm -rf "${GOPATH}/src/github.com/opencontainers/runc" 81 mkdir -p "${GOPATH}/src/github.com/opencontainers" 82 cp -r "${GOPATH}/src/${PKGNAME}/vendor/github.com/opencontainers/runc" "${GOPATH}/src/github.com/opencontainers/runc" 83 ln -sr "${REPODIR}/vendor" "${GOPATH}/src/github.com/opencontainers/runc/vendor" 84 cd "${GOPATH}/src/github.com/opencontainers/runc" && \ 85 export GOPATH="${GOPATH}" && \ 86 make clean && \ 87 make BUILDTAGS="${BUILDTAGS_RUNC}" && \ 88 cp runc "${REPODIR}/dist/bin/runc" 89 90 cni-plugins-static: .buildimage 91 ${DOCKERRUN} ${BUILDIMAGE} make cni-plugins LDFLAGS="${LDFLAGS_STATIC}" 92 93 cni-plugins: 94 # Build CNI plugins 95 mkdir -p "${CNIGOPATH}" 96 wget -O "${CNIGOPATH}/cni-${CNI_VERSION}.tar.gz" "https://github.com/containernetworking/cni/archive/v${CNI_VERSION}.tar.gz" 97 wget -O "${CNIGOPATH}/cni-plugins-${CNI_VERSION}.tar.gz" "https://github.com/containernetworking/plugins/archive/v${CNI_VERSION}.tar.gz" 98 tar -xzf "${CNIGOPATH}/cni-${CNI_VERSION}.tar.gz" -C "${CNIGOPATH}" 99 tar -xzf "${CNIGOPATH}/cni-plugins-${CNI_VERSION}.tar.gz" -C "${CNIGOPATH}" 100 rm -rf "${CNIGOPATH}/src/github.com/containernetworking" 101 mkdir -p "${CNIGOPATH}/src/github.com/containernetworking" 102 mv "${CNIGOPATH}/cni-${CNI_VERSION}" "${CNIGOPATH}/src/github.com/containernetworking/cni" 103 mv "${CNIGOPATH}/plugins-${CNI_VERSION}" "${CNIGOPATH}/src/github.com/containernetworking/plugins" 104 export GOPATH="${CNIGOPATH}" && \ 105 for TYPE in main ipam meta; do \ 106 for CNIPLUGIN in `ls ${CNIGOPATH}/src/github.com/containernetworking/plugins/plugins/$$TYPE`; do \ 107 (set -x; go build -o dist/cni-plugins/$$CNIPLUGIN -a -ldflags "${LDFLAGS}" github.com/containernetworking/plugins/plugins/$$TYPE/$$CNIPLUGIN) || exit 1; \ 108 done \ 109 done 110 111 .buildimage: 112 # Building build image: 113 ${DOCKER} build -f Dockerfile --target ctnr-build -t ${BUILDIMAGE} . 114 115 build-sh: .buildimage 116 # Running dockerized interactive build shell 117 ${DOCKERRUN} -ti ${BUILDIMAGE} /bin/sh 118 119 dependencies: .workspace 120 ifeq ($(shell [ ! -d vendor -o "${UPDATE_DEPENDENCIES}" = TRUE ] && echo 0),0) 121 # Fetching dependencies: 122 GOPATH="${GOPATH}" go get github.com/LK4D4/vndr 123 rm -rf "${GOPATH}/vndrtmp" 124 mkdir "${GOPATH}/vndrtmp" 125 ln -sf "${REPODIR}/vendor.conf" "${GOPATH}/vndrtmp/vendor.conf" 126 (cd build/vndrtmp && "${GOPATH}/bin/vndr" -whitelist='.*') 127 rm -rf vendor 128 mv "${GOPATH}/vndrtmp/vendor" vendor 129 else 130 # Skipping dependency update 131 endif 132 133 update-dependencies: 134 # Update dependencies 135 @make dependencies UPDATE_DEPENDENCIES=TRUE 136 # In case LiteIDE is running it must be restarted to apply the changes 137 138 .workspace: 139 # Preparing build directory: 140 [ -d "${GOPATH}" ] || \ 141 (mkdir -p vendor "$(shell dirname "${GOPATH}/src/${PKGNAME}")" \ 142 && ln -sf "${PKGRELATIVEROOT}" "${GOPATH}/src/${PKGNAME}") 143 144 cobra: .workspace 145 # Build cobra CLI to manage the application's CLI 146 GOPATH="${GOPATH}" go get github.com/spf13/cobra/cobra 147 "${GOPATH}/bin/cobra" 148 149 proot: 150 ctnr image build --verbose --dockerfile Dockerfile --target proot --tag local/proot 151 ctnr bundle create -b "${GOPATH}/proot-bundle" --update local/proot 152 cp "${GOPATH}/proot-bundle/rootfs/proot" "${REPODIR}/dist/bin/proot" 153 154 liteide: dependencies 155 rm -rf "${LITEIDE_WORKSPACE}" 156 mkdir "${LITEIDE_WORKSPACE}" 157 cp -r vendor "${LITEIDE_WORKSPACE}/src" 158 mkdir -p "${LITEIDE_WORKSPACE}/src/${PKGNAME}" 159 ln -sr "${REPODIR}"/* "${LITEIDE_WORKSPACE}/src/${PKGNAME}" 160 (cd "${LITEIDE_WORKSPACE}/src/${PKGNAME}" && rm build vendor dist) 161 GOPATH="${LITEIDE_WORKSPACE}" \ 162 BUILDFLAGS="-tags \"${BUILDTAGS}\"" \ 163 liteide "${LITEIDE_WORKSPACE}/src/${PKGNAME}" & 164 ################################################################ 165 # Setup LiteIDE project using the main package's context menu: # 166 # - 'Build Path Configuration': # 167 # - Make sure 'Inherit System GOPATH' is checked! # 168 # - Configure BUILDFLAGS variable printed above # 169 # - 'Lock Build Path' to the top-level directory # 170 # # 171 # CREATE NEW TOP LEVEL PACKAGES IN THE REPOSITORY DIRECTORY # 172 # EXTERNALLY AND RESTART LiteIDE WITH THIS COMMAND! # 173 ################################################################ 174 175 ide: .liteideimage 176 # Make sure to lock the build path to the top-level directory 177 ctnr bundle create -b ctnr-liteide --update=true -w /work \ 178 --mount "src=${REPODIR},dst=/work/src/github.com/mgoltzsche/ctnr" \ 179 --mount "src=${REPODIR}/liteide.ini,dst=/root/.config/liteide/liteide.ini" \ 180 --mount src=/etc/machine-id,dst=/etc/machine-id,opt=ro \ 181 --mount src=/tmp/.X11-unix,dst=/tmp/.X11-unix \ 182 --env DISPLAY=$$DISPLAY \ 183 --env GOPATH=/work \ 184 ${LITEIDEIMAGE} \ 185 liteide /work/src/github.com/mgoltzsche/ctnr 186 ctnr bundle run --verbose ctnr-liteide & 187 188 .liteideimage: 189 ctnr image build --dockerfile=Dockerfile --target=liteide --tag=${LITEIDEIMAGE} 190 191 LITEIDE_PKGS=g++ qt5-qttools qt5-qtbase-dev qt5-qtbase-x11 qt5-qtwebkit xkeyboard-config libcanberra-gtk3 adwaita-icon-theme ttf-dejavu 192 .OLD_liteideimage: .buildimage 193 # TODO: clean this up when --workdir and --env options are supported 194 ctnr image build \ 195 --from=docker-daemon:${BUILDIMAGE} \ 196 --author='Max Goltzsche <max.goltzsche@gmail.com>' \ 197 --run-sh='cd / && git clone https://github.com/visualfc/liteide.git \ 198 && apk add --update --no-cache ${LITEIDE_PKGS} || /usr/lib/qt5/bin/qmake -help >/dev/null' \ 199 --run-sh='cd /liteide/build && ./update_pkg.sh \ 200 && cd /liteide/build && QTDIR=/usr/lib/qt5 ./build_linux.sh \ 201 && rm -rf /usr/local/bin; ln -s /liteide/build/liteide/bin /usr/local/bin' \ 202 --tag=${LITEIDEIMAGE} 203 204 install: 205 cp dist/bin/ctnr /usr/local/bin/ctnr 206 207 clean: 208 rm -rf ./build ./dist