From 4bf2ef646f5937c2d6eb49093fad15cfe65e7aae Mon Sep 17 00:00:00 2001 From: Mike Danese Date: Mon, 15 May 2017 15:51:18 -0700 Subject: [PATCH] move build related files out of the root directory --- .bazelrc | 7 +- BUILD.bazel | 86 +--- Makefile | 537 +------------------- Makefile.generated_files | 746 +--------------------------- WORKSPACE | 92 +--- build/root/.bazelrc | 6 + build/root/BUILD.root | 85 ++++ build/root/Makefile | 536 ++++++++++++++++++++ build/root/Makefile.generated_files | 745 +++++++++++++++++++++++++++ build/root/WORKSPACE | 91 ++++ 10 files changed, 1468 insertions(+), 1463 deletions(-) mode change 100644 => 120000 .bazelrc mode change 100644 => 120000 BUILD.bazel mode change 100644 => 120000 Makefile mode change 100644 => 120000 Makefile.generated_files mode change 100644 => 120000 WORKSPACE create mode 100644 build/root/.bazelrc create mode 100644 build/root/BUILD.root create mode 100644 build/root/Makefile create mode 100644 build/root/Makefile.generated_files create mode 100644 build/root/WORKSPACE diff --git a/.bazelrc b/.bazelrc deleted file mode 100644 index ab5db1d2dc3a0..0000000000000 --- a/.bazelrc +++ /dev/null @@ -1,6 +0,0 @@ -# Show us information about failures. -build --verbose_failures -test --test_output=errors - -# Include git version info -build --workspace_status_command hack/print-workspace-status.sh diff --git a/.bazelrc b/.bazelrc new file mode 120000 index 0000000000000..4de3dbc6ba57e --- /dev/null +++ b/.bazelrc @@ -0,0 +1 @@ +build/root/.bazelrc \ No newline at end of file diff --git a/BUILD.bazel b/BUILD.bazel deleted file mode 100644 index b4903fb5a53ed..0000000000000 --- a/BUILD.bazel +++ /dev/null @@ -1,85 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_prefix") -load("@io_kubernetes_build//defs:build.bzl", "gcs_upload") - -go_prefix("k8s.io/kubernetes") - -filegroup( - name = "_binary-artifacts-and-hashes", - srcs = [ - "//build:client-targets-and-hashes", - "//build:docker-artifacts-and-hashes", - "//build:node-targets-and-hashes", - "//build:server-targets-and-hashes", - "//build/debs:debs-and-hashes", - ], - visibility = ["//visibility:private"], -) - -gcs_upload( - name = "push-build", - data = [ - ":_binary-artifacts-and-hashes", - "//build/release-tars:release-tars-and-hashes", - "//cluster/gce:gcs-release-artifacts-and-hashes", - ], - upload_paths = { - "//:_binary-artifacts-and-hashes": "bin/linux/amd64", - "//build/release-tars:release-tars-and-hashes": "", - "//cluster/gce:gcs-release-artifacts-and-hashes": "extra/gce", - }, -) - -# TODO: remove this alias after 2017-05-22 -alias( - name = "ci-artifacts", - actual = "push-build", - deprecation = "This rule will be removed after 2017-05-22. Use //:push-build instead.", -) - -filegroup( - name = "package-srcs", - srcs = glob( - ["**"], - exclude = [ - "bazel-*/**", - "_*/**", - ".config/**", - ".git/**", - ".gsutil/**", - ".make/**", - ], - ), - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//api:all-srcs", - "//build:all-srcs", - "//cluster:all-srcs", - "//cmd:all-srcs", - "//docs:all-srcs", - "//examples:all-srcs", - "//federation:all-srcs", - "//hack:all-srcs", - "//pkg:all-srcs", - "//plugin:all-srcs", - "//test:all-srcs", - "//third_party:all-srcs", - "//vendor:all-srcs", - ], - tags = ["automanaged"], -) - -genrule( - name = "save_git_version", - outs = ["version"], - cmd = "grep ^STABLE_BUILD_SCM_REVISION bazel-out/stable-status.txt | awk '{print $$2}' >$@", - stamp = 1, -) diff --git a/BUILD.bazel b/BUILD.bazel new file mode 120000 index 0000000000000..6889d57dbb9f9 --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1 @@ +build/root/BUILD.root \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index 80efef199cd8f..0000000000000 --- a/Makefile +++ /dev/null @@ -1,536 +0,0 @@ -# Copyright 2016 The Kubernetes Authors. -# -# 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. - -DBG_MAKEFILE ?= -ifeq ($(DBG_MAKEFILE),1) - $(warning ***** starting Makefile for goal(s) "$(MAKECMDGOALS)") - $(warning ***** $(shell date)) -else - # If we're not debugging the Makefile, don't echo recipes. - MAKEFLAGS += -s -endif - - -# Old-skool build tools. -# -# Commonly used targets (see each target for more information): -# all: Build code. -# test: Run tests. -# clean: Clean up. - -# It's necessary to set this because some environments don't link sh -> bash. -SHELL := /bin/bash - -# We don't need make's built-in rules. -MAKEFLAGS += --no-builtin-rules -.SUFFIXES: - -# Constants used throughout. -.EXPORT_ALL_VARIABLES: -OUT_DIR ?= _output -BIN_DIR := $(OUT_DIR)/bin -PRJ_SRC_PATH := k8s.io/kubernetes -GENERATED_FILE_PREFIX := zz_generated. - -# Metadata for driving the build lives here. -META_DIR := .make - -# Our build flags. -# TODO(thockin): it would be nice to just use the native flags. Can we EOL -# these "wrapper" flags? -KUBE_GOFLAGS := $(GOFLAGS) -KUBE_GOLDFLAGS := $(GOLDFLAGS) -KUBE_GOGCFLAGS = $(GOGCFLAGS) - -# Extra options for the release or quick-release options: -KUBE_RELEASE_RUN_TESTS := $(KUBE_RELEASE_RUN_TESTS) -KUBE_FASTBUILD := $(KUBE_FASTBUILD) - -# This controls the verbosity of the build. Higher numbers mean more output. -KUBE_VERBOSE ?= 1 - -define ALL_HELP_INFO -# Build code. -# -# Args: -# WHAT: Directory names to build. If any of these directories has a 'main' -# package, the build will produce executable files under $(OUT_DIR)/go/bin. -# If not specified, "everything" will be built. -# GOFLAGS: Extra flags to pass to 'go' when building. -# GOLDFLAGS: Extra linking flags passed to 'go' when building. -# GOGCFLAGS: Additional go compile flags passed to 'go' when building. -# -# Example: -# make -# make all -# make all WHAT=cmd/kubelet GOFLAGS=-v -# make all GOGCFLAGS="-N -l" -# Note: Use the -N -l options to disable compiler optimizations an inlining. -# Using these build options allows you to subsequently use source -# debugging tools like delve. -endef -.PHONY: all -ifeq ($(PRINT_HELP),y) -all: - @echo "$$ALL_HELP_INFO" -else -all: generated_files - hack/make-rules/build.sh $(WHAT) -endif - -define GINKGO_HELP_INFO -# Build ginkgo -# -# Example: -# make ginkgo -endef -.PHONY: ginkgo -ifeq ($(PRINT_HELP),y) -ginkgo: - @echo "$$GINKGO_HELP_INFO" -else -ginkgo: - hack/make-rules/build.sh vendor/github.com/onsi/ginkgo/ginkgo -endif - -define VERIFY_HELP_INFO -# Runs all the presubmission verifications. -# -# Args: -# BRANCH: Branch to be passed to verify-godeps.sh script. -# -# Example: -# make verify -# make verify BRANCH=branch_x -endef -.PHONY: verify -ifeq ($(PRINT_HELP),y) -verify: - @echo "$$VERIFY_HELP_INFO" -else -verify: verify_generated_files - KUBE_VERIFY_GIT_BRANCH=$(BRANCH) hack/make-rules/verify.sh -v - hack/make-rules/vet.sh -endif - -define UPDATE_HELP_INFO -# Runs all the generated updates. -# -# Example: -# make update -endef -.PHONY: update -ifeq ($(PRINT_HELP),y) -update: - @echo "$$UPDATE_HELP_INFO" -else -update: - hack/update-all.sh -endif - -define CHECK_TEST_HELP_INFO -# Build and run tests. -# -# Args: -# WHAT: Directory names to test. All *_test.go files under these -# directories will be run. If not specified, "everything" will be tested. -# TESTS: Same as WHAT. -# GOFLAGS: Extra flags to pass to 'go' when building. -# GOLDFLAGS: Extra linking flags to pass to 'go' when building. -# GOGCFLAGS: Additional go compile flags passed to 'go' when building. -# -# Example: -# make check -# make test -# make check WHAT=pkg/kubelet GOFLAGS=-v -endef -.PHONY: check test -ifeq ($(PRINT_HELP),y) -check test: - @echo "$$CHECK_TEST_HELP_INFO" -else -check test: generated_files - hack/make-rules/test.sh $(WHAT) $(TESTS) -endif - -define TEST_IT_HELP_INFO -# Build and run integration tests. -# -# Args: -# WHAT: Directory names to test. All *_test.go files under these -# directories will be run. If not specified, "everything" will be tested. -# -# Example: -# make test-integration -endef -.PHONY: test-integration -ifeq ($(PRINT_HELP),y) -test-integration: - @echo "$$TEST_IT_HELP_INFO" -else -test-integration: generated_files - hack/make-rules/test-integration.sh $(WHAT) -endif - -define TEST_E2E_HELP_INFO -# Build and run end-to-end tests. -# -# Example: -# make test-e2e -endef -.PHONY: test-e2e -ifeq ($(PRINT_HELP),y) -test-e2e: - @echo "$$TEST_E2E_HELP_INFO" -else -test-e2e: ginkgo generated_files - go run hack/e2e.go -- -v --build --up --test --down -endif - -define TEST_E2E_NODE_HELP_INFO -# Build and run node end-to-end tests. -# -# Args: -# FOCUS: Regexp that matches the tests to be run. Defaults to "". -# SKIP: Regexp that matches the tests that needs to be skipped. Defaults -# to "". -# RUN_UNTIL_FAILURE: If true, pass --untilItFails to ginkgo so tests are run -# repeatedly until they fail. Defaults to false. -# REMOTE: If true, run the tests on a remote host instance on GCE. Defaults -# to false. -# IMAGES: For REMOTE=true only. Comma delimited list of images for creating -# remote hosts to run tests against. Defaults to a recent image. -# LIST_IMAGES: If true, don't run tests. Just output the list of available -# images for testing. Defaults to false. -# HOSTS: For REMOTE=true only. Comma delimited list of running gce hosts to -# run tests against. Defaults to "". -# DELETE_INSTANCES: For REMOTE=true only. Delete any instances created as -# part of this test run. Defaults to false. -# ARTIFACTS: For REMOTE=true only. Local directory to scp test artifacts into -# from the remote hosts. Defaults to "/tmp/_artifacts". -# REPORT: For REMOTE=false only. Local directory to write juntil xml results -# to. Defaults to "/tmp/". -# CLEANUP: For REMOTE=true only. If false, do not stop processes or delete -# test files on remote hosts. Defaults to true. -# IMAGE_PROJECT: For REMOTE=true only. Project containing images provided to -# IMAGES. Defaults to "kubernetes-node-e2e-images". -# INSTANCE_PREFIX: For REMOTE=true only. Instances created from images will -# have the name "${INSTANCE_PREFIX}-${IMAGE_NAME}". Defaults to "test". -# INSTANCE_METADATA: For REMOTE=true and running on GCE only. -# GUBERNATOR: For REMOTE=true only. Produce link to Gubernator to view logs. -# Defaults to false. -# PARALLELISM: The number of gingko nodes to run. Defaults to 8. -# RUNTIME: Container runtime to use (eg. docker, rkt, remote). -# Defaults to "docker". -# CONTAINER_RUNTIME_ENDPOINT: remote container endpoint to connect to. -# Used when RUNTIME is set to "remote". -# IMAGE_SERVICE_ENDPOINT: remote image endpoint to connect to, to prepull images. -# Used when RUNTIME is set to "remote". -# IMAGE_CONFIG_FILE: path to a file containing image configuration. -# -# Example: -# make test-e2e-node FOCUS=Kubelet SKIP=container -# make test-e2e-node REMOTE=true DELETE_INSTANCES=true -# make test-e2e-node TEST_ARGS='--kubelet-flags="--cgroups-per-qos=true"' -# Build and run tests. -endef -.PHONY: test-e2e-node -ifeq ($(PRINT_HELP),y) -test-e2e-node: - @echo "$$TEST_E2E_NODE_HELP_INFO" -else -test-e2e-node: ginkgo generated_files - hack/make-rules/test-e2e-node.sh -endif - -define TEST_CMD_HELP_INFO -# Build and run cmdline tests. -# -# Example: -# make test-cmd -endef -.PHONY: test-cmd -ifeq ($(PRINT_HELP),y) -test-cmd: - @echo "$$TEST_CMD_HELP_INFO" -else -test-cmd: generated_files - hack/make-rules/test-kubeadm-cmd.sh - hack/make-rules/test-cmd.sh - hack/make-rules/test-federation-cmd.sh -endif - -define CLEAN_HELP_INFO -# Remove all build artifacts. -# -# Example: -# make clean -# -# TODO(thockin): call clean_generated when we stop committing generated code. -endef -.PHONY: clean -ifeq ($(PRINT_HELP),y) -clean: - @echo "$$CLEAN_HELP_INFO" -else -clean: clean_meta - build/make-clean.sh - rm -rf $(OUT_DIR) - rm -rf Godeps/_workspace # Just until we are sure it is gone - # TODO(thockin): Remove this when we call clean_generated. - rm -f pkg/generated/openapi/zz_generated.openapi.go -endif - -define CLEAN_META_HELP_INFO -# Remove make-related metadata files. -# -# Example: -# make clean_meta -endef -.PHONY: clean_meta -ifeq ($(PRINT_HELP),y) -clean_meta: - @echo "$$CLEAN_META_HELP_INFO" -else -clean_meta: - rm -rf $(META_DIR) -endif - -define CLEAN_GENERATED_HELP_INFO -# Remove all auto-generated artifacts. Generated artifacts in staging folder should not be removed as they are not -# generated using generated_files. -# -# Example: -# make clean_generated -endef -.PHONY: clean_generated -ifeq ($(PRINT_HELP),y) -clean_generated: - @echo "$$CLEAN_GENERATED_HELP_INFO" -else -clean_generated: - find . -type f -name $(GENERATED_FILE_PREFIX)\* | grep -v "[.]/staging/.*" | xargs rm -f -endif - -define VET_HELP_INFO -# Run 'go vet'. -# -# Args: -# WHAT: Directory names to vet. All *.go files under these -# directories will be vetted. If not specified, "everything" will be -# vetted. -# -# Example: -# make vet -# make vet WHAT=pkg/kubelet -endef -.PHONY: vet -ifeq ($(PRINT_HELP),y) -vet: - @echo "$$VET_HELP_INFO" -else -vet: - hack/make-rules/vet.sh $(WHAT) -endif - -define RELEASE_HELP_INFO -# Build a release -# -# Example: -# make release -endef -.PHONY: release -ifeq ($(PRINT_HELP),y) -release: - @echo "$$RELEASE_HELP_INFO" -else -release: - build/release.sh -endif - -define RELEASE_SKIP_TESTS_HELP_INFO -# Build a release, but skip tests -# -# Args: -# KUBE_RELEASE_RUN_TESTS: Whether to run tests. Set to 'y' to run tests anyways. -# KUBE_FASTBUILD: Whether to cross-compile for other architectures. Set to 'true' to do so. -# -# Example: -# make release-skip-tests -# make quick-release -endef -.PHONY: release-skip-tests quick-release -ifeq ($(PRINT_HELP),y) -release-skip-tests quick-release: - @echo "$$RELEASE_SKIP_TESTS_HELP_INFO" -else -release-skip-tests quick-release: KUBE_RELEASE_RUN_TESTS = n -release-skip-tests quick-release: KUBE_FASTBUILD = true -release-skip-tests quick-release: - build/release.sh -endif - -define CROSS_HELP_INFO -# Cross-compile for all platforms -# -# Example: -# make cross -endef -.PHONY: cross -ifeq ($(PRINT_HELP),y) -cross: - @echo "$$CROSS_HELP_INFO" -else -cross: - hack/make-rules/cross.sh -endif - -define CMD_HELP_INFO -# Add rules for all directories in cmd/ -# -# Example: -# make kubectl kube-proxy -endef -#TODO: make EXCLUDE_TARGET auto-generated when there are other files in cmd/ -#TODO: should we exclude the target "libs" but include "cmd/libs/go2idl/*"? -EXCLUDE_TARGET=OWNERS -.PHONY: $(filter-out %$(EXCLUDE_TARGET),$(notdir $(abspath $(wildcard cmd/*/)))) -ifeq ($(PRINT_HELP),y) -$(filter-out %$(EXCLUDE_TARGET),$(notdir $(abspath $(wildcard cmd/*/)))): - @echo "$$CMD_HELP_INFO" -else -$(filter-out %$(EXCLUDE_TARGET),$(notdir $(abspath $(wildcard cmd/*/)))): generated_files - hack/make-rules/build.sh cmd/$@ -endif - -define PLUGIN_CMD_HELP_INFO -# Add rules for all directories in plugin/cmd/ -# -# Example: -# make kube-scheduler -endef -.PHONY: $(notdir $(abspath $(wildcard plugin/cmd/*/))) -ifeq ($(PRINT_HELP),y) -$(notdir $(abspath $(wildcard plugin/cmd/*/))): - @echo "$$PLUGIN_CMD_HELP_INFO" -else -$(notdir $(abspath $(wildcard plugin/cmd/*/))): generated_files - hack/make-rules/build.sh plugin/cmd/$@ -endif - -define FED_CMD_HELP_INFO -# Add rules for all directories in federation/cmd/ -# -# Example: -# make federation-apiserver federation-controller-manager -endef -.PHONY: $(notdir $(abspath $(wildcard federation/cmd/*/))) -ifeq ($(PRINT_HELP),y) -$(notdir $(abspath $(wildcard federation/cmd/*/))): - @echo "$$FED_CMD_HELP_INFO" -else -$(notdir $(abspath $(wildcard federation/cmd/*/))): generated_files - hack/make-rules/build.sh federation/cmd/$@ -endif - -define GENERATED_FILES_HELP_INFO -# Produce auto-generated files needed for the build. -# -# Example: -# make generated_files -endef -.PHONY: generated_files -ifeq ($(PRINT_HELP),y) -generated_files: - @echo "$$GENERATED_FILES_HELP_INFO" -else -generated_files: - $(MAKE) -f Makefile.generated_files $@ CALLED_FROM_MAIN_MAKEFILE=1 -endif - -define VERIFY_GENERATED_FILES_HELP_INFO -# Verify auto-generated files needed for the build. -# -# Example: -# make verify_generated_files -endef -.PHONY: verify_generated_files -ifeq ($(PRINT_HELP),y) -verify_generated_files: - @echo "$$VERIFY_GENERATED_FILES_HELP_INFO" -else -verify_generated_files: - $(MAKE) -f Makefile.generated_files $@ CALLED_FROM_MAIN_MAKEFILE=1 -endif - -define HELP_INFO -# Print make targets and help info -# -# Example: -# make help -endef -.PHONY: help -ifeq ($(PRINT_HELP),y) -help: - @echo "$$HELP_INFO" -else -help: - hack/make-rules/make-help.sh -endif - -# Non-dockerized bazel rules. -.PHONY: bazel-build bazel-test bazel-release - -ifeq ($(PRINT_HELP),y) -define BAZEL_BUILD_HELP_INFO -# Build with bazel -# -# Example: -# make bazel-build -endef -bazel-build: - @echo "$$BAZEL_BUILD_HELP_INFO" -else -bazel-build: - bazel build //cmd/... //pkg/... //federation/... //plugin/... //third_party/... //examples/... //test/... //vendor/k8s.io/... -endif - - -ifeq ($(PRINT_HELP),y) -define BAZEL_TEST_HELP_INFO -# Test with bazel -# -# Example: -# make bazel-test -endef -bazel-test: - @echo "$$BAZEL_TEST_HELP_INFO" -else -bazel-test: - bazel test --test_tag_filters=-integration --flaky_test_attempts=3 //cmd/... //pkg/... //federation/... //plugin/... //third_party/... //hack/... //hack:verify-all //vendor/k8s.io/... -endif - -ifeq ($(PRINT_HELP),y) -define BAZEL_BUILD_HELP_INFO -# Build release tars with bazel -# -# Example: -# make bazel-release -endef -bazel-release: - @echo "$$BAZEL_BUILD_HELP_INFO" -else -bazel-release: - bazel build //build/release-tars -endif diff --git a/Makefile b/Makefile new file mode 120000 index 0000000000000..613e083f0bfae --- /dev/null +++ b/Makefile @@ -0,0 +1 @@ +build/root/Makefile \ No newline at end of file diff --git a/Makefile.generated_files b/Makefile.generated_files deleted file mode 100644 index 45287dc22fb10..0000000000000 --- a/Makefile.generated_files +++ /dev/null @@ -1,745 +0,0 @@ -# Copyright 2016 The Kubernetes Authors. -# -# 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. - -# Don't allow users to call this directly. There are too many variables this -# assumes to inherit from the main Makefile. This is not a user-facing file. -ifeq ($(CALLED_FROM_MAIN_MAKEFILE),) - $(error Please use the main Makefile, e.g. `make generated_files`) -endif - -# Don't allow an implicit 'all' rule. This is not a user-facing file. -ifeq ($(MAKECMDGOALS),) - $(error This Makefile requires an explicit rule to be specified) -endif - -ifeq ($(DBG_MAKEFILE),1) - $(warning ***** starting Makefile.generated_files for goal(s) "$(MAKECMDGOALS)") - $(warning ***** $(shell date)) -endif - - -# It's necessary to set this because some environments don't link sh -> bash. -SHELL := /bin/bash - -# This rule collects all the generated file sets into a single rule. Other -# rules should depend on this to ensure generated files are rebuilt. -.PHONY: generated_files -generated_files: gen_deepcopy gen_defaulter gen_conversion gen_openapi - -.PHONY: verify_generated_files -verify_generated_files: verify_gen_deepcopy \ - verify_gen_defaulter \ - verify_gen_conversion - -# Code-generation logic. -# -# This stuff can be pretty tricky, and there's probably some corner cases that -# we don't handle well. That said, here's a straightforward test to prove that -# the most common cases work. Sadly, it is manual. -# -# make clean -# find . -name .make\* | xargs rm -f -# find . -name zz_generated\* | xargs rm -f -# # verify `find . -name zz_generated.deepcopy.go | wc -l` is 0 -# # verify `find . -name .make | wc -l` is 0 -# -# make nonexistent -# # expect "No rule to make target" -# # verify `find .make/ -type f | wc -l` has many files -# -# make gen_deepcopy -# # expect deepcopy-gen is built exactly once -# # expect many files to be regenerated -# # verify `find . -name zz_generated.deepcopy.go | wc -l` has files -# make gen_deepcopy -# # expect nothing to be rebuilt, finish in O(seconds) -# touch pkg/api/types.go -# make gen_deepcopy -# # expect one file to be regenerated -# make gen_deepcopy -# # expect nothing to be rebuilt, finish in O(seconds) -# touch cmd/libs/go2idl/deepcopy-gen/main.go -# make gen_deepcopy -# # expect deepcopy-gen is built exactly once -# # expect many files to be regenerated -# # verify `find . -name zz_generated.deepcopy.go | wc -l` has files -# make gen_deepcopy -# # expect nothing to be rebuilt, finish in O(seconds) -# -# make gen_conversion -# # expect conversion-gen is built exactly once -# # expect many files to be regenerated -# # verify `find . -name zz_generated.conversion.go | wc -l` has files -# make gen_conversion -# # expect nothing to be rebuilt, finish in O(seconds) -# touch pkg/api/types.go -# make gen_conversion -# # expect one file to be regenerated -# make gen_conversion -# # expect nothing to be rebuilt, finish in O(seconds) -# touch cmd/libs/go2idl/conversion-gen/main.go -# make gen_conversion -# # expect conversion-gen is built exactly once -# # expect many files to be regenerated -# # verify `find . -name zz_generated.conversion.go | wc -l` has files -# make gen_conversion -# # expect nothing to be rebuilt, finish in O(seconds) -# -# make all -# # expect it to build -# -# make test -# # expect it to pass -# -# make clean -# # verify `find . -name zz_generated.deepcopy.go | wc -l` is 0 -# # verify `find . -name .make | wc -l` is 0 -# -# make all WHAT=cmd/kube-proxy -# # expect it to build -# -# make clean -# make test WHAT=cmd/kube-proxy -# # expect it to pass - -# This variable holds a list of every directory that contains Go files in this -# project. Other rules and variables can use this as a starting point to -# reduce filesystem accesses. -ifeq ($(DBG_MAKEFILE),1) - $(warning ***** finding all *.go dirs) -endif -ALL_GO_DIRS := $(shell \ - hack/make-rules/helpers/cache_go_dirs.sh $(META_DIR)/all_go_dirs.mk \ -) - -# The name of the metadata file which lists *.go files in each pkg. -GOFILES_META := gofiles.mk - -# Establish a dependency between the deps file and the dir. Whenever a dir -# changes (files added or removed) the deps file will be considered stale. -# -# The variable value was set in $(GOFILES_META) and included as part of the -# dependency management logic. -# -# This is looser than we really need (e.g. we don't really care about non *.go -# files or even *_test.go files), but this is much easier to represent. -# -# Because we 'sinclude' the deps file, it is considered for rebuilding, as part -# of make's normal evaluation. If it gets rebuilt, make will restart. -# -# The '$(eval)' is needed because this has a different RHS for each LHS, and -# would otherwise produce results that make can't parse. -$(foreach dir, $(ALL_GO_DIRS), $(eval \ - $(META_DIR)/$(dir)/$(GOFILES_META): $(dir) \ -)) - -# How to rebuild a deps file. When make determines that the deps file is stale -# (see above), it executes this rule, and then re-loads the deps file. -# -# This is looser than we really need (e.g. we don't really care about test -# files), but this is MUCH faster than calling `go list`. -# -# We regenerate the output file in order to satisfy make's "newer than" rules, -# but we only need to rebuild targets if the contents actually changed. That -# is what the .stamp file represents. -$(foreach dir, $(ALL_GO_DIRS), \ - $(META_DIR)/$(dir)/$(GOFILES_META)): - FILES=$$(ls $$@.tmp; \ - cmp -s $@.tmp $@ || touch $@.stamp; \ - mv $@.tmp $@ -# This is required to fill in the DAG, since some cases (e.g. 'make clean all') -# will reference the .stamp file when it doesn't exist. We don't need to -# rebuild it in that case, just keep make happy. -$(foreach dir, $(ALL_GO_DIRS), \ - $(META_DIR)/$(dir)/$(GOFILES_META).stamp): - -# Include any deps files as additional Makefile rules. This triggers make to -# consider the deps files for rebuild, which makes the whole -# dependency-management logic work. 'sinclude' is "silent include" which does -# not fail if the file does not exist. -$(foreach dir, $(ALL_GO_DIRS), $(eval \ - sinclude $(META_DIR)/$(dir)/$(GOFILES_META) \ -)) - -# Generate a list of all files that have a `+k8s:` comment-tag. This will be -# used to derive lists of files/dirs for generation tools. -ifeq ($(DBG_MAKEFILE),1) - $(warning ***** finding all +k8s: tags) -endif -ALL_K8S_TAG_FILES := $(shell \ - find $(ALL_GO_DIRS) -maxdepth 1 -type f -name \*.go \ - | xargs grep --color=never -l '^// *+k8s:' \ -) - -# -# Deep-copy generation -# -# Any package that wants deep-copy functions generated must include a -# comment-tag in column 0 of one file of the form: -# // +k8s:deepcopy-gen= -# -# The may be one of: -# generate: generate deep-copy functions into the package -# register: generate deep-copy functions and register them with a -# scheme - -# The result file, in each pkg, of deep-copy generation. -DEEPCOPY_BASENAME := $(GENERATED_FILE_PREFIX)deepcopy -DEEPCOPY_FILENAME := $(DEEPCOPY_BASENAME).go - -# The tool used to generate deep copies. -DEEPCOPY_GEN := $(BIN_DIR)/deepcopy-gen - -# Find all the directories that request deep-copy generation. -ifeq ($(DBG_MAKEFILE),1) - $(warning ***** finding all +k8s:deepcopy-gen tags) -endif -DEEPCOPY_DIRS := $(shell \ - grep --color=never -l '+k8s:deepcopy-gen=' $(ALL_K8S_TAG_FILES) \ - | xargs -n1 dirname \ - | LC_ALL=C sort -u \ -) -DEEPCOPY_FILES := $(addsuffix /$(DEEPCOPY_FILENAME), $(DEEPCOPY_DIRS)) - -# Shell function for reuse in rules. -RUN_GEN_DEEPCOPY = \ - function run_gen_deepcopy() { \ - if [[ -f $(META_DIR)/$(DEEPCOPY_GEN).todo ]]; then \ - ./hack/run-in-gopath.sh $(DEEPCOPY_GEN) \ - --v $(KUBE_VERBOSE) \ - --logtostderr \ - -i $$(cat $(META_DIR)/$(DEEPCOPY_GEN).todo | paste -sd, -) \ - --bounding-dirs $(PRJ_SRC_PATH) \ - -O $(DEEPCOPY_BASENAME) \ - "$$@"; \ - fi \ - }; \ - run_gen_deepcopy - -# This rule aggregates the set of files to generate and then generates them all -# in a single run of the tool. -.PHONY: gen_deepcopy -gen_deepcopy: $(DEEPCOPY_FILES) $(DEEPCOPY_GEN) - $(RUN_GEN_DEEPCOPY) - -.PHONY: verify_gen_deepcopy -verify_gen_deepcopy: $(DEEPCOPY_GEN) - $(RUN_GEN_DEEPCOPY) --verify-only - -# For each dir in DEEPCOPY_DIRS, this establishes a dependency between the -# output file and the input files that should trigger a rebuild. -# -# Note that this is a deps-only statement, not a full rule (see below). This -# has to be done in a distinct step because wildcards don't work in static -# pattern rules. -# -# The '$(eval)' is needed because this has a different RHS for each LHS, and -# would otherwise produce results that make can't parse. -# -# We depend on the $(GOFILES_META).stamp to detect when the set of input files -# has changed. This allows us to detect deleted input files. -$(foreach dir, $(DEEPCOPY_DIRS), $(eval \ - $(dir)/$(DEEPCOPY_FILENAME): $(META_DIR)/$(dir)/$(GOFILES_META).stamp \ - $(gofiles__$(dir)) \ -)) - -# Unilaterally remove any leftovers from previous runs. -$(shell rm -f $(META_DIR)/$(DEEPCOPY_GEN)*.todo) - -# How to regenerate deep-copy code. This is a little slow to run, so we batch -# it up and trigger the batch from the 'generated_files' target. -$(DEEPCOPY_FILES): $(DEEPCOPY_GEN) - mkdir -p $$(dirname $(META_DIR)/$(DEEPCOPY_GEN)) - echo $(PRJ_SRC_PATH)/$(@D) >> $(META_DIR)/$(DEEPCOPY_GEN).todo - -# This calculates the dependencies for the generator tool, so we only rebuild -# it when needed. It is PHONY so that it always runs, but it only updates the -# file if the contents have actually changed. We 'sinclude' this later. -.PHONY: $(META_DIR)/$(DEEPCOPY_GEN).mk -$(META_DIR)/$(DEEPCOPY_GEN).mk: - mkdir -p $(@D); \ - (echo -n "$(DEEPCOPY_GEN): "; \ - ./hack/run-in-gopath.sh go list \ - -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ - ./cmd/libs/go2idl/deepcopy-gen \ - | grep --color=never "^$(PRJ_SRC_PATH)/" \ - | xargs ./hack/run-in-gopath.sh go list \ - -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ - | paste -sd' ' - \ - | sed 's/ / \\=,/g' \ - | tr '=,' '\n\t' \ - | sed "s|$$(pwd -P)/||"; \ - ) > $@.tmp; \ - cmp -s $@.tmp $@ || cat $@.tmp > $@ && rm -f $@.tmp - -# Include dependency info for the generator tool. This will cause the rule of -# the same name to be considered and if it is updated, make will restart. -sinclude $(META_DIR)/$(DEEPCOPY_GEN).mk - -# How to build the generator tool. The deps for this are defined in -# the $(DEEPCOPY_GEN).mk, above. -# -# A word on the need to touch: This rule might trigger if, for example, a -# non-Go file was added or deleted from a directory on which this depends. -# This target needs to be reconsidered, but Go realizes it doesn't actually -# have to be rebuilt. In that case, make will forever see the dependency as -# newer than the binary, and try to rebuild it over and over. So we touch it, -# and make is happy. -$(DEEPCOPY_GEN): - hack/make-rules/build.sh cmd/libs/go2idl/deepcopy-gen - touch $@ - -# -# Defaulter generation -# -# Any package that wants defaulter functions generated must include a -# comment-tag in column 0 of one file of the form: -# // +k8s:defaulter-gen= -# -# The depends on context: -# on types: -# true: always generate a defaulter for this type -# false: never generate a defaulter for this type -# on functions: -# covers: if the function name matches SetDefault_NAME, instructs -# the generator not to recurse -# on packages: -# FIELDNAME: any object with a field of this name is a candidate -# for having a defaulter generated - -# The result file, in each pkg, of defaulter generation. -DEFAULTER_BASENAME := $(GENERATED_FILE_PREFIX)defaults -DEFAULTER_FILENAME := $(DEFAULTER_BASENAME).go - -# The tool used to generate defaulters. -DEFAULTER_GEN := $(BIN_DIR)/defaulter-gen - -# All directories that request any form of defaulter generation. -ifeq ($(DBG_MAKEFILE),1) - $(warning ***** finding all +k8s:defaulter-gen tags) -endif -DEFAULTER_DIRS := $(shell \ - grep --color=never -l '+k8s:defaulter-gen=' $(ALL_K8S_TAG_FILES) \ - | xargs -n1 dirname \ - | LC_ALL=C sort -u \ -) - -DEFAULTER_FILES := $(addsuffix /$(DEFAULTER_FILENAME), $(DEFAULTER_DIRS)) - -RUN_GEN_DEFAULTER := \ - function run_gen_defaulter() { \ - if [[ -f $(META_DIR)/$(DEFAULTER_GEN).todo ]]; then \ - ./hack/run-in-gopath.sh $(DEFAULTER_GEN) \ - --v $(KUBE_VERBOSE) \ - --logtostderr \ - -i $$(cat $(META_DIR)/$(DEFAULTER_GEN).todo | paste -sd, -) \ - --extra-peer-dirs $$(echo $(addprefix $(PRJ_SRC_PATH)/, $(DEFAULTER_DIRS)) | sed 's/ /,/g') \ - -O $(DEFAULTER_BASENAME) \ - "$$@"; \ - fi \ - }; \ - run_gen_defaulter - -# This rule aggregates the set of files to generate and then generates them all -# in a single run of the tool. -.PHONY: gen_defaulter -gen_defaulter: $(DEFAULTER_FILES) $(DEFAULTER_GEN) - $(RUN_GEN_DEFAULTER) - -.PHONY: verify_gen_deepcopy -verify_gen_defaulter: $(DEFAULTER_GEN) - $(RUN_GEN_DEFAULTER) --verify-only - -# For each dir in DEFAULTER_DIRS, this establishes a dependency between the -# output file and the input files that should trigger a rebuild. -# -# The variable value was set in $(GOFILES_META) and included as part of the -# dependency management logic. -# -# Note that this is a deps-only statement, not a full rule (see below). This -# has to be done in a distinct step because wildcards don't work in static -# pattern rules. -# -# The '$(eval)' is needed because this has a different RHS for each LHS, and -# would otherwise produce results that make can't parse. -# -# We depend on the $(GOFILES_META).stamp to detect when the set of input files -# has changed. This allows us to detect deleted input files. -$(foreach dir, $(DEFAULTER_DIRS), $(eval \ - $(dir)/$(DEFAULTER_FILENAME): $(META_DIR)/$(dir)/$(GOFILES_META).stamp \ - $(gofiles__$(dir)) \ -)) - -# For each dir in DEFAULTER_DIRS, for each target in $(defaulters__$(dir)), -# this establishes a dependency between the output file and the input files -# that should trigger a rebuild. -# -# The variable value was set in $(GOFILES_META) and included as part of the -# dependency management logic. -# -# Note that this is a deps-only statement, not a full rule (see below). This -# has to be done in a distinct step because wildcards don't work in static -# pattern rules. -# -# The '$(eval)' is needed because this has a different RHS for each LHS, and -# would otherwise produce results that make can't parse. -# -# We depend on the $(GOFILES_META).stamp to detect when the set of input files -# has changed. This allows us to detect deleted input files. -$(foreach dir, $(DEFAULTER_DIRS), \ - $(foreach tgt, $(defaulters__$(dir)), $(eval \ - $(dir)/$(DEFAULTER_FILENAME): $(META_DIR)/$(tgt)/$(GOFILES_META).stamp \ - $(gofiles__$(tgt)) \ - )) \ -) - -# Unilaterally remove any leftovers from previous runs. -$(shell rm -f $(META_DIR)/$(DEFAULTER_GEN)*.todo) - -# How to regenerate defaulter code. This is a little slow to run, so we batch -# it up and trigger the batch from the 'generated_files' target. -$(DEFAULTER_FILES): $(DEFAULTER_GEN) - mkdir -p $$(dirname $(META_DIR)/$(DEFAULTER_GEN)) - echo $(PRJ_SRC_PATH)/$(@D) >> $(META_DIR)/$(DEFAULTER_GEN).todo - -# This calculates the dependencies for the generator tool, so we only rebuild -# it when needed. It is PHONY so that it always runs, but it only updates the -# file if the contents have actually changed. We 'sinclude' this later. -.PHONY: $(META_DIR)/$(DEFAULTER_GEN).mk -$(META_DIR)/$(DEFAULTER_GEN).mk: - mkdir -p $(@D); \ - (echo -n "$(DEFAULTER_GEN): "; \ - ./hack/run-in-gopath.sh go list \ - -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ - ./cmd/libs/go2idl/defaulter-gen \ - | grep --color=never "^$(PRJ_SRC_PATH)/" \ - | xargs ./hack/run-in-gopath.sh go list \ - -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ - | paste -sd' ' - \ - | sed 's/ / \\=,/g' \ - | tr '=,' '\n\t' \ - | sed "s|$$(pwd -P)/||"; \ - ) > $@.tmp; \ - cmp -s $@.tmp $@ || cat $@.tmp > $@ && rm -f $@.tmp - -# Include dependency info for the generator tool. This will cause the rule of -# the same name to be considered and if it is updated, make will restart. -sinclude $(META_DIR)/$(DEFAULTER_GEN).mk - -# How to build the generator tool. The deps for this are defined in -# the $(DEFAULTER_GEN).mk, above. -# -# A word on the need to touch: This rule might trigger if, for example, a -# non-Go file was added or deleted from a directory on which this depends. -# This target needs to be reconsidered, but Go realizes it doesn't actually -# have to be rebuilt. In that case, make will forever see the dependency as -# newer than the binary, and try to rebuild it over and over. So we touch it, -# and make is happy. -$(DEFAULTER_GEN): - hack/make-rules/build.sh cmd/libs/go2idl/defaulter-gen - touch $@ - -# -# Open-api generation -# -# Any package that wants open-api functions generated must include a -# comment-tag in column 0 of one file of the form: -# // +k8s:openapi-gen=true -# -# The result file, in each pkg, of open-api generation. -OPENAPI_BASENAME := $(GENERATED_FILE_PREFIX)openapi -OPENAPI_FILENAME := $(OPENAPI_BASENAME).go -OPENAPI_OUTPUT_PKG := pkg/generated/openapi - -# The tool used to generate open apis. -OPENAPI_GEN := $(BIN_DIR)/openapi-gen - -# Find all the directories that request open-api generation. -ifeq ($(DBG_MAKEFILE),1) - $(warning ***** finding all +k8s:openapi-gen tags) -endif -OPENAPI_DIRS := $(shell \ - grep --color=never -l '+k8s:openapi-gen=' $(ALL_K8S_TAG_FILES) \ - | xargs -n1 dirname \ - | LC_ALL=C sort -u \ -) - -OPENAPI_OUTFILE := $(OPENAPI_OUTPUT_PKG)/$(OPENAPI_FILENAME) - -# This rule is the user-friendly entrypoint for openapi generation. -.PHONY: gen_openapi -gen_openapi: $(OPENAPI_OUTFILE) $(OPENAPI_GEN) - -# For each dir in OPENAPI_DIRS, this establishes a dependency between the -# output file and the input files that should trigger a rebuild. -# -# Note that this is a deps-only statement, not a full rule (see below). This -# has to be done in a distinct step because wildcards don't work in static -# pattern rules. -# -# The '$(eval)' is needed because this has a different RHS for each LHS, and -# would otherwise produce results that make can't parse. -# -# We depend on the $(GOFILES_META).stamp to detect when the set of input files -# has changed. This allows us to detect deleted input files. -$(foreach dir, $(OPENAPI_DIRS), $(eval \ - $(OPENAPI_OUTFILE): $(META_DIR)/$(dir)/$(GOFILES_META).stamp \ - $(gofiles__$(dir)) \ -)) - -# How to regenerate open-api code. This emits a single file for all results. -$(OPENAPI_OUTFILE): $(OPENAPI_GEN) $(OPENAPI_GEN) - function run_gen_openapi() { \ - ./hack/run-in-gopath.sh $(OPENAPI_GEN) \ - --v $(KUBE_VERBOSE) \ - --logtostderr \ - -i $$(echo $(addprefix $(PRJ_SRC_PATH)/, $(OPENAPI_DIRS)) | sed 's/ /,/g') \ - -p $(PRJ_SRC_PATH)/$(OPENAPI_OUTPUT_PKG) \ - -O $(OPENAPI_BASENAME) \ - "$$@"; \ - }; \ - run_gen_openapi - -# This calculates the dependencies for the generator tool, so we only rebuild -# it when needed. It is PHONY so that it always runs, but it only updates the -# file if the contents have actually changed. We 'sinclude' this later. -.PHONY: $(META_DIR)/$(OPENAPI_GEN).mk -$(META_DIR)/$(OPENAPI_GEN).mk: - mkdir -p $(@D); \ - (echo -n "$(OPENAPI_GEN): "; \ - ./hack/run-in-gopath.sh go list \ - -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ - ./cmd/libs/go2idl/openapi-gen \ - | grep --color=never "^$(PRJ_SRC_PATH)/" \ - | xargs ./hack/run-in-gopath.sh go list \ - -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ - | paste -sd' ' - \ - | sed 's/ / \\=,/g' \ - | tr '=,' '\n\t' \ - | sed "s|$$(pwd -P)/||"; \ - ) > $@.tmp; \ - cmp -s $@.tmp $@ || cat $@.tmp > $@ && rm -f $@.tmp - -# Include dependency info for the generator tool. This will cause the rule of -# the same name to be considered and if it is updated, make will restart. -sinclude $(META_DIR)/$(OPENAPI_GEN).mk - -# How to build the generator tool. The deps for this are defined in -# the $(OPENAPI_GEN).mk, above. -# -# A word on the need to touch: This rule might trigger if, for example, a -# non-Go file was added or deleted from a directory on which this depends. -# This target needs to be reconsidered, but Go realizes it doesn't actually -# have to be rebuilt. In that case, make will forever see the dependency as -# newer than the binary, and try to rebuild it over and over. So we touch it, -# and make is happy. -$(OPENAPI_GEN): - hack/make-rules/build.sh cmd/libs/go2idl/openapi-gen - touch $@ - -# -# Conversion generation -# -# Any package that wants conversion functions generated must include one or -# more comment-tags in any .go file, in column 0, of the form: -# // +k8s:conversion-gen= -# -# The CONVERSION_TARGET_DIR is a project-local path to another directory which -# should be considered when evaluating peer types for conversions. Types which -# are found in the source package (where conversions are being generated) -# but do not have a peer in one of the target directories will not have -# conversions generated. -# -# TODO: it might be better in the long term to make peer-types explicit in the -# IDL. - -# The result file, in each pkg, of conversion generation. -CONVERSION_BASENAME := $(GENERATED_FILE_PREFIX)conversion -CONVERSION_FILENAME := $(CONVERSION_BASENAME).go - -# The tool used to generate conversions. -CONVERSION_GEN := $(BIN_DIR)/conversion-gen - -# The name of the metadata file listing conversion peers for each pkg. -CONVERSIONS_META := conversions.mk - -# All directories that request any form of conversion generation. -ifeq ($(DBG_MAKEFILE),1) - $(warning ***** finding all +k8s:conversion-gen tags) -endif -CONVERSION_DIRS := $(shell \ - grep --color=never '^// *+k8s:conversion-gen=' $(ALL_K8S_TAG_FILES) \ - | cut -f1 -d: \ - | xargs -n1 dirname \ - | LC_ALL=C sort -u \ -) - -CONVERSION_FILES := $(addsuffix /$(CONVERSION_FILENAME), $(CONVERSION_DIRS)) - -# Shell function for reuse in rules. -RUN_GEN_CONVERSION = \ - function run_gen_conversion() { \ - if [[ -f $(META_DIR)/$(CONVERSION_GEN).todo ]]; then \ - ./hack/run-in-gopath.sh $(CONVERSION_GEN) \ - --v $(KUBE_VERBOSE) \ - --logtostderr \ - -i $$(cat $(META_DIR)/$(CONVERSION_GEN).todo | paste -sd, -) \ - -O $(CONVERSION_BASENAME) \ - "$$@"; \ - fi \ - }; \ - run_gen_conversion - -# This rule aggregates the set of files to generate and then generates them all -# in a single run of the tool. -.PHONY: gen_conversion -gen_conversion: $(CONVERSION_FILES) $(CONVERSION_GEN) - $(RUN_GEN_CONVERSION) - -.PHONY: verify_gen_conversion -verify_gen_conversion: $(CONVERSION_GEN) - $(RUN_GEN_CONVERSION) --verify-only - -# Establish a dependency between the deps file and the dir. Whenever a dir -# changes (files added or removed) the deps file will be considered stale. -# -# This is looser than we really need (e.g. we don't really care about non *.go -# files or even *_test.go files), but this is much easier to represent. -# -# Because we 'sinclude' the deps file, it is considered for rebuilding, as part -# of make's normal evaluation. If it gets rebuilt, make will restart. -# -# The '$(eval)' is needed because this has a different RHS for each LHS, and -# would otherwise produce results that make can't parse. -$(foreach dir, $(CONVERSION_DIRS), $(eval \ - $(META_DIR)/$(dir)/$(CONVERSIONS_META): $(dir) \ -)) - -# How to rebuild a deps file. When make determines that the deps file is stale -# (see above), it executes this rule, and then re-loads the deps file. -# -# This is looser than we really need (e.g. we don't really care about test -# files), but this is MUCH faster than calling `go list`. -# -# We regenerate the output file in order to satisfy make's "newer than" rules, -# but we only need to rebuild targets if the contents actually changed. That -# is what the .stamp file represents. -$(foreach dir, $(CONVERSION_DIRS), \ - $(META_DIR)/$(dir)/$(CONVERSIONS_META)): - TAGS=$$(grep --color=never -h '^// *+k8s:conversion-gen=' $$@.tmp; \ - cmp -s $@.tmp $@ || touch $@.stamp; \ - mv $@.tmp $@ - -# Include any deps files as additional Makefile rules. This triggers make to -# consider the deps files for rebuild, which makes the whole -# dependency-management logic work. 'sinclude' is "silent include" which does -# not fail if the file does not exist. -$(foreach dir, $(CONVERSION_DIRS), $(eval \ - sinclude $(META_DIR)/$(dir)/$(CONVERSIONS_META) \ -)) - -# For each dir in CONVERSION_DIRS, this establishes a dependency between the -# output file and the input files that should trigger a rebuild. -# -# The variable value was set in $(GOFILES_META) and included as part of the -# dependency management logic. -# -# Note that this is a deps-only statement, not a full rule (see below). This -# has to be done in a distinct step because wildcards don't work in static -# pattern rules. -# -# The '$(eval)' is needed because this has a different RHS for each LHS, and -# would otherwise produce results that make can't parse. -# -# We depend on the $(GOFILES_META).stamp to detect when the set of input files -# has changed. This allows us to detect deleted input files. -$(foreach dir, $(CONVERSION_DIRS), $(eval \ - $(dir)/$(CONVERSION_FILENAME): $(META_DIR)/$(dir)/$(GOFILES_META).stamp \ - $(gofiles__$(dir)) \ -)) - -# For each dir in CONVERSION_DIRS, for each target in $(conversions__$(dir)), -# this establishes a dependency between the output file and the input files -# that should trigger a rebuild. -# -# The variable value was set in $(GOFILES_META) and included as part of the -# dependency management logic. -# -# Note that this is a deps-only statement, not a full rule (see below). This -# has to be done in a distinct step because wildcards don't work in static -# pattern rules. -# -# The '$(eval)' is needed because this has a different RHS for each LHS, and -# would otherwise produce results that make can't parse. -# -# We depend on the $(GOFILES_META).stamp to detect when the set of input files -# has changed. This allows us to detect deleted input files. -$(foreach dir, $(CONVERSION_DIRS), \ - $(foreach tgt, $(conversions__$(dir)), $(eval \ - $(dir)/$(CONVERSION_FILENAME): $(META_DIR)/$(tgt)/$(GOFILES_META).stamp \ - $(gofiles__$(tgt)) \ - )) \ -) - -# Unilaterally remove any leftovers from previous runs. -$(shell rm -f $(META_DIR)/$(CONVERSION_GEN)*.todo) - -# How to regenerate conversion code. This is a little slow to run, so we batch -# it up and trigger the batch from the 'generated_files' target. -$(CONVERSION_FILES): $(CONVERSION_GEN) - mkdir -p $$(dirname $(META_DIR)/$(CONVERSION_GEN)) - echo $(PRJ_SRC_PATH)/$(@D) >> $(META_DIR)/$(CONVERSION_GEN).todo - -# This calculates the dependencies for the generator tool, so we only rebuild -# it when needed. It is PHONY so that it always runs, but it only updates the -# file if the contents have actually changed. We 'sinclude' this later. -.PHONY: $(META_DIR)/$(CONVERSION_GEN).mk -$(META_DIR)/$(CONVERSION_GEN).mk: - mkdir -p $(@D); \ - (echo -n "$(CONVERSION_GEN): "; \ - ./hack/run-in-gopath.sh go list \ - -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ - ./cmd/libs/go2idl/conversion-gen \ - | grep --color=never "^$(PRJ_SRC_PATH)/" \ - | xargs ./hack/run-in-gopath.sh go list \ - -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ - | paste -sd' ' - \ - | sed 's/ / \\=,/g' \ - | tr '=,' '\n\t' \ - | sed "s|$$(pwd -P)/||"; \ - ) > $@.tmp; \ - cmp -s $@.tmp $@ || cat $@.tmp > $@ && rm -f $@.tmp - -# Include dependency info for the generator tool. This will cause the rule of -# the same name to be considered and if it is updated, make will restart. -sinclude $(META_DIR)/$(CONVERSION_GEN).mk - -# How to build the generator tool. The deps for this are defined in -# the $(CONVERSION_GEN).mk, above. -# -# A word on the need to touch: This rule might trigger if, for example, a -# non-Go file was added or deleted from a directory on which this depends. -# This target needs to be reconsidered, but Go realizes it doesn't actually -# have to be rebuilt. In that case, make will forever see the dependency as -# newer than the binary, and try to rebuild it over and over. So we touch it, -# and make is happy. -$(CONVERSION_GEN): - hack/make-rules/build.sh cmd/libs/go2idl/conversion-gen - touch $@ diff --git a/Makefile.generated_files b/Makefile.generated_files new file mode 120000 index 0000000000000..31d7e4ec6b2d7 --- /dev/null +++ b/Makefile.generated_files @@ -0,0 +1 @@ +build/root/Makefile.generated_files \ No newline at end of file diff --git a/WORKSPACE b/WORKSPACE deleted file mode 100644 index fe0c36382ce3e..0000000000000 --- a/WORKSPACE +++ /dev/null @@ -1,91 +0,0 @@ -http_archive( - name = "io_bazel_rules_go", - sha256 = "a1cae429e9d591017421150e3173478c46c693bc594322c7fa7e6cb5f672ef59", - strip_prefix = "rules_go-805fd1566500997379806373feb05e138a4dfe28", - urls = ["https://github.com/bazelbuild/rules_go/archive/805fd1566500997379806373feb05e138a4dfe28.tar.gz"], -) - -http_archive( - name = "io_kubernetes_build", - sha256 = "8d1cff71523565996903076cec6cad8424afa6eb93a342d0d810a55c911e23c7", - strip_prefix = "repo-infra-61b7247ebf472398bdea148d8f67e3a1849d6de9", - urls = ["https://github.com/kubernetes/repo-infra/archive/61b7247ebf472398bdea148d8f67e3a1849d6de9.tar.gz"], -) - -# This contains a patch to not prepend ./ to tarfiles produced by pkg_tar. -# When merged upstream, we'll no longer need to use ixdy's fork: -# https://bazel-review.googlesource.com/#/c/10390/ -http_archive( - name = "io_bazel", - sha256 = "667d32da016b1e2f63cf345cd3583989ec4a165034df383a01996d93635753a0", - strip_prefix = "bazel-df2c687c22bdd7c76f3cdcc85f38fefd02f0b844", - urls = ["https://github.com/ixdy/bazel/archive/df2c687c22bdd7c76f3cdcc85f38fefd02f0b844.tar.gz"], -) - -http_archive( - name = "io_bazel_rules_docker", - sha256 = "261fbd8fda1d06a12a0479019b46acd302c6aaa8df8e49383dc37917f20492a1", - strip_prefix = "rules_docker-52d9faf209ff6d16eb850b6b66d03483735e0633", - urls = ["https://github.com/bazelbuild/rules_docker/archive/52d9faf209ff6d16eb850b6b66d03483735e0633.tar.gz"], -) - -load("@io_bazel_rules_go//go:def.bzl", "go_repositories") -load("@io_bazel_rules_docker//docker:docker.bzl", "docker_repositories") - -go_repositories( - go_version = "1.8.1", -) - -docker_repositories() - -# for building docker base images -debs = ( - ( - "busybox_deb", - "5f81f140777454e71b9e5bfdce9c89993de5ddf4a7295ea1cfda364f8f630947", - "http://ftp.us.debian.org/debian/pool/main/b/busybox/busybox-static_1.22.0-19+b3_amd64.deb", - "https://storage.googleapis.com/kubernetes-release/debs/busybox-static_1.22.0-19+b3_amd64.deb", - ), - ( - "libc_deb", - "372aac4a9ce9dbb26a08de0b9c41b0500ba019430295d29f39566483f5f32732", - "http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.24-10_amd64.deb", - "https://storage.googleapis.com/kubernetes-release/debs/libc6_2.24-10_amd64.deb", - ), - ( - "iptables_deb", - "7747388a97ba71fede302d70361c81d486770a2024185514c18b5d8eab6aaf4e", - "http://ftp.us.debian.org/debian/pool/main/i/iptables/iptables_1.4.21-2+b1_amd64.deb", - "https://storage.googleapis.com/kubernetes-release/debs/iptables_1.4.21-2+b1_amd64.deb", - ), - ( - "libnetlink_deb", - "5d486022cd9e047e9afbb1617cf4519c0decfc3d2c1fad7e7fe5604943dbbf37", - "http://ftp.us.debian.org/debian/pool/main/libn/libnfnetlink/libnfnetlink0_1.0.1-3_amd64.deb", - "https://storage.googleapis.com/kubernetes-release/debs/libnfnetlink0_1.0.1-3_amd64.deb", - ), - ( - "libxtables_deb", - "6783f316af4cbf3ada8b9a2b7bb5f53a87c0c2575c1903ce371fdbd45d3626c6", - "http://ftp.us.debian.org/debian/pool/main/i/iptables/libxtables10_1.4.21-2+b1_amd64.deb", - "https://storage.googleapis.com/kubernetes-release/debs/libxtables10_1.4.21-2+b1_amd64.deb", - ), - ( - "iproute2_deb", - "3ce9cb1d03a2a1359cbdd4f863b15d0c906096bf713e8eb688149da2f4e350bc", - "http://ftp.us.debian.org/debian/pool/main/i/iproute2/iproute_3.16.0-2_all.deb", - "https://storage.googleapis.com/kubernetes-release/debs/iproute_3.16.0-2_all.deb", - ), -) - -[http_file( - name = name, - sha256 = sha256, - url = url, -) for name, sha256, origin, url in debs] - -http_file( - name = "kubernetes_cni", - sha256 = "05ab3937bc68562e989dc143362ec4d4275262ba9f359338aed720fc914457a5", - url = "https://storage.googleapis.com/kubernetes-release/network-plugins/cni-amd64-0799f5732f2a11b329d9e3d51b9c8f2e3759f2ff.tar.gz", -) diff --git a/WORKSPACE b/WORKSPACE new file mode 120000 index 0000000000000..7e8131a549fa7 --- /dev/null +++ b/WORKSPACE @@ -0,0 +1 @@ +build/root/WORKSPACE \ No newline at end of file diff --git a/build/root/.bazelrc b/build/root/.bazelrc new file mode 100644 index 0000000000000..ab5db1d2dc3a0 --- /dev/null +++ b/build/root/.bazelrc @@ -0,0 +1,6 @@ +# Show us information about failures. +build --verbose_failures +test --test_output=errors + +# Include git version info +build --workspace_status_command hack/print-workspace-status.sh diff --git a/build/root/BUILD.root b/build/root/BUILD.root new file mode 100644 index 0000000000000..b4903fb5a53ed --- /dev/null +++ b/build/root/BUILD.root @@ -0,0 +1,85 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load("@io_bazel_rules_go//go:def.bzl", "go_prefix") +load("@io_kubernetes_build//defs:build.bzl", "gcs_upload") + +go_prefix("k8s.io/kubernetes") + +filegroup( + name = "_binary-artifacts-and-hashes", + srcs = [ + "//build:client-targets-and-hashes", + "//build:docker-artifacts-and-hashes", + "//build:node-targets-and-hashes", + "//build:server-targets-and-hashes", + "//build/debs:debs-and-hashes", + ], + visibility = ["//visibility:private"], +) + +gcs_upload( + name = "push-build", + data = [ + ":_binary-artifacts-and-hashes", + "//build/release-tars:release-tars-and-hashes", + "//cluster/gce:gcs-release-artifacts-and-hashes", + ], + upload_paths = { + "//:_binary-artifacts-and-hashes": "bin/linux/amd64", + "//build/release-tars:release-tars-and-hashes": "", + "//cluster/gce:gcs-release-artifacts-and-hashes": "extra/gce", + }, +) + +# TODO: remove this alias after 2017-05-22 +alias( + name = "ci-artifacts", + actual = "push-build", + deprecation = "This rule will be removed after 2017-05-22. Use //:push-build instead.", +) + +filegroup( + name = "package-srcs", + srcs = glob( + ["**"], + exclude = [ + "bazel-*/**", + "_*/**", + ".config/**", + ".git/**", + ".gsutil/**", + ".make/**", + ], + ), + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//api:all-srcs", + "//build:all-srcs", + "//cluster:all-srcs", + "//cmd:all-srcs", + "//docs:all-srcs", + "//examples:all-srcs", + "//federation:all-srcs", + "//hack:all-srcs", + "//pkg:all-srcs", + "//plugin:all-srcs", + "//test:all-srcs", + "//third_party:all-srcs", + "//vendor:all-srcs", + ], + tags = ["automanaged"], +) + +genrule( + name = "save_git_version", + outs = ["version"], + cmd = "grep ^STABLE_BUILD_SCM_REVISION bazel-out/stable-status.txt | awk '{print $$2}' >$@", + stamp = 1, +) diff --git a/build/root/Makefile b/build/root/Makefile new file mode 100644 index 0000000000000..80efef199cd8f --- /dev/null +++ b/build/root/Makefile @@ -0,0 +1,536 @@ +# Copyright 2016 The Kubernetes Authors. +# +# 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. + +DBG_MAKEFILE ?= +ifeq ($(DBG_MAKEFILE),1) + $(warning ***** starting Makefile for goal(s) "$(MAKECMDGOALS)") + $(warning ***** $(shell date)) +else + # If we're not debugging the Makefile, don't echo recipes. + MAKEFLAGS += -s +endif + + +# Old-skool build tools. +# +# Commonly used targets (see each target for more information): +# all: Build code. +# test: Run tests. +# clean: Clean up. + +# It's necessary to set this because some environments don't link sh -> bash. +SHELL := /bin/bash + +# We don't need make's built-in rules. +MAKEFLAGS += --no-builtin-rules +.SUFFIXES: + +# Constants used throughout. +.EXPORT_ALL_VARIABLES: +OUT_DIR ?= _output +BIN_DIR := $(OUT_DIR)/bin +PRJ_SRC_PATH := k8s.io/kubernetes +GENERATED_FILE_PREFIX := zz_generated. + +# Metadata for driving the build lives here. +META_DIR := .make + +# Our build flags. +# TODO(thockin): it would be nice to just use the native flags. Can we EOL +# these "wrapper" flags? +KUBE_GOFLAGS := $(GOFLAGS) +KUBE_GOLDFLAGS := $(GOLDFLAGS) +KUBE_GOGCFLAGS = $(GOGCFLAGS) + +# Extra options for the release or quick-release options: +KUBE_RELEASE_RUN_TESTS := $(KUBE_RELEASE_RUN_TESTS) +KUBE_FASTBUILD := $(KUBE_FASTBUILD) + +# This controls the verbosity of the build. Higher numbers mean more output. +KUBE_VERBOSE ?= 1 + +define ALL_HELP_INFO +# Build code. +# +# Args: +# WHAT: Directory names to build. If any of these directories has a 'main' +# package, the build will produce executable files under $(OUT_DIR)/go/bin. +# If not specified, "everything" will be built. +# GOFLAGS: Extra flags to pass to 'go' when building. +# GOLDFLAGS: Extra linking flags passed to 'go' when building. +# GOGCFLAGS: Additional go compile flags passed to 'go' when building. +# +# Example: +# make +# make all +# make all WHAT=cmd/kubelet GOFLAGS=-v +# make all GOGCFLAGS="-N -l" +# Note: Use the -N -l options to disable compiler optimizations an inlining. +# Using these build options allows you to subsequently use source +# debugging tools like delve. +endef +.PHONY: all +ifeq ($(PRINT_HELP),y) +all: + @echo "$$ALL_HELP_INFO" +else +all: generated_files + hack/make-rules/build.sh $(WHAT) +endif + +define GINKGO_HELP_INFO +# Build ginkgo +# +# Example: +# make ginkgo +endef +.PHONY: ginkgo +ifeq ($(PRINT_HELP),y) +ginkgo: + @echo "$$GINKGO_HELP_INFO" +else +ginkgo: + hack/make-rules/build.sh vendor/github.com/onsi/ginkgo/ginkgo +endif + +define VERIFY_HELP_INFO +# Runs all the presubmission verifications. +# +# Args: +# BRANCH: Branch to be passed to verify-godeps.sh script. +# +# Example: +# make verify +# make verify BRANCH=branch_x +endef +.PHONY: verify +ifeq ($(PRINT_HELP),y) +verify: + @echo "$$VERIFY_HELP_INFO" +else +verify: verify_generated_files + KUBE_VERIFY_GIT_BRANCH=$(BRANCH) hack/make-rules/verify.sh -v + hack/make-rules/vet.sh +endif + +define UPDATE_HELP_INFO +# Runs all the generated updates. +# +# Example: +# make update +endef +.PHONY: update +ifeq ($(PRINT_HELP),y) +update: + @echo "$$UPDATE_HELP_INFO" +else +update: + hack/update-all.sh +endif + +define CHECK_TEST_HELP_INFO +# Build and run tests. +# +# Args: +# WHAT: Directory names to test. All *_test.go files under these +# directories will be run. If not specified, "everything" will be tested. +# TESTS: Same as WHAT. +# GOFLAGS: Extra flags to pass to 'go' when building. +# GOLDFLAGS: Extra linking flags to pass to 'go' when building. +# GOGCFLAGS: Additional go compile flags passed to 'go' when building. +# +# Example: +# make check +# make test +# make check WHAT=pkg/kubelet GOFLAGS=-v +endef +.PHONY: check test +ifeq ($(PRINT_HELP),y) +check test: + @echo "$$CHECK_TEST_HELP_INFO" +else +check test: generated_files + hack/make-rules/test.sh $(WHAT) $(TESTS) +endif + +define TEST_IT_HELP_INFO +# Build and run integration tests. +# +# Args: +# WHAT: Directory names to test. All *_test.go files under these +# directories will be run. If not specified, "everything" will be tested. +# +# Example: +# make test-integration +endef +.PHONY: test-integration +ifeq ($(PRINT_HELP),y) +test-integration: + @echo "$$TEST_IT_HELP_INFO" +else +test-integration: generated_files + hack/make-rules/test-integration.sh $(WHAT) +endif + +define TEST_E2E_HELP_INFO +# Build and run end-to-end tests. +# +# Example: +# make test-e2e +endef +.PHONY: test-e2e +ifeq ($(PRINT_HELP),y) +test-e2e: + @echo "$$TEST_E2E_HELP_INFO" +else +test-e2e: ginkgo generated_files + go run hack/e2e.go -- -v --build --up --test --down +endif + +define TEST_E2E_NODE_HELP_INFO +# Build and run node end-to-end tests. +# +# Args: +# FOCUS: Regexp that matches the tests to be run. Defaults to "". +# SKIP: Regexp that matches the tests that needs to be skipped. Defaults +# to "". +# RUN_UNTIL_FAILURE: If true, pass --untilItFails to ginkgo so tests are run +# repeatedly until they fail. Defaults to false. +# REMOTE: If true, run the tests on a remote host instance on GCE. Defaults +# to false. +# IMAGES: For REMOTE=true only. Comma delimited list of images for creating +# remote hosts to run tests against. Defaults to a recent image. +# LIST_IMAGES: If true, don't run tests. Just output the list of available +# images for testing. Defaults to false. +# HOSTS: For REMOTE=true only. Comma delimited list of running gce hosts to +# run tests against. Defaults to "". +# DELETE_INSTANCES: For REMOTE=true only. Delete any instances created as +# part of this test run. Defaults to false. +# ARTIFACTS: For REMOTE=true only. Local directory to scp test artifacts into +# from the remote hosts. Defaults to "/tmp/_artifacts". +# REPORT: For REMOTE=false only. Local directory to write juntil xml results +# to. Defaults to "/tmp/". +# CLEANUP: For REMOTE=true only. If false, do not stop processes or delete +# test files on remote hosts. Defaults to true. +# IMAGE_PROJECT: For REMOTE=true only. Project containing images provided to +# IMAGES. Defaults to "kubernetes-node-e2e-images". +# INSTANCE_PREFIX: For REMOTE=true only. Instances created from images will +# have the name "${INSTANCE_PREFIX}-${IMAGE_NAME}". Defaults to "test". +# INSTANCE_METADATA: For REMOTE=true and running on GCE only. +# GUBERNATOR: For REMOTE=true only. Produce link to Gubernator to view logs. +# Defaults to false. +# PARALLELISM: The number of gingko nodes to run. Defaults to 8. +# RUNTIME: Container runtime to use (eg. docker, rkt, remote). +# Defaults to "docker". +# CONTAINER_RUNTIME_ENDPOINT: remote container endpoint to connect to. +# Used when RUNTIME is set to "remote". +# IMAGE_SERVICE_ENDPOINT: remote image endpoint to connect to, to prepull images. +# Used when RUNTIME is set to "remote". +# IMAGE_CONFIG_FILE: path to a file containing image configuration. +# +# Example: +# make test-e2e-node FOCUS=Kubelet SKIP=container +# make test-e2e-node REMOTE=true DELETE_INSTANCES=true +# make test-e2e-node TEST_ARGS='--kubelet-flags="--cgroups-per-qos=true"' +# Build and run tests. +endef +.PHONY: test-e2e-node +ifeq ($(PRINT_HELP),y) +test-e2e-node: + @echo "$$TEST_E2E_NODE_HELP_INFO" +else +test-e2e-node: ginkgo generated_files + hack/make-rules/test-e2e-node.sh +endif + +define TEST_CMD_HELP_INFO +# Build and run cmdline tests. +# +# Example: +# make test-cmd +endef +.PHONY: test-cmd +ifeq ($(PRINT_HELP),y) +test-cmd: + @echo "$$TEST_CMD_HELP_INFO" +else +test-cmd: generated_files + hack/make-rules/test-kubeadm-cmd.sh + hack/make-rules/test-cmd.sh + hack/make-rules/test-federation-cmd.sh +endif + +define CLEAN_HELP_INFO +# Remove all build artifacts. +# +# Example: +# make clean +# +# TODO(thockin): call clean_generated when we stop committing generated code. +endef +.PHONY: clean +ifeq ($(PRINT_HELP),y) +clean: + @echo "$$CLEAN_HELP_INFO" +else +clean: clean_meta + build/make-clean.sh + rm -rf $(OUT_DIR) + rm -rf Godeps/_workspace # Just until we are sure it is gone + # TODO(thockin): Remove this when we call clean_generated. + rm -f pkg/generated/openapi/zz_generated.openapi.go +endif + +define CLEAN_META_HELP_INFO +# Remove make-related metadata files. +# +# Example: +# make clean_meta +endef +.PHONY: clean_meta +ifeq ($(PRINT_HELP),y) +clean_meta: + @echo "$$CLEAN_META_HELP_INFO" +else +clean_meta: + rm -rf $(META_DIR) +endif + +define CLEAN_GENERATED_HELP_INFO +# Remove all auto-generated artifacts. Generated artifacts in staging folder should not be removed as they are not +# generated using generated_files. +# +# Example: +# make clean_generated +endef +.PHONY: clean_generated +ifeq ($(PRINT_HELP),y) +clean_generated: + @echo "$$CLEAN_GENERATED_HELP_INFO" +else +clean_generated: + find . -type f -name $(GENERATED_FILE_PREFIX)\* | grep -v "[.]/staging/.*" | xargs rm -f +endif + +define VET_HELP_INFO +# Run 'go vet'. +# +# Args: +# WHAT: Directory names to vet. All *.go files under these +# directories will be vetted. If not specified, "everything" will be +# vetted. +# +# Example: +# make vet +# make vet WHAT=pkg/kubelet +endef +.PHONY: vet +ifeq ($(PRINT_HELP),y) +vet: + @echo "$$VET_HELP_INFO" +else +vet: + hack/make-rules/vet.sh $(WHAT) +endif + +define RELEASE_HELP_INFO +# Build a release +# +# Example: +# make release +endef +.PHONY: release +ifeq ($(PRINT_HELP),y) +release: + @echo "$$RELEASE_HELP_INFO" +else +release: + build/release.sh +endif + +define RELEASE_SKIP_TESTS_HELP_INFO +# Build a release, but skip tests +# +# Args: +# KUBE_RELEASE_RUN_TESTS: Whether to run tests. Set to 'y' to run tests anyways. +# KUBE_FASTBUILD: Whether to cross-compile for other architectures. Set to 'true' to do so. +# +# Example: +# make release-skip-tests +# make quick-release +endef +.PHONY: release-skip-tests quick-release +ifeq ($(PRINT_HELP),y) +release-skip-tests quick-release: + @echo "$$RELEASE_SKIP_TESTS_HELP_INFO" +else +release-skip-tests quick-release: KUBE_RELEASE_RUN_TESTS = n +release-skip-tests quick-release: KUBE_FASTBUILD = true +release-skip-tests quick-release: + build/release.sh +endif + +define CROSS_HELP_INFO +# Cross-compile for all platforms +# +# Example: +# make cross +endef +.PHONY: cross +ifeq ($(PRINT_HELP),y) +cross: + @echo "$$CROSS_HELP_INFO" +else +cross: + hack/make-rules/cross.sh +endif + +define CMD_HELP_INFO +# Add rules for all directories in cmd/ +# +# Example: +# make kubectl kube-proxy +endef +#TODO: make EXCLUDE_TARGET auto-generated when there are other files in cmd/ +#TODO: should we exclude the target "libs" but include "cmd/libs/go2idl/*"? +EXCLUDE_TARGET=OWNERS +.PHONY: $(filter-out %$(EXCLUDE_TARGET),$(notdir $(abspath $(wildcard cmd/*/)))) +ifeq ($(PRINT_HELP),y) +$(filter-out %$(EXCLUDE_TARGET),$(notdir $(abspath $(wildcard cmd/*/)))): + @echo "$$CMD_HELP_INFO" +else +$(filter-out %$(EXCLUDE_TARGET),$(notdir $(abspath $(wildcard cmd/*/)))): generated_files + hack/make-rules/build.sh cmd/$@ +endif + +define PLUGIN_CMD_HELP_INFO +# Add rules for all directories in plugin/cmd/ +# +# Example: +# make kube-scheduler +endef +.PHONY: $(notdir $(abspath $(wildcard plugin/cmd/*/))) +ifeq ($(PRINT_HELP),y) +$(notdir $(abspath $(wildcard plugin/cmd/*/))): + @echo "$$PLUGIN_CMD_HELP_INFO" +else +$(notdir $(abspath $(wildcard plugin/cmd/*/))): generated_files + hack/make-rules/build.sh plugin/cmd/$@ +endif + +define FED_CMD_HELP_INFO +# Add rules for all directories in federation/cmd/ +# +# Example: +# make federation-apiserver federation-controller-manager +endef +.PHONY: $(notdir $(abspath $(wildcard federation/cmd/*/))) +ifeq ($(PRINT_HELP),y) +$(notdir $(abspath $(wildcard federation/cmd/*/))): + @echo "$$FED_CMD_HELP_INFO" +else +$(notdir $(abspath $(wildcard federation/cmd/*/))): generated_files + hack/make-rules/build.sh federation/cmd/$@ +endif + +define GENERATED_FILES_HELP_INFO +# Produce auto-generated files needed for the build. +# +# Example: +# make generated_files +endef +.PHONY: generated_files +ifeq ($(PRINT_HELP),y) +generated_files: + @echo "$$GENERATED_FILES_HELP_INFO" +else +generated_files: + $(MAKE) -f Makefile.generated_files $@ CALLED_FROM_MAIN_MAKEFILE=1 +endif + +define VERIFY_GENERATED_FILES_HELP_INFO +# Verify auto-generated files needed for the build. +# +# Example: +# make verify_generated_files +endef +.PHONY: verify_generated_files +ifeq ($(PRINT_HELP),y) +verify_generated_files: + @echo "$$VERIFY_GENERATED_FILES_HELP_INFO" +else +verify_generated_files: + $(MAKE) -f Makefile.generated_files $@ CALLED_FROM_MAIN_MAKEFILE=1 +endif + +define HELP_INFO +# Print make targets and help info +# +# Example: +# make help +endef +.PHONY: help +ifeq ($(PRINT_HELP),y) +help: + @echo "$$HELP_INFO" +else +help: + hack/make-rules/make-help.sh +endif + +# Non-dockerized bazel rules. +.PHONY: bazel-build bazel-test bazel-release + +ifeq ($(PRINT_HELP),y) +define BAZEL_BUILD_HELP_INFO +# Build with bazel +# +# Example: +# make bazel-build +endef +bazel-build: + @echo "$$BAZEL_BUILD_HELP_INFO" +else +bazel-build: + bazel build //cmd/... //pkg/... //federation/... //plugin/... //third_party/... //examples/... //test/... //vendor/k8s.io/... +endif + + +ifeq ($(PRINT_HELP),y) +define BAZEL_TEST_HELP_INFO +# Test with bazel +# +# Example: +# make bazel-test +endef +bazel-test: + @echo "$$BAZEL_TEST_HELP_INFO" +else +bazel-test: + bazel test --test_tag_filters=-integration --flaky_test_attempts=3 //cmd/... //pkg/... //federation/... //plugin/... //third_party/... //hack/... //hack:verify-all //vendor/k8s.io/... +endif + +ifeq ($(PRINT_HELP),y) +define BAZEL_BUILD_HELP_INFO +# Build release tars with bazel +# +# Example: +# make bazel-release +endef +bazel-release: + @echo "$$BAZEL_BUILD_HELP_INFO" +else +bazel-release: + bazel build //build/release-tars +endif diff --git a/build/root/Makefile.generated_files b/build/root/Makefile.generated_files new file mode 100644 index 0000000000000..45287dc22fb10 --- /dev/null +++ b/build/root/Makefile.generated_files @@ -0,0 +1,745 @@ +# Copyright 2016 The Kubernetes Authors. +# +# 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. + +# Don't allow users to call this directly. There are too many variables this +# assumes to inherit from the main Makefile. This is not a user-facing file. +ifeq ($(CALLED_FROM_MAIN_MAKEFILE),) + $(error Please use the main Makefile, e.g. `make generated_files`) +endif + +# Don't allow an implicit 'all' rule. This is not a user-facing file. +ifeq ($(MAKECMDGOALS),) + $(error This Makefile requires an explicit rule to be specified) +endif + +ifeq ($(DBG_MAKEFILE),1) + $(warning ***** starting Makefile.generated_files for goal(s) "$(MAKECMDGOALS)") + $(warning ***** $(shell date)) +endif + + +# It's necessary to set this because some environments don't link sh -> bash. +SHELL := /bin/bash + +# This rule collects all the generated file sets into a single rule. Other +# rules should depend on this to ensure generated files are rebuilt. +.PHONY: generated_files +generated_files: gen_deepcopy gen_defaulter gen_conversion gen_openapi + +.PHONY: verify_generated_files +verify_generated_files: verify_gen_deepcopy \ + verify_gen_defaulter \ + verify_gen_conversion + +# Code-generation logic. +# +# This stuff can be pretty tricky, and there's probably some corner cases that +# we don't handle well. That said, here's a straightforward test to prove that +# the most common cases work. Sadly, it is manual. +# +# make clean +# find . -name .make\* | xargs rm -f +# find . -name zz_generated\* | xargs rm -f +# # verify `find . -name zz_generated.deepcopy.go | wc -l` is 0 +# # verify `find . -name .make | wc -l` is 0 +# +# make nonexistent +# # expect "No rule to make target" +# # verify `find .make/ -type f | wc -l` has many files +# +# make gen_deepcopy +# # expect deepcopy-gen is built exactly once +# # expect many files to be regenerated +# # verify `find . -name zz_generated.deepcopy.go | wc -l` has files +# make gen_deepcopy +# # expect nothing to be rebuilt, finish in O(seconds) +# touch pkg/api/types.go +# make gen_deepcopy +# # expect one file to be regenerated +# make gen_deepcopy +# # expect nothing to be rebuilt, finish in O(seconds) +# touch cmd/libs/go2idl/deepcopy-gen/main.go +# make gen_deepcopy +# # expect deepcopy-gen is built exactly once +# # expect many files to be regenerated +# # verify `find . -name zz_generated.deepcopy.go | wc -l` has files +# make gen_deepcopy +# # expect nothing to be rebuilt, finish in O(seconds) +# +# make gen_conversion +# # expect conversion-gen is built exactly once +# # expect many files to be regenerated +# # verify `find . -name zz_generated.conversion.go | wc -l` has files +# make gen_conversion +# # expect nothing to be rebuilt, finish in O(seconds) +# touch pkg/api/types.go +# make gen_conversion +# # expect one file to be regenerated +# make gen_conversion +# # expect nothing to be rebuilt, finish in O(seconds) +# touch cmd/libs/go2idl/conversion-gen/main.go +# make gen_conversion +# # expect conversion-gen is built exactly once +# # expect many files to be regenerated +# # verify `find . -name zz_generated.conversion.go | wc -l` has files +# make gen_conversion +# # expect nothing to be rebuilt, finish in O(seconds) +# +# make all +# # expect it to build +# +# make test +# # expect it to pass +# +# make clean +# # verify `find . -name zz_generated.deepcopy.go | wc -l` is 0 +# # verify `find . -name .make | wc -l` is 0 +# +# make all WHAT=cmd/kube-proxy +# # expect it to build +# +# make clean +# make test WHAT=cmd/kube-proxy +# # expect it to pass + +# This variable holds a list of every directory that contains Go files in this +# project. Other rules and variables can use this as a starting point to +# reduce filesystem accesses. +ifeq ($(DBG_MAKEFILE),1) + $(warning ***** finding all *.go dirs) +endif +ALL_GO_DIRS := $(shell \ + hack/make-rules/helpers/cache_go_dirs.sh $(META_DIR)/all_go_dirs.mk \ +) + +# The name of the metadata file which lists *.go files in each pkg. +GOFILES_META := gofiles.mk + +# Establish a dependency between the deps file and the dir. Whenever a dir +# changes (files added or removed) the deps file will be considered stale. +# +# The variable value was set in $(GOFILES_META) and included as part of the +# dependency management logic. +# +# This is looser than we really need (e.g. we don't really care about non *.go +# files or even *_test.go files), but this is much easier to represent. +# +# Because we 'sinclude' the deps file, it is considered for rebuilding, as part +# of make's normal evaluation. If it gets rebuilt, make will restart. +# +# The '$(eval)' is needed because this has a different RHS for each LHS, and +# would otherwise produce results that make can't parse. +$(foreach dir, $(ALL_GO_DIRS), $(eval \ + $(META_DIR)/$(dir)/$(GOFILES_META): $(dir) \ +)) + +# How to rebuild a deps file. When make determines that the deps file is stale +# (see above), it executes this rule, and then re-loads the deps file. +# +# This is looser than we really need (e.g. we don't really care about test +# files), but this is MUCH faster than calling `go list`. +# +# We regenerate the output file in order to satisfy make's "newer than" rules, +# but we only need to rebuild targets if the contents actually changed. That +# is what the .stamp file represents. +$(foreach dir, $(ALL_GO_DIRS), \ + $(META_DIR)/$(dir)/$(GOFILES_META)): + FILES=$$(ls $$@.tmp; \ + cmp -s $@.tmp $@ || touch $@.stamp; \ + mv $@.tmp $@ +# This is required to fill in the DAG, since some cases (e.g. 'make clean all') +# will reference the .stamp file when it doesn't exist. We don't need to +# rebuild it in that case, just keep make happy. +$(foreach dir, $(ALL_GO_DIRS), \ + $(META_DIR)/$(dir)/$(GOFILES_META).stamp): + +# Include any deps files as additional Makefile rules. This triggers make to +# consider the deps files for rebuild, which makes the whole +# dependency-management logic work. 'sinclude' is "silent include" which does +# not fail if the file does not exist. +$(foreach dir, $(ALL_GO_DIRS), $(eval \ + sinclude $(META_DIR)/$(dir)/$(GOFILES_META) \ +)) + +# Generate a list of all files that have a `+k8s:` comment-tag. This will be +# used to derive lists of files/dirs for generation tools. +ifeq ($(DBG_MAKEFILE),1) + $(warning ***** finding all +k8s: tags) +endif +ALL_K8S_TAG_FILES := $(shell \ + find $(ALL_GO_DIRS) -maxdepth 1 -type f -name \*.go \ + | xargs grep --color=never -l '^// *+k8s:' \ +) + +# +# Deep-copy generation +# +# Any package that wants deep-copy functions generated must include a +# comment-tag in column 0 of one file of the form: +# // +k8s:deepcopy-gen= +# +# The may be one of: +# generate: generate deep-copy functions into the package +# register: generate deep-copy functions and register them with a +# scheme + +# The result file, in each pkg, of deep-copy generation. +DEEPCOPY_BASENAME := $(GENERATED_FILE_PREFIX)deepcopy +DEEPCOPY_FILENAME := $(DEEPCOPY_BASENAME).go + +# The tool used to generate deep copies. +DEEPCOPY_GEN := $(BIN_DIR)/deepcopy-gen + +# Find all the directories that request deep-copy generation. +ifeq ($(DBG_MAKEFILE),1) + $(warning ***** finding all +k8s:deepcopy-gen tags) +endif +DEEPCOPY_DIRS := $(shell \ + grep --color=never -l '+k8s:deepcopy-gen=' $(ALL_K8S_TAG_FILES) \ + | xargs -n1 dirname \ + | LC_ALL=C sort -u \ +) +DEEPCOPY_FILES := $(addsuffix /$(DEEPCOPY_FILENAME), $(DEEPCOPY_DIRS)) + +# Shell function for reuse in rules. +RUN_GEN_DEEPCOPY = \ + function run_gen_deepcopy() { \ + if [[ -f $(META_DIR)/$(DEEPCOPY_GEN).todo ]]; then \ + ./hack/run-in-gopath.sh $(DEEPCOPY_GEN) \ + --v $(KUBE_VERBOSE) \ + --logtostderr \ + -i $$(cat $(META_DIR)/$(DEEPCOPY_GEN).todo | paste -sd, -) \ + --bounding-dirs $(PRJ_SRC_PATH) \ + -O $(DEEPCOPY_BASENAME) \ + "$$@"; \ + fi \ + }; \ + run_gen_deepcopy + +# This rule aggregates the set of files to generate and then generates them all +# in a single run of the tool. +.PHONY: gen_deepcopy +gen_deepcopy: $(DEEPCOPY_FILES) $(DEEPCOPY_GEN) + $(RUN_GEN_DEEPCOPY) + +.PHONY: verify_gen_deepcopy +verify_gen_deepcopy: $(DEEPCOPY_GEN) + $(RUN_GEN_DEEPCOPY) --verify-only + +# For each dir in DEEPCOPY_DIRS, this establishes a dependency between the +# output file and the input files that should trigger a rebuild. +# +# Note that this is a deps-only statement, not a full rule (see below). This +# has to be done in a distinct step because wildcards don't work in static +# pattern rules. +# +# The '$(eval)' is needed because this has a different RHS for each LHS, and +# would otherwise produce results that make can't parse. +# +# We depend on the $(GOFILES_META).stamp to detect when the set of input files +# has changed. This allows us to detect deleted input files. +$(foreach dir, $(DEEPCOPY_DIRS), $(eval \ + $(dir)/$(DEEPCOPY_FILENAME): $(META_DIR)/$(dir)/$(GOFILES_META).stamp \ + $(gofiles__$(dir)) \ +)) + +# Unilaterally remove any leftovers from previous runs. +$(shell rm -f $(META_DIR)/$(DEEPCOPY_GEN)*.todo) + +# How to regenerate deep-copy code. This is a little slow to run, so we batch +# it up and trigger the batch from the 'generated_files' target. +$(DEEPCOPY_FILES): $(DEEPCOPY_GEN) + mkdir -p $$(dirname $(META_DIR)/$(DEEPCOPY_GEN)) + echo $(PRJ_SRC_PATH)/$(@D) >> $(META_DIR)/$(DEEPCOPY_GEN).todo + +# This calculates the dependencies for the generator tool, so we only rebuild +# it when needed. It is PHONY so that it always runs, but it only updates the +# file if the contents have actually changed. We 'sinclude' this later. +.PHONY: $(META_DIR)/$(DEEPCOPY_GEN).mk +$(META_DIR)/$(DEEPCOPY_GEN).mk: + mkdir -p $(@D); \ + (echo -n "$(DEEPCOPY_GEN): "; \ + ./hack/run-in-gopath.sh go list \ + -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ + ./cmd/libs/go2idl/deepcopy-gen \ + | grep --color=never "^$(PRJ_SRC_PATH)/" \ + | xargs ./hack/run-in-gopath.sh go list \ + -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ + | paste -sd' ' - \ + | sed 's/ / \\=,/g' \ + | tr '=,' '\n\t' \ + | sed "s|$$(pwd -P)/||"; \ + ) > $@.tmp; \ + cmp -s $@.tmp $@ || cat $@.tmp > $@ && rm -f $@.tmp + +# Include dependency info for the generator tool. This will cause the rule of +# the same name to be considered and if it is updated, make will restart. +sinclude $(META_DIR)/$(DEEPCOPY_GEN).mk + +# How to build the generator tool. The deps for this are defined in +# the $(DEEPCOPY_GEN).mk, above. +# +# A word on the need to touch: This rule might trigger if, for example, a +# non-Go file was added or deleted from a directory on which this depends. +# This target needs to be reconsidered, but Go realizes it doesn't actually +# have to be rebuilt. In that case, make will forever see the dependency as +# newer than the binary, and try to rebuild it over and over. So we touch it, +# and make is happy. +$(DEEPCOPY_GEN): + hack/make-rules/build.sh cmd/libs/go2idl/deepcopy-gen + touch $@ + +# +# Defaulter generation +# +# Any package that wants defaulter functions generated must include a +# comment-tag in column 0 of one file of the form: +# // +k8s:defaulter-gen= +# +# The depends on context: +# on types: +# true: always generate a defaulter for this type +# false: never generate a defaulter for this type +# on functions: +# covers: if the function name matches SetDefault_NAME, instructs +# the generator not to recurse +# on packages: +# FIELDNAME: any object with a field of this name is a candidate +# for having a defaulter generated + +# The result file, in each pkg, of defaulter generation. +DEFAULTER_BASENAME := $(GENERATED_FILE_PREFIX)defaults +DEFAULTER_FILENAME := $(DEFAULTER_BASENAME).go + +# The tool used to generate defaulters. +DEFAULTER_GEN := $(BIN_DIR)/defaulter-gen + +# All directories that request any form of defaulter generation. +ifeq ($(DBG_MAKEFILE),1) + $(warning ***** finding all +k8s:defaulter-gen tags) +endif +DEFAULTER_DIRS := $(shell \ + grep --color=never -l '+k8s:defaulter-gen=' $(ALL_K8S_TAG_FILES) \ + | xargs -n1 dirname \ + | LC_ALL=C sort -u \ +) + +DEFAULTER_FILES := $(addsuffix /$(DEFAULTER_FILENAME), $(DEFAULTER_DIRS)) + +RUN_GEN_DEFAULTER := \ + function run_gen_defaulter() { \ + if [[ -f $(META_DIR)/$(DEFAULTER_GEN).todo ]]; then \ + ./hack/run-in-gopath.sh $(DEFAULTER_GEN) \ + --v $(KUBE_VERBOSE) \ + --logtostderr \ + -i $$(cat $(META_DIR)/$(DEFAULTER_GEN).todo | paste -sd, -) \ + --extra-peer-dirs $$(echo $(addprefix $(PRJ_SRC_PATH)/, $(DEFAULTER_DIRS)) | sed 's/ /,/g') \ + -O $(DEFAULTER_BASENAME) \ + "$$@"; \ + fi \ + }; \ + run_gen_defaulter + +# This rule aggregates the set of files to generate and then generates them all +# in a single run of the tool. +.PHONY: gen_defaulter +gen_defaulter: $(DEFAULTER_FILES) $(DEFAULTER_GEN) + $(RUN_GEN_DEFAULTER) + +.PHONY: verify_gen_deepcopy +verify_gen_defaulter: $(DEFAULTER_GEN) + $(RUN_GEN_DEFAULTER) --verify-only + +# For each dir in DEFAULTER_DIRS, this establishes a dependency between the +# output file and the input files that should trigger a rebuild. +# +# The variable value was set in $(GOFILES_META) and included as part of the +# dependency management logic. +# +# Note that this is a deps-only statement, not a full rule (see below). This +# has to be done in a distinct step because wildcards don't work in static +# pattern rules. +# +# The '$(eval)' is needed because this has a different RHS for each LHS, and +# would otherwise produce results that make can't parse. +# +# We depend on the $(GOFILES_META).stamp to detect when the set of input files +# has changed. This allows us to detect deleted input files. +$(foreach dir, $(DEFAULTER_DIRS), $(eval \ + $(dir)/$(DEFAULTER_FILENAME): $(META_DIR)/$(dir)/$(GOFILES_META).stamp \ + $(gofiles__$(dir)) \ +)) + +# For each dir in DEFAULTER_DIRS, for each target in $(defaulters__$(dir)), +# this establishes a dependency between the output file and the input files +# that should trigger a rebuild. +# +# The variable value was set in $(GOFILES_META) and included as part of the +# dependency management logic. +# +# Note that this is a deps-only statement, not a full rule (see below). This +# has to be done in a distinct step because wildcards don't work in static +# pattern rules. +# +# The '$(eval)' is needed because this has a different RHS for each LHS, and +# would otherwise produce results that make can't parse. +# +# We depend on the $(GOFILES_META).stamp to detect when the set of input files +# has changed. This allows us to detect deleted input files. +$(foreach dir, $(DEFAULTER_DIRS), \ + $(foreach tgt, $(defaulters__$(dir)), $(eval \ + $(dir)/$(DEFAULTER_FILENAME): $(META_DIR)/$(tgt)/$(GOFILES_META).stamp \ + $(gofiles__$(tgt)) \ + )) \ +) + +# Unilaterally remove any leftovers from previous runs. +$(shell rm -f $(META_DIR)/$(DEFAULTER_GEN)*.todo) + +# How to regenerate defaulter code. This is a little slow to run, so we batch +# it up and trigger the batch from the 'generated_files' target. +$(DEFAULTER_FILES): $(DEFAULTER_GEN) + mkdir -p $$(dirname $(META_DIR)/$(DEFAULTER_GEN)) + echo $(PRJ_SRC_PATH)/$(@D) >> $(META_DIR)/$(DEFAULTER_GEN).todo + +# This calculates the dependencies for the generator tool, so we only rebuild +# it when needed. It is PHONY so that it always runs, but it only updates the +# file if the contents have actually changed. We 'sinclude' this later. +.PHONY: $(META_DIR)/$(DEFAULTER_GEN).mk +$(META_DIR)/$(DEFAULTER_GEN).mk: + mkdir -p $(@D); \ + (echo -n "$(DEFAULTER_GEN): "; \ + ./hack/run-in-gopath.sh go list \ + -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ + ./cmd/libs/go2idl/defaulter-gen \ + | grep --color=never "^$(PRJ_SRC_PATH)/" \ + | xargs ./hack/run-in-gopath.sh go list \ + -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ + | paste -sd' ' - \ + | sed 's/ / \\=,/g' \ + | tr '=,' '\n\t' \ + | sed "s|$$(pwd -P)/||"; \ + ) > $@.tmp; \ + cmp -s $@.tmp $@ || cat $@.tmp > $@ && rm -f $@.tmp + +# Include dependency info for the generator tool. This will cause the rule of +# the same name to be considered and if it is updated, make will restart. +sinclude $(META_DIR)/$(DEFAULTER_GEN).mk + +# How to build the generator tool. The deps for this are defined in +# the $(DEFAULTER_GEN).mk, above. +# +# A word on the need to touch: This rule might trigger if, for example, a +# non-Go file was added or deleted from a directory on which this depends. +# This target needs to be reconsidered, but Go realizes it doesn't actually +# have to be rebuilt. In that case, make will forever see the dependency as +# newer than the binary, and try to rebuild it over and over. So we touch it, +# and make is happy. +$(DEFAULTER_GEN): + hack/make-rules/build.sh cmd/libs/go2idl/defaulter-gen + touch $@ + +# +# Open-api generation +# +# Any package that wants open-api functions generated must include a +# comment-tag in column 0 of one file of the form: +# // +k8s:openapi-gen=true +# +# The result file, in each pkg, of open-api generation. +OPENAPI_BASENAME := $(GENERATED_FILE_PREFIX)openapi +OPENAPI_FILENAME := $(OPENAPI_BASENAME).go +OPENAPI_OUTPUT_PKG := pkg/generated/openapi + +# The tool used to generate open apis. +OPENAPI_GEN := $(BIN_DIR)/openapi-gen + +# Find all the directories that request open-api generation. +ifeq ($(DBG_MAKEFILE),1) + $(warning ***** finding all +k8s:openapi-gen tags) +endif +OPENAPI_DIRS := $(shell \ + grep --color=never -l '+k8s:openapi-gen=' $(ALL_K8S_TAG_FILES) \ + | xargs -n1 dirname \ + | LC_ALL=C sort -u \ +) + +OPENAPI_OUTFILE := $(OPENAPI_OUTPUT_PKG)/$(OPENAPI_FILENAME) + +# This rule is the user-friendly entrypoint for openapi generation. +.PHONY: gen_openapi +gen_openapi: $(OPENAPI_OUTFILE) $(OPENAPI_GEN) + +# For each dir in OPENAPI_DIRS, this establishes a dependency between the +# output file and the input files that should trigger a rebuild. +# +# Note that this is a deps-only statement, not a full rule (see below). This +# has to be done in a distinct step because wildcards don't work in static +# pattern rules. +# +# The '$(eval)' is needed because this has a different RHS for each LHS, and +# would otherwise produce results that make can't parse. +# +# We depend on the $(GOFILES_META).stamp to detect when the set of input files +# has changed. This allows us to detect deleted input files. +$(foreach dir, $(OPENAPI_DIRS), $(eval \ + $(OPENAPI_OUTFILE): $(META_DIR)/$(dir)/$(GOFILES_META).stamp \ + $(gofiles__$(dir)) \ +)) + +# How to regenerate open-api code. This emits a single file for all results. +$(OPENAPI_OUTFILE): $(OPENAPI_GEN) $(OPENAPI_GEN) + function run_gen_openapi() { \ + ./hack/run-in-gopath.sh $(OPENAPI_GEN) \ + --v $(KUBE_VERBOSE) \ + --logtostderr \ + -i $$(echo $(addprefix $(PRJ_SRC_PATH)/, $(OPENAPI_DIRS)) | sed 's/ /,/g') \ + -p $(PRJ_SRC_PATH)/$(OPENAPI_OUTPUT_PKG) \ + -O $(OPENAPI_BASENAME) \ + "$$@"; \ + }; \ + run_gen_openapi + +# This calculates the dependencies for the generator tool, so we only rebuild +# it when needed. It is PHONY so that it always runs, but it only updates the +# file if the contents have actually changed. We 'sinclude' this later. +.PHONY: $(META_DIR)/$(OPENAPI_GEN).mk +$(META_DIR)/$(OPENAPI_GEN).mk: + mkdir -p $(@D); \ + (echo -n "$(OPENAPI_GEN): "; \ + ./hack/run-in-gopath.sh go list \ + -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ + ./cmd/libs/go2idl/openapi-gen \ + | grep --color=never "^$(PRJ_SRC_PATH)/" \ + | xargs ./hack/run-in-gopath.sh go list \ + -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ + | paste -sd' ' - \ + | sed 's/ / \\=,/g' \ + | tr '=,' '\n\t' \ + | sed "s|$$(pwd -P)/||"; \ + ) > $@.tmp; \ + cmp -s $@.tmp $@ || cat $@.tmp > $@ && rm -f $@.tmp + +# Include dependency info for the generator tool. This will cause the rule of +# the same name to be considered and if it is updated, make will restart. +sinclude $(META_DIR)/$(OPENAPI_GEN).mk + +# How to build the generator tool. The deps for this are defined in +# the $(OPENAPI_GEN).mk, above. +# +# A word on the need to touch: This rule might trigger if, for example, a +# non-Go file was added or deleted from a directory on which this depends. +# This target needs to be reconsidered, but Go realizes it doesn't actually +# have to be rebuilt. In that case, make will forever see the dependency as +# newer than the binary, and try to rebuild it over and over. So we touch it, +# and make is happy. +$(OPENAPI_GEN): + hack/make-rules/build.sh cmd/libs/go2idl/openapi-gen + touch $@ + +# +# Conversion generation +# +# Any package that wants conversion functions generated must include one or +# more comment-tags in any .go file, in column 0, of the form: +# // +k8s:conversion-gen= +# +# The CONVERSION_TARGET_DIR is a project-local path to another directory which +# should be considered when evaluating peer types for conversions. Types which +# are found in the source package (where conversions are being generated) +# but do not have a peer in one of the target directories will not have +# conversions generated. +# +# TODO: it might be better in the long term to make peer-types explicit in the +# IDL. + +# The result file, in each pkg, of conversion generation. +CONVERSION_BASENAME := $(GENERATED_FILE_PREFIX)conversion +CONVERSION_FILENAME := $(CONVERSION_BASENAME).go + +# The tool used to generate conversions. +CONVERSION_GEN := $(BIN_DIR)/conversion-gen + +# The name of the metadata file listing conversion peers for each pkg. +CONVERSIONS_META := conversions.mk + +# All directories that request any form of conversion generation. +ifeq ($(DBG_MAKEFILE),1) + $(warning ***** finding all +k8s:conversion-gen tags) +endif +CONVERSION_DIRS := $(shell \ + grep --color=never '^// *+k8s:conversion-gen=' $(ALL_K8S_TAG_FILES) \ + | cut -f1 -d: \ + | xargs -n1 dirname \ + | LC_ALL=C sort -u \ +) + +CONVERSION_FILES := $(addsuffix /$(CONVERSION_FILENAME), $(CONVERSION_DIRS)) + +# Shell function for reuse in rules. +RUN_GEN_CONVERSION = \ + function run_gen_conversion() { \ + if [[ -f $(META_DIR)/$(CONVERSION_GEN).todo ]]; then \ + ./hack/run-in-gopath.sh $(CONVERSION_GEN) \ + --v $(KUBE_VERBOSE) \ + --logtostderr \ + -i $$(cat $(META_DIR)/$(CONVERSION_GEN).todo | paste -sd, -) \ + -O $(CONVERSION_BASENAME) \ + "$$@"; \ + fi \ + }; \ + run_gen_conversion + +# This rule aggregates the set of files to generate and then generates them all +# in a single run of the tool. +.PHONY: gen_conversion +gen_conversion: $(CONVERSION_FILES) $(CONVERSION_GEN) + $(RUN_GEN_CONVERSION) + +.PHONY: verify_gen_conversion +verify_gen_conversion: $(CONVERSION_GEN) + $(RUN_GEN_CONVERSION) --verify-only + +# Establish a dependency between the deps file and the dir. Whenever a dir +# changes (files added or removed) the deps file will be considered stale. +# +# This is looser than we really need (e.g. we don't really care about non *.go +# files or even *_test.go files), but this is much easier to represent. +# +# Because we 'sinclude' the deps file, it is considered for rebuilding, as part +# of make's normal evaluation. If it gets rebuilt, make will restart. +# +# The '$(eval)' is needed because this has a different RHS for each LHS, and +# would otherwise produce results that make can't parse. +$(foreach dir, $(CONVERSION_DIRS), $(eval \ + $(META_DIR)/$(dir)/$(CONVERSIONS_META): $(dir) \ +)) + +# How to rebuild a deps file. When make determines that the deps file is stale +# (see above), it executes this rule, and then re-loads the deps file. +# +# This is looser than we really need (e.g. we don't really care about test +# files), but this is MUCH faster than calling `go list`. +# +# We regenerate the output file in order to satisfy make's "newer than" rules, +# but we only need to rebuild targets if the contents actually changed. That +# is what the .stamp file represents. +$(foreach dir, $(CONVERSION_DIRS), \ + $(META_DIR)/$(dir)/$(CONVERSIONS_META)): + TAGS=$$(grep --color=never -h '^// *+k8s:conversion-gen=' $$@.tmp; \ + cmp -s $@.tmp $@ || touch $@.stamp; \ + mv $@.tmp $@ + +# Include any deps files as additional Makefile rules. This triggers make to +# consider the deps files for rebuild, which makes the whole +# dependency-management logic work. 'sinclude' is "silent include" which does +# not fail if the file does not exist. +$(foreach dir, $(CONVERSION_DIRS), $(eval \ + sinclude $(META_DIR)/$(dir)/$(CONVERSIONS_META) \ +)) + +# For each dir in CONVERSION_DIRS, this establishes a dependency between the +# output file and the input files that should trigger a rebuild. +# +# The variable value was set in $(GOFILES_META) and included as part of the +# dependency management logic. +# +# Note that this is a deps-only statement, not a full rule (see below). This +# has to be done in a distinct step because wildcards don't work in static +# pattern rules. +# +# The '$(eval)' is needed because this has a different RHS for each LHS, and +# would otherwise produce results that make can't parse. +# +# We depend on the $(GOFILES_META).stamp to detect when the set of input files +# has changed. This allows us to detect deleted input files. +$(foreach dir, $(CONVERSION_DIRS), $(eval \ + $(dir)/$(CONVERSION_FILENAME): $(META_DIR)/$(dir)/$(GOFILES_META).stamp \ + $(gofiles__$(dir)) \ +)) + +# For each dir in CONVERSION_DIRS, for each target in $(conversions__$(dir)), +# this establishes a dependency between the output file and the input files +# that should trigger a rebuild. +# +# The variable value was set in $(GOFILES_META) and included as part of the +# dependency management logic. +# +# Note that this is a deps-only statement, not a full rule (see below). This +# has to be done in a distinct step because wildcards don't work in static +# pattern rules. +# +# The '$(eval)' is needed because this has a different RHS for each LHS, and +# would otherwise produce results that make can't parse. +# +# We depend on the $(GOFILES_META).stamp to detect when the set of input files +# has changed. This allows us to detect deleted input files. +$(foreach dir, $(CONVERSION_DIRS), \ + $(foreach tgt, $(conversions__$(dir)), $(eval \ + $(dir)/$(CONVERSION_FILENAME): $(META_DIR)/$(tgt)/$(GOFILES_META).stamp \ + $(gofiles__$(tgt)) \ + )) \ +) + +# Unilaterally remove any leftovers from previous runs. +$(shell rm -f $(META_DIR)/$(CONVERSION_GEN)*.todo) + +# How to regenerate conversion code. This is a little slow to run, so we batch +# it up and trigger the batch from the 'generated_files' target. +$(CONVERSION_FILES): $(CONVERSION_GEN) + mkdir -p $$(dirname $(META_DIR)/$(CONVERSION_GEN)) + echo $(PRJ_SRC_PATH)/$(@D) >> $(META_DIR)/$(CONVERSION_GEN).todo + +# This calculates the dependencies for the generator tool, so we only rebuild +# it when needed. It is PHONY so that it always runs, but it only updates the +# file if the contents have actually changed. We 'sinclude' this later. +.PHONY: $(META_DIR)/$(CONVERSION_GEN).mk +$(META_DIR)/$(CONVERSION_GEN).mk: + mkdir -p $(@D); \ + (echo -n "$(CONVERSION_GEN): "; \ + ./hack/run-in-gopath.sh go list \ + -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ + ./cmd/libs/go2idl/conversion-gen \ + | grep --color=never "^$(PRJ_SRC_PATH)/" \ + | xargs ./hack/run-in-gopath.sh go list \ + -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ + | paste -sd' ' - \ + | sed 's/ / \\=,/g' \ + | tr '=,' '\n\t' \ + | sed "s|$$(pwd -P)/||"; \ + ) > $@.tmp; \ + cmp -s $@.tmp $@ || cat $@.tmp > $@ && rm -f $@.tmp + +# Include dependency info for the generator tool. This will cause the rule of +# the same name to be considered and if it is updated, make will restart. +sinclude $(META_DIR)/$(CONVERSION_GEN).mk + +# How to build the generator tool. The deps for this are defined in +# the $(CONVERSION_GEN).mk, above. +# +# A word on the need to touch: This rule might trigger if, for example, a +# non-Go file was added or deleted from a directory on which this depends. +# This target needs to be reconsidered, but Go realizes it doesn't actually +# have to be rebuilt. In that case, make will forever see the dependency as +# newer than the binary, and try to rebuild it over and over. So we touch it, +# and make is happy. +$(CONVERSION_GEN): + hack/make-rules/build.sh cmd/libs/go2idl/conversion-gen + touch $@ diff --git a/build/root/WORKSPACE b/build/root/WORKSPACE new file mode 100644 index 0000000000000..fe0c36382ce3e --- /dev/null +++ b/build/root/WORKSPACE @@ -0,0 +1,91 @@ +http_archive( + name = "io_bazel_rules_go", + sha256 = "a1cae429e9d591017421150e3173478c46c693bc594322c7fa7e6cb5f672ef59", + strip_prefix = "rules_go-805fd1566500997379806373feb05e138a4dfe28", + urls = ["https://github.com/bazelbuild/rules_go/archive/805fd1566500997379806373feb05e138a4dfe28.tar.gz"], +) + +http_archive( + name = "io_kubernetes_build", + sha256 = "8d1cff71523565996903076cec6cad8424afa6eb93a342d0d810a55c911e23c7", + strip_prefix = "repo-infra-61b7247ebf472398bdea148d8f67e3a1849d6de9", + urls = ["https://github.com/kubernetes/repo-infra/archive/61b7247ebf472398bdea148d8f67e3a1849d6de9.tar.gz"], +) + +# This contains a patch to not prepend ./ to tarfiles produced by pkg_tar. +# When merged upstream, we'll no longer need to use ixdy's fork: +# https://bazel-review.googlesource.com/#/c/10390/ +http_archive( + name = "io_bazel", + sha256 = "667d32da016b1e2f63cf345cd3583989ec4a165034df383a01996d93635753a0", + strip_prefix = "bazel-df2c687c22bdd7c76f3cdcc85f38fefd02f0b844", + urls = ["https://github.com/ixdy/bazel/archive/df2c687c22bdd7c76f3cdcc85f38fefd02f0b844.tar.gz"], +) + +http_archive( + name = "io_bazel_rules_docker", + sha256 = "261fbd8fda1d06a12a0479019b46acd302c6aaa8df8e49383dc37917f20492a1", + strip_prefix = "rules_docker-52d9faf209ff6d16eb850b6b66d03483735e0633", + urls = ["https://github.com/bazelbuild/rules_docker/archive/52d9faf209ff6d16eb850b6b66d03483735e0633.tar.gz"], +) + +load("@io_bazel_rules_go//go:def.bzl", "go_repositories") +load("@io_bazel_rules_docker//docker:docker.bzl", "docker_repositories") + +go_repositories( + go_version = "1.8.1", +) + +docker_repositories() + +# for building docker base images +debs = ( + ( + "busybox_deb", + "5f81f140777454e71b9e5bfdce9c89993de5ddf4a7295ea1cfda364f8f630947", + "http://ftp.us.debian.org/debian/pool/main/b/busybox/busybox-static_1.22.0-19+b3_amd64.deb", + "https://storage.googleapis.com/kubernetes-release/debs/busybox-static_1.22.0-19+b3_amd64.deb", + ), + ( + "libc_deb", + "372aac4a9ce9dbb26a08de0b9c41b0500ba019430295d29f39566483f5f32732", + "http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.24-10_amd64.deb", + "https://storage.googleapis.com/kubernetes-release/debs/libc6_2.24-10_amd64.deb", + ), + ( + "iptables_deb", + "7747388a97ba71fede302d70361c81d486770a2024185514c18b5d8eab6aaf4e", + "http://ftp.us.debian.org/debian/pool/main/i/iptables/iptables_1.4.21-2+b1_amd64.deb", + "https://storage.googleapis.com/kubernetes-release/debs/iptables_1.4.21-2+b1_amd64.deb", + ), + ( + "libnetlink_deb", + "5d486022cd9e047e9afbb1617cf4519c0decfc3d2c1fad7e7fe5604943dbbf37", + "http://ftp.us.debian.org/debian/pool/main/libn/libnfnetlink/libnfnetlink0_1.0.1-3_amd64.deb", + "https://storage.googleapis.com/kubernetes-release/debs/libnfnetlink0_1.0.1-3_amd64.deb", + ), + ( + "libxtables_deb", + "6783f316af4cbf3ada8b9a2b7bb5f53a87c0c2575c1903ce371fdbd45d3626c6", + "http://ftp.us.debian.org/debian/pool/main/i/iptables/libxtables10_1.4.21-2+b1_amd64.deb", + "https://storage.googleapis.com/kubernetes-release/debs/libxtables10_1.4.21-2+b1_amd64.deb", + ), + ( + "iproute2_deb", + "3ce9cb1d03a2a1359cbdd4f863b15d0c906096bf713e8eb688149da2f4e350bc", + "http://ftp.us.debian.org/debian/pool/main/i/iproute2/iproute_3.16.0-2_all.deb", + "https://storage.googleapis.com/kubernetes-release/debs/iproute_3.16.0-2_all.deb", + ), +) + +[http_file( + name = name, + sha256 = sha256, + url = url, +) for name, sha256, origin, url in debs] + +http_file( + name = "kubernetes_cni", + sha256 = "05ab3937bc68562e989dc143362ec4d4275262ba9f359338aed720fc914457a5", + url = "https://storage.googleapis.com/kubernetes-release/network-plugins/cni-amd64-0799f5732f2a11b329d9e3d51b9c8f2e3759f2ff.tar.gz", +)