324 строки
15 KiB
Makefile
324 строки
15 KiB
Makefile
# Copyright (c) Microsoft Corporation.
|
|
# Licensed under the MIT License.
|
|
|
|
# Contains:
|
|
# - Definitions
|
|
# - High Level Targets
|
|
# - Submake Includes
|
|
|
|
######## DEFINITIONS ########
|
|
|
|
toolkit_root := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
|
|
SCRIPTS_DIR ?= $(toolkit_root)/scripts
|
|
|
|
# Build targets
|
|
##help:var:CONFIG_FILE:<config_path>=Path to image configuration file to use. Will add package dependencies and define final image generated.
|
|
CONFIG_FILE ?=
|
|
CONFIG_BASE_DIR ?= $(dir $(CONFIG_FILE))
|
|
PACKAGE_BUILD_LIST ?=
|
|
##help:var:PACKAGE_REBUILD_LIST:<spec_list>=List of space-separated spec folders to force rebuild. Must not overlap with "PACKAGE_IGNORE_LIST". Example: PACKAGE_REBUILD_LIST="kernel go which".
|
|
PACKAGE_REBUILD_LIST ?=
|
|
##help:var:PACKAGE_IGNORE_LIST:<spec_list>=List of space-separated spec folders to ignore during the build. Must not overlap with "PACKAGE_REBUILD_LIST", may overlap with "PACKAGE_BUILD_LIST". Example: PACKAGE_IGNORE_LIST="zlib".
|
|
PACKAGE_IGNORE_LIST ?=
|
|
##help:var:SRPM_PACK_LIST:<spec_list>=List of space-separated spec folders inside "SPECS_DIR" to analyze for the build. If empty, all items inside the "SPECS_DIR" will be analyzed. Example: SRPM_PACK_LIST="kernel go which".
|
|
SRPM_PACK_LIST ?=
|
|
##help:var:TEST_RUN_LIST:<spec_list>=List of space-separated spec folders to consider for package tests. Specs from the listed folders MUST contain the "%check" section. If empty, all testable items from "SRPM_PACK_LIST" will be considered. Will not re-test previously built packages. Example: TEST_RUN_LIST="libguestfs zlib".
|
|
TEST_RUN_LIST ?=
|
|
##help:var:TEST_RERUN_LIST:<spec_list>=List of space-separated spec folders to force running a package test for. Specs from the listed folders MUST contain the "%check" section. Must not overlap with "TEST_IGNORE_LIST". Example: TEST_RERUN_LIST="libguestfs zlib".
|
|
TEST_RERUN_LIST ?=
|
|
##help:var:TEST_IGNORE_LIST:<spec_list>=List of space-separated spec folders to ignore for package tests. Must not overlap with "TEST_RERUN_LIST", may overlap with "TEST_RUN_LIST". Example: TEST_IGNORE_LIST="acl".
|
|
TEST_IGNORE_LIST ?=
|
|
|
|
######## SET INCREMENTAL BUILD FLAGS ########
|
|
|
|
# Logic to auto configure build options for optimized builds
|
|
# These will set the default values for: REBUILD_TOOLS, MAX_CPU, REBUILD_TOOLCHAIN, DELTA_BUILD, INCREMENTAL_TOOLCHAIN, ALLOW_TOOLCHAIN_DOWNLOAD_FAIL, and CLEAN_TOOLCHAIN_CONTAINERS
|
|
include $(SCRIPTS_DIR)/incremental_building.mk
|
|
|
|
######## SET REMAINING FLAGS ########
|
|
|
|
UPDATE_TOOLCHAIN_LIST ?= n
|
|
REBUILD_PACKAGES ?= y
|
|
DOWNLOAD_SRPMS ?= n
|
|
ALLOW_SRPM_DOWNLOAD_FAIL ?= n
|
|
RUN_CHECK ?= n
|
|
USE_PREVIEW_REPO ?= n
|
|
DISABLE_UPSTREAM_REPOS ?= n
|
|
DISABLE_DEFAULT_REPOS ?= n
|
|
TOOLCHAIN_CONTAINER_ARCHIVE ?=
|
|
TOOLCHAIN_ARCHIVE ?=
|
|
TOOLCHAIN_SOURCES_ARCHIVE ?=
|
|
CACHE_DIR ?=
|
|
PACKAGE_CACHE_SUMMARY ?=
|
|
IMAGE_CACHE_SUMMARY ?=
|
|
INITRD_CACHE_SUMMARY ?=
|
|
PACKAGE_ARCHIVE ?=
|
|
PACKAGE_BUILD_RETRIES ?= 1
|
|
CHECK_BUILD_RETRIES ?= 1
|
|
EXTRA_BUILD_LAYERS ?= 0
|
|
REFRESH_WORKER_CHROOT ?= y
|
|
# Set to 0 to use the number of logical CPUs.
|
|
CONCURRENT_PACKAGE_BUILDS ?= 0
|
|
# Set to 0 to print all available results.
|
|
NUM_OF_ANALYTICS_RESULTS ?= 10
|
|
CLEANUP_PACKAGE_BUILDS ?= y
|
|
USE_PACKAGE_BUILD_CACHE ?= y
|
|
REBUILD_DEP_CHAINS ?= y
|
|
HYDRATED_BUILD ?= n
|
|
TARGET_ARCH ?=
|
|
ALLOW_TOOLCHAIN_REBUILDS ?= n
|
|
RESOLVE_CYCLES_FROM_UPSTREAM ?= n
|
|
IGNORE_VERSION_TO_RESOLVE_SELFDEP ?= n
|
|
CACHED_PACKAGES_ARCHIVE ?=
|
|
USE_CCACHE ?= n
|
|
|
|
# Tracing & Profiling support: https://go.dev/doc/diagnostics
|
|
ENABLE_CPU_PROFILE ?= n
|
|
ENABLE_MEM_PROFILE ?= n
|
|
ENABLE_TRACE ?= n
|
|
|
|
# Folder defines
|
|
TOOLS_DIR ?= $(toolkit_root)/tools
|
|
TOOL_BINS_DIR ?= $(toolkit_root)/out/tools
|
|
PREVIEW_REPO ?= $(toolkit_root)/repos/mariner-official-preview.repo
|
|
RESOURCES_DIR ?= $(toolkit_root)/resources
|
|
|
|
PROJECT_ROOT ?= $(realpath $(toolkit_root)/..)
|
|
BUILD_DIR ?= $(PROJECT_ROOT)/build
|
|
OUT_DIR ?= $(PROJECT_ROOT)/out
|
|
SPECS_DIR ?= $(PROJECT_ROOT)/SPECS
|
|
CCACHE_DIR ?= $(PROJECT_ROOT)/ccache
|
|
CCACHE_CONFIG ?= $(RESOURCES_DIR)/manifests/package/ccache-configuration.json
|
|
|
|
# Sub-folder defines
|
|
LOGS_DIR ?= $(BUILD_DIR)/logs
|
|
PKGBUILD_DIR ?= $(BUILD_DIR)/pkg_artifacts
|
|
CACHED_RPMS_DIR ?= $(BUILD_DIR)/rpm_cache
|
|
REPO_QUERY_DIR ?= $(BUILD_DIR)/repo_query
|
|
BUILD_SRPMS_DIR ?= $(BUILD_DIR)/INTERMEDIATE_SRPMS
|
|
MACRO_DIR ?= $(BUILD_DIR)/macros
|
|
BUILD_SPECS_DIR ?= $(BUILD_DIR)/INTERMEDIATE_SPECS
|
|
STATUS_FLAGS_DIR ?= $(BUILD_DIR)/make_status
|
|
CHROOT_DIR ?= $(BUILD_DIR)/worker/chroot
|
|
IMAGEGEN_DIR ?= $(BUILD_DIR)/imagegen
|
|
TOOLCHAIN_RPMS_DIR ?= $(BUILD_DIR)/toolchain_rpms
|
|
TIMESTAMP_DIR ?= $(BUILD_DIR)/timestamp
|
|
PROFILE_DIR ?= $(BUILD_DIR)/profile
|
|
|
|
RPMRC_DIR ?= $(MACRO_DIR)/usr/lib/rpm
|
|
|
|
PKGGEN_DIR ?= $(TOOLS_DIR)/pkggen
|
|
TOOLKIT_BINS_DIR ?= $(TOOLS_DIR)/toolkit_bins
|
|
|
|
MANIFESTS_DIR ?= $(RESOURCES_DIR)/manifests
|
|
META_USER_DATA_DIR ?= $(RESOURCES_DIR)/assets/meta-user-data
|
|
SSH_KEY_FILE ?=
|
|
|
|
TOOLCHAIN_MANIFESTS_DIR ?= $(MANIFESTS_DIR)/package
|
|
|
|
RPMS_DIR ?= $(OUT_DIR)/RPMS
|
|
SRPMS_DIR ?= $(OUT_DIR)/SRPMS
|
|
IMAGES_DIR ?= $(OUT_DIR)/images
|
|
|
|
# External source server
|
|
SOURCE_URL ?= https://cblmarinerstorage.blob.core.windows.net/sources/core
|
|
|
|
# Note on order of precedence: When a variable is passed from the commandline (i.e., make PACKAGE_URL_LIST="my list"), append
|
|
# assignments do not take affect without using 'override'. This means that all of the following PACKAGE_URL_LIST values will
|
|
# be ignored if the user sets any value.
|
|
##help:var:PACKAGE_URL_LIST:<urls_list>=Space-separated list of URLs to download toolchain RPM packages from, used to populate the toolchain packages if `REBUILD_TOOLCHAIN=n'. The URLs will replace the default set of URLs. Print default list with 'make -s printvar-PACKAGE_URL_LIST'.
|
|
PACKAGE_URL_LIST ?= https://packages.microsoft.com/cbl-mariner/$(RELEASE_MAJOR_ID)/prod/base/$(build_arch)
|
|
PACKAGE_URL_LIST += https://packages.microsoft.com/cbl-mariner/$(RELEASE_MAJOR_ID)/prod/base/debuginfo/$(build_arch)
|
|
PACKAGE_URL_LIST += https://packages.microsoft.com/cbl-mariner/$(RELEASE_MAJOR_ID)/prod/Microsoft/$(build_arch)
|
|
REPO_LIST ?=
|
|
SRPM_URL_LIST ?= https://packages.microsoft.com/cbl-mariner/$(RELEASE_MAJOR_ID)/prod/base/srpms
|
|
|
|
######## COMMON MAKEFILE UTILITIES ########
|
|
|
|
# Misc function defines
|
|
# Variable prerequisite tracking
|
|
include $(SCRIPTS_DIR)/utils.mk
|
|
|
|
######## REMAINING BUILD FLAGS ########
|
|
|
|
ifneq ($(DAILY_BUILD_ID),)
|
|
$(warning Using Daily Build $(DAILY_BUILD_ID))
|
|
# Ensure build_arch is set
|
|
ifeq ($(build_arch),)
|
|
$(error build_arch must be set when using DAILY_BUILD_ID)
|
|
endif
|
|
# build_arch cannot be directly used because Azure storage do not support container names with '_' char
|
|
ifeq ($(build_arch),x86_64)
|
|
# The actual repo is found at <URL>/, while a duplicate copy of all the rpms can be found at <URL>/built_rpms_all/
|
|
# Include both so that the tools that expect a valid repo work, while the tools that expect a basic URL also work.
|
|
override PACKAGE_URL_LIST := https://mariner3dailydevrepo.blob.core.windows.net/daily-repo-$(DAILY_BUILD_ID)-x86-64/built_rpms_all \
|
|
https://mariner3dailydevrepo.blob.core.windows.net/daily-repo-$(DAILY_BUILD_ID)-x86-64
|
|
override SRPM_URL_LIST := https://mariner3dailydevrepo.blob.core.windows.net/daily-repo-$(DAILY_BUILD_ID)-x86-64/SRPMS
|
|
else
|
|
override PACKAGE_URL_LIST := https://mariner3dailydevrepo.blob.core.windows.net/daily-repo-$(DAILY_BUILD_ID)-aarch64/built_rpms_all \
|
|
https://mariner3dailydevrepo.blob.core.windows.net/daily-repo-$(DAILY_BUILD_ID)-aarch64
|
|
override SRPM_URL_LIST := https://mariner3dailydevrepo.blob.core.windows.net/daily-repo-$(DAILY_BUILD_ID)-aarch64/SRPMS
|
|
endif
|
|
else
|
|
ifeq ($(USE_PREVIEW_REPO),y)
|
|
override PACKAGE_URL_LIST += https://packages.microsoft.com/cbl-mariner/$(RELEASE_MAJOR_ID)/preview/base/$(build_arch)
|
|
override PACKAGE_URL_LIST += https://packages.microsoft.com/cbl-mariner/$(RELEASE_MAJOR_ID)/preview/base/debuginfo/$(build_arch)
|
|
override PACKAGE_URL_LIST += https://packages.microsoft.com/cbl-mariner/$(RELEASE_MAJOR_ID)/preview/Microsoft/$(build_arch)
|
|
override SRPM_URL_LIST += https://packages.microsoft.com/cbl-mariner/$(RELEASE_MAJOR_ID)/preview/base/srpms
|
|
ifneq ($(wildcard $(PREVIEW_REPO)),)
|
|
override REPO_LIST += $(PREVIEW_REPO)
|
|
else
|
|
$(warning )
|
|
$(warning ######################### WARNING #########################)
|
|
$(warning 'USE_PREVIEW_REPO=y' set but '$(PREVIEW_REPO)' is missing. Regenerate toolkit's 'repos' directory. Remove 'USE_PREVIEW_REPO' for core builds.)
|
|
$(warning ######################### WARNING #########################)
|
|
$(warning )
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
CA_CERT ?=
|
|
TLS_CERT ?=
|
|
TLS_KEY ?=
|
|
|
|
##help:var:LOG_LEVEL:{panic,fatal,error,warn,info,debug,trace}=Set logging level for toolkit.
|
|
# panic,fatal,error,warn,info,debug,trace
|
|
LOG_LEVEL ?= info
|
|
##help:var:LOG_COLOR:{always,auto,never}=Set logging color for toolkit terminal output.
|
|
# always,auto,never
|
|
LOG_COLOR ?= auto
|
|
STOP_ON_WARNING ?= n
|
|
STOP_ON_PKG_FAIL ?= n
|
|
STOP_ON_FETCH_FAIL ?= n
|
|
|
|
######## HIGH LEVEL TARGETS ########
|
|
|
|
.PHONY: all clean
|
|
all: toolchain go-tools chroot-tools
|
|
|
|
######## SUBMAKE INCLUDES ########
|
|
|
|
# General help information used by 'help' target; this should be included first so
|
|
# its help will be displayed at the top of the help output.
|
|
include $(SCRIPTS_DIR)/help.mk
|
|
|
|
# Set up for the timestamp feature
|
|
include $(SCRIPTS_DIR)/timestamp.mk
|
|
|
|
# Profiling & Tracing feature
|
|
include $(SCRIPTS_DIR)/profile.mk
|
|
|
|
# Set the variables for build number, distro tag, etc
|
|
include $(SCRIPTS_DIR)/build_tag.mk
|
|
|
|
# go utilities with:
|
|
# go-tools, clean-go-tools, go-tidy-all (tidy go utilities before committing) go-test-coverage
|
|
include $(SCRIPTS_DIR)/tools.mk
|
|
|
|
# Bootstrap the toolchain's compilers and other tools with:
|
|
# toolchain, raw-toolchain, clean-toolchain, check-manifests, check-x86_64-manifests, check-aarch64-manifests
|
|
include $(SCRIPTS_DIR)/toolchain.mk
|
|
|
|
# chroot worker with:
|
|
# chroot-tools clean-chroot-tools
|
|
# macro definitions with:
|
|
# macro-tools clean-macro-tools
|
|
include $(SCRIPTS_DIR)/chroot.mk
|
|
|
|
# Create SRPMS from local SPECS with:
|
|
# input-srpms, clean-input-srpms
|
|
include $(SCRIPTS_DIR)/srpm_pack.mk
|
|
|
|
# Create local build env for building RPMs with:
|
|
# containerized-rpmbuild containerized-rpmbuild-help
|
|
include $(SCRIPTS_DIR)/containerized-build.mk
|
|
|
|
# Expand local SRPMS into sources and SPECS with:
|
|
# expand-specs clean-expand-specs
|
|
include $(SCRIPTS_DIR)/srpm_expand.mk
|
|
|
|
# Create self contained toolkit archive contianing all the required tools with:
|
|
# package-toolkit, clean-package-toolkit
|
|
include $(SCRIPTS_DIR)/toolkit.mk
|
|
|
|
# Fill the cache with rpms from the package server without using package manager or chroot with:
|
|
# pre-cache
|
|
include $(SCRIPTS_DIR)/precache.mk
|
|
|
|
# Run repo query under chroot with:
|
|
# repo-query
|
|
include $(SCRIPTS_DIR)/repoquerywrapper.mk
|
|
|
|
# Create a package build workplan with:
|
|
# workplan, clean-workplan clean-cache
|
|
# Build a package with:
|
|
# build-packages clean-build-packages
|
|
# Either create or consume compressed folders of rpms with:
|
|
# hydrate-rpms, compress-rpms, clean-compress-rpms, compress-srpms, clean-compress-srpms
|
|
include $(SCRIPTS_DIR)/pkggen.mk
|
|
|
|
# Create images with:
|
|
# image, iso, clean-imggen
|
|
include $(SCRIPTS_DIR)/imggen.mk
|
|
|
|
# Add make targets for sodiff to determine if additional packages are required to be recompiled:
|
|
# sodiff-check, build-summary, build-package-summary, fake-built-packages-list, sodiff-setup
|
|
include $(SCRIPTS_DIR)/analysis.mk
|
|
|
|
##help:target:clean=Clean all built files.
|
|
# Each component provides specific clean implementations which clean depends on.
|
|
# They are guaranteed to run first and will verify there are no existing mount points
|
|
# left after a chroot.
|
|
clean:
|
|
rm -rf $(OUT_DIR)
|
|
rm -rf $(BUILD_DIR)
|
|
rm -rf $(toolkit_root)/out
|
|
|
|
######## VARIABLE PRINTING ########
|
|
|
|
# Display Makefile usage help; please consult $(SCRIPTS_DIR)/help.mk for documentation
|
|
# on the format of the comment annotations being extracted here.
|
|
.PHONY: help
|
|
help:
|
|
@sed -ne '/@sed/!s/##help:desc://p' $(MAKEFILE_LIST)
|
|
@sed -ne '/@sed/!s/##help:target-heading://p' $(MAKEFILE_LIST)
|
|
@grep -h "^##help:target:" $(MAKEFILE_LIST) | sed -e "s/^##help:target:\([^=]\+\)=\(.*\)/\1|\2/" | sort | awk -F'|' '{ printf(" \033[3m%-26s\033[0m %s\n", $$1, $$2)}'
|
|
@sed -ne '/@sed/!s/##help:var-heading://p' $(MAKEFILE_LIST)
|
|
@grep -h "^##help:var:" $(MAKEFILE_LIST) | sed -e "s/^##help:var:\([^:]\+\):\([^=]*\)=\(.*\)/\1|\2|\3/" | sort | awk -F'|' '{ printf(" \033[92;3m%s\033[0m=%s\n %s\n\n", $$1, $$2, $$3) }'
|
|
@sed -ne '/@sed/!s/##help:example-heading://p' $(MAKEFILE_LIST)
|
|
@grep -h "^##help:example:" $(MAKEFILE_LIST) | sed -e "s/^##help:example:\(.*\)/ \1/"
|
|
|
|
# Some common version information that is useful to gather. Generally should be run with the Make flag --quiet
|
|
get-version: printvar-RELEASE_VERSION
|
|
get-dist-tag: printvar-DIST_TAG
|
|
get-release-major: printvar-RELEASE_MAJOR_ID
|
|
|
|
# Make an easy way to print out the build variables. These must be the last entries in the makefile so that all other
|
|
# files have their variables inluded
|
|
|
|
# Print out all variables to stdout, either or of the form "<VALUE>" or the verbose form "varname: <VALUE>"
|
|
# printvar-all-vars
|
|
# printvar-verbose-all-vars
|
|
|
|
# Print a specific variable to stdout, using the same format as above
|
|
# printvar-*
|
|
# printvar-verbose-*
|
|
|
|
# Use these targets like so: `my-var=$(make printvar-MY_VAR --quiet)`
|
|
# The --quiet flag is important to avoid printing extra output
|
|
.PHONY: printvar-all-vars printvar-verbose-all-vars
|
|
|
|
# Gather the variables we want to print out, removing any automatic .* variables, and the self reference, along with special characters that may interfere with Make
|
|
sanitize_variables = $(subst ',,$(subst ",,$(subst `,,$(subst \#,,$(subst $$,,$(subst :,,$1))))))
|
|
interesting_variables = $(filter-out .% interesting_variables, $(sort $(call sanitize_variables,$(.VARIABLES))))
|
|
|
|
printvar-all-vars: $(foreach var,$(interesting_variables),printvar-$(var))
|
|
printvar-all-vars: ;
|
|
printvar-verbose-all-vars: $(foreach var,$(interesting_variables),printvar-verbose-$(var))
|
|
printvar-verbose-all-vars: ;
|
|
|
|
printvar-%: ; $(info $($(subst printvar-,,$@)))
|
|
@: # We want to supress 'make: Nothing to be done for ...' so execute a command so make thinks it has done something
|
|
printvar-verbose-%: ; $(info $(subst printvar-verbose-,,$@): $($(subst printvar-verbose-,,$@)))
|
|
@: # We want to supress 'make: Nothing to be done for ...' so execute a command so make thinks it has done something
|