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