# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. DOCKER ?= docker MKDIR ?= mkdir DIST_DIR ?= $(CURDIR)/dist LIB_NAME := nvidia-container-toolkit LIB_VERSION := 1.5.1 LIB_TAG ?= GOLANG_VERSION := 1.16.3 MODULE := github.com/NVIDIA/nvidia-container-toolkit # By default run all native docker-based targets docker-native: include $(CURDIR)/docker/docker.mk ifeq ($(IMAGE),) REGISTRY ?= nvidia IMAGE=$(REGISTRY)/container-toolkit endif IMAGE_TAG ?= $(GOLANG_VERSION) BUILDIMAGE ?= $(IMAGE):$(IMAGE_TAG)-devel EXAMPLES := $(patsubst ./examples/%/,%,$(sort $(dir $(wildcard ./examples/*/)))) EXAMPLE_TARGETS := $(patsubst %,example-%, $(EXAMPLES)) MAKE_TARGETS := binary build all check fmt assert-fmt lint lint-internal vet test examples coverage generate TARGETS := $(MAKE_TARGETS) $(EXAMPLE_TARGETS) DOCKER_TARGETS := $(patsubst %,docker-%, $(TARGETS)) .PHONY: $(TARGETS) $(DOCKER_TARGETS) GOOS ?= linux binary: GOOS=$(GOOS) go build -ldflags "-s -w" -o "$(LIB_NAME)" $(MODULE)/cmd/$(LIB_NAME) build: GOOS=$(GOOS) go build ./... examples: $(EXAMPLE_TARGETS) $(EXAMPLE_TARGETS): example-%: GOOS=$(GOOS) go build ./examples/$(*) all: check test build binary check: assert-fmt lint vet # Apply go fmt to the codebase fmt: go list -f '{{.Dir}}' $(MODULE)/... \ | xargs gofmt -s -l -w assert-fmt: go list -f '{{.Dir}}' $(MODULE)/... \ | xargs gofmt -s -l > fmt.out @if [ -s fmt.out ]; then \ echo "\nERROR: The following files are not formatted:\n"; \ cat fmt.out; \ rm fmt.out; \ exit 1; \ else \ rm fmt.out; \ fi ineffassign: ineffassign $(MODULE)/... lint: # We use `go list -f '{{.Dir}}' $(MODULE)/...` to skip the `vendor` folder. go list -f '{{.Dir}}' $(MODULE)/... | grep -v /internal/ | xargs golint -set_exit_status lint-internal: # We use `go list -f '{{.Dir}}' $(MODULE)/...` to skip the `vendor` folder. go list -f '{{.Dir}}' $(MODULE)/internal/... | xargs golint -set_exit_status misspell: misspell $(MODULE)/... vet: go vet $(MODULE)/... COVERAGE_FILE := coverage.out test: build go test -v -coverprofile=$(COVERAGE_FILE) $(MODULE)/... coverage: test cat $(COVERAGE_FILE) | grep -v "_mock.go" > $(COVERAGE_FILE).no-mocks go tool cover -func=$(COVERAGE_FILE).no-mocks generate: go generate $(MODULE)/... # Generate an image for containerized builds # Note: This image is local only .PHONY: .build-image .pull-build-image .push-build-image .build-image: docker/Dockerfile.devel if [ x"$(SKIP_IMAGE_BUILD)" = x"" ]; then \ $(DOCKER) build \ --progress=plain \ --build-arg GOLANG_VERSION="$(GOLANG_VERSION)" \ --tag $(BUILDIMAGE) \ -f $(^) \ docker; \ fi .pull-build-image: $(DOCKER) pull $(BUILDIMAGE) .push-build-image: $(DOCKER) push $(BUILDIMAGE) $(DOCKER_TARGETS): docker-%: .build-image @echo "Running 'make $(*)' in docker container $(BUILDIMAGE)" $(DOCKER) run \ --rm \ -e GOCACHE=/tmp/.cache \ -v $(PWD):$(PWD) \ -w $(PWD) \ --user $$(id -u):$$(id -g) \ $(BUILDIMAGE) \ make $(*)