Files
linuxkit/pkg/package.mk
Ian Campbell 0469901778 package: Do not add an arch suffix if an explicit HASH is given
During development I tend to do:
	make -C pkg/foo tag HASH=dev ORG=ijc
and I expect to get an image `ijc/foo:dev` and not `ijc/foo:dev-amd64`. In
general I think if the HASH has been explicitly provided the build should
just honour that.

To compensate and avoid mistaken pushes adjust the check for dirtiness to also
insist on a non-empty suffix.

Signed-off-by: Ian Campbell <ijc@docker.com>
2017-08-11 11:26:00 +01:00

124 lines
3.1 KiB
Makefile

.PHONY: image tag forcetag show-tag check-dirty push forcepush
default: push
ORG?=linuxkit
SOURCE ?= .
ARCH := $(shell uname -m)
# Hash is of $(CURDIR) not $(CURDIR)$(SOURCE) to allow autogenerated
# source subdirectories (which would not be covered by ls-tree, but
# the code which autogenerates should be in $(CURDIR) so that is what
# we want to use.
ifeq ($(HASH),)
HASH_COMMIT?=HEAD # Setting this is only really useful with the show-tag target
HASH?=$(shell git ls-tree --full-tree $(HASH_COMMIT) -- $(CURDIR) | awk '{print $$3}')
ifneq ($(HASH_COMMIT),HEAD) # Others can't be dirty by definition
DIRTY:=$(shell git update-index -q --refresh && git diff-index --quiet HEAD -- $(CURDIR) || echo "-dirty")
endif
ifeq ($(ARCH), x86_64)
SUFFIX=-amd64
endif
ifeq ($(ARCH), aarch64)
SUFFIX=-arm64
endif
endif
# Makefiles can specify specific architectures they compile for. Default: all
ifeq ($(ARCHES),)
ARCHES:=x86_64 aarch64
endif
ifneq ($(filter $(ARCH),$(ARCHES)),)
REAL:=-y
else
REAL:=-n
endif
TAG:=$(ORG)/$(IMAGE):$(HASH)$(DIRTY)
REPO?=https://github.com/linuxkit/linuxkit
ifneq ($(REPO),)
REPO_LABEL=--label org.opencontainers.image.source=$(REPO)
endif
ifeq ($(DIRTY),)
REPO_COMMIT=$(shell git rev-parse HEAD)
COMMIT_LABEL=--label org.opencontainers.image.revision=$(REPO_COMMIT)
endif
LABELS=$(REPO_LABEL) $(COMMIT_LABEL)
BASE_DEPS=Dockerfile Makefile
# Get a release tag, if present
RELEASE:=$(shell git tag -l --points-at HEAD)
# Path to push-manifest.sh
PUSH_MANIFEST:=$(shell git rev-parse --show-toplevel)/scripts/push-manifest.sh
ifdef NETWORK
NET_OPT=
else
NET_OPT=--network=none
endif
ifeq ($(DOCKER_CONTENT_TRUST),)
ifndef NOTRUST
export DOCKER_CONTENT_TRUST=1
endif
endif
tag: tag$(REAL)
forcetag: forcetag$(REAL)
push: push$(REAL)
forcepush: forcepush$(REAL)
show-tag:
@echo $(TAG)
tag-y: $(BASE_DEPS) $(DEPS)
docker pull $(TAG)$(SUFFIX) || \
docker build $(LABELS) $(NET_OPT) -t $(TAG)$(SUFFIX) $(SOURCE)
forcetag-y: $(BASE_DEPS) $(DEPS)
docker build $(LABELS) $(NET_OPT) -t $(TAG)$(SUFFIX) $(SOURCE)
check-dirty:
ifneq ($(DIRTY),)
$(error Your repository is not clean. Will not push package image)
endif
ifeq ($(SUFFIX),)
$(error Refusing to push without a SUFFIX)
endif
push-y: tag-y check-dirty
docker pull $(TAG)$(SUFFIX) || \
(docker push $(TAG)$(SUFFIX) && \
$(PUSH_MANIFEST) $(TAG) $(DOCKER_CONTENT_TRUST))
ifneq ($(RELEASE),)
docker tag $(TAG)$(SUFFIX) $(ORG)/$(IMAGE):$(RELEASE)$(SUFFIX)
docker push $(ORG)/$(IMAGE):$(RELEASE)$(SUFFIX)
$(PUSH_MANIFEST) $(ORG)/$(IMAGE):$(RELEASE) $(DOCKER_CONTENT_TRUST)
endif
forcepush-y: forcetag-y check-dirty
docker push $(TAG)$(SUFFIX)
$(PUSH_MANIFEST) $(TAG) $(DOCKER_CONTENT_TRUST)
ifneq ($(RELEASE),)
docker tag $(TAG)$(SUFFIX) $(ORG)/$(IMAGE):$(RELEASE)
docker push $(ORG)/$(IMAGE):$(RELEASE)$(SUFFIX)
$(PUSH_MANIFEST) $(ORG)/$(IMAGE):$(RELEASE) $(DOCKER_CONTENT_TRUST)
endif
# If not supported for an arch, print a message
tag-n:
$(info This package does not work on $(ARCH). Ignored)
forcetag-n:
$(info This package does not work on $(ARCH). Ignored)
push-n:
$(info This package does not work on $(ARCH). Ignored)
forcepush-n:
$(info This package does not work on $(ARCH). Ignored)