diff --git a/Makefile b/Makefile index bce35339053c9..fbd5d511b9069 100644 --- a/Makefile +++ b/Makefile @@ -56,6 +56,7 @@ KUBE_GOGCFLAGS = $(GOGCFLAGS) # This controls the verbosity of the build. Higher numbers mean more output. KUBE_VERBOSE ?= 1 +define ALL_HELP_INFO # Build code. # # Args: @@ -74,18 +75,32 @@ KUBE_VERBOSE ?= 1 # 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: @@ -94,19 +109,33 @@ ginkgo: # 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: @@ -121,10 +150,17 @@ update: # 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: @@ -133,18 +169,32 @@ check test: generated_files # # 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: @@ -183,48 +233,83 @@ test-e2e: ginkgo generated_files # make test-e2e-node REMOTE=true DELETE_INSTANCES=true # make test-e2e-node TEST_ARGS="--experimental-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 +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-tools/make-clean.sh rm -rf $(OUT_DIR) rm -rf Godeps/_workspace # Just until we are sure it is gone +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: @@ -235,70 +320,150 @@ clean_generated: # 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-tools/release.sh +endif +define RELEASE_SKIP_TESTS_HELP_INFO # Build a release, but skip tests # # Example: # make release-skip-tests +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 KUBE_FASTBUILD=true build-tools/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 -.PHONY: $(notdir $(abspath $(wildcard cmd/*/))) -$(notdir $(abspath $(wildcard cmd/*/))): generated_files +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 diff --git a/hack/make-rules/make-help.sh b/hack/make-rules/make-help.sh new file mode 100755 index 0000000000000..33b1fa868c074 --- /dev/null +++ b/hack/make-rules/make-help.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# 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. + +set -o errexit +set -o nounset +set -o pipefail + +red='\E[1;31m' +reset='\E[0m' + +KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../.. +ALL_TARGETS=$(make -C "${KUBE_ROOT}" PRINT_HELP=y -rpn | sed -n -e '/^$/ { n ; /^[^ .#][^ ]*:/ { s/:.*$// ; p ; } ; }' | sort) +CMD_TARGETS=$(ls -l "${KUBE_ROOT}/cmd" |awk '/^d/ {print $NF}') +PLUGIN_CMD_TARGETS=$(ls -l "${KUBE_ROOT}/plugin/cmd" |awk '/^d/ {print $NF}') +FED_CMD_TARGETS=$(ls -l "${KUBE_ROOT}/federation/cmd" |awk '/^d/ {print $NF}') +CMD_FLAG=false +PLUGIN_CMD_FLAG=false +FED_CMD_FLAG=false + +echo "--------------------------------------------------------------------------------" +for tar in $ALL_TARGETS; do + for cmdtar in $CMD_TARGETS; do + if [ $tar = $cmdtar ]; then + if [ $CMD_FLAG = true ]; then + continue 2; + fi + + echo -e "${red}${CMD_TARGETS}${reset}" + make -C "${KUBE_ROOT}" $tar PRINT_HELP=y + echo "---------------------------------------------------------------------------------" + + CMD_FLAG=true + continue 2 + fi + done + + for plugincmdtar in $PLUGIN_CMD_TARGETS; do + if [ $tar = $plugincmdtar ]; then + if [ $PLUGIN_CMD_FLAG = true ]; then + continue 2; + fi + + echo -e "${red}${PLUGIN_CMD_TARGETS}${reset}" + make -C "${KUBE_ROOT}" $tar PRINT_HELP=y + echo "---------------------------------------------------------------------------------" + + PLUGIN_CMD_FLAG=true + continue 2 + fi + done + + for fedcmdtar in $FED_CMD_TARGETS; do + if [ $tar = $fedcmdtar ]; then + if [ $FED_CMD_FLAG = true ]; then + continue 2; + fi + + echo -e "${red}${FED_CMD_TARGETS}${reset}" + make -C "${KUBE_ROOT}" $tar PRINT_HELP=y + echo "---------------------------------------------------------------------------------" + + FED_CMD_FLAG=true + continue 2 + fi + done + + echo -e "${red}${tar}${reset}" + make -C "${KUBE_ROOT}" $tar PRINT_HELP=y + echo "---------------------------------------------------------------------------------" +done