cd2c86eab6
Signed-off-by: Stepan Blyschak stepanb@nvidia.com This PR is part of SONiC Application Extension Depends on #5938 - Why I did it To provide an infrastructure change in order to support SONiC Application Extension feature. - How I did it Label every installable SONiC Docker with a minimal required manifest and auto-generate packages.json file based on installed SONiC images. - How to verify it Build an image, execute the following command: admin@sonic:~$ docker inspect docker-snmp:1.0.0 | jq '.[0].Config.Labels["com.azure.sonic.manifest"]' -r | jq Cat /var/lib/sonic-package-manager/packages.json file to verify all dockers are listed there.
202 lines
7.3 KiB
Plaintext
202 lines
7.3 KiB
Plaintext
###############################################################################
|
|
## FUNCTIONS
|
|
###############################################################################
|
|
|
|
###############################################################################
|
|
## Colored output
|
|
###############################################################################
|
|
|
|
# Enable colored output
|
|
ifeq ($(SONIC_CONFIG_ENABLE_COLORS),y)
|
|
ifeq ($(MAKE_TERMOUT),)
|
|
RED=\033[1;31m
|
|
PURPLE=\033[1;35m
|
|
CYAN=\033[1;36m
|
|
GREEN=\033[1;32m
|
|
GRAY=\033[0m
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(BUILD_LOG_TIMESTAMP),simple)
|
|
PROCESS_LOG_OPTION = -t
|
|
endif
|
|
|
|
# Print red colored output
|
|
# call:
|
|
# log_red message
|
|
log_red = echo -e "$(RED)$(1)$(GRAY)"
|
|
|
|
# Print purple colored output
|
|
# call:
|
|
# log_purple message
|
|
log_purple = echo -e "$(PURPLE)$(1)$(GRAY)"
|
|
|
|
# Print blue colored output
|
|
# call:
|
|
# log_blue message
|
|
log_blue = echo -e "$(CYAN)$(1)$(GRAY)"
|
|
|
|
# Print green colored output
|
|
# call:
|
|
# log_green message
|
|
log_green = echo -e "$(GREEN)$(1)$(GRAY)"
|
|
|
|
###############################################################################
|
|
## Logging
|
|
###############################################################################
|
|
|
|
FLUSH_LOG = rm -f $@.log
|
|
|
|
LOG_SIMPLE = &>> $(PROJECT_ROOT)/$@.log || { [ $$? -eq 0 ] || pushd $(PROJECT_ROOT) > /dev/null ; ./update_screen.sh -e $@ ; popd > /dev/null ; false ; }
|
|
LOG = < /dev/null |& $(PROJECT_ROOT)/scripts/process_log.sh $(PROCESS_LOG_OPTION) &>> $(PROJECT_ROOT)/$@.log ; test $${PIPESTATUS[-2]} -eq 0 || { [ $$? -eq 0 ] || pushd $(PROJECT_ROOT) > /dev/null ; ./update_screen.sh -e $@ ; popd > /dev/null ; false ; }
|
|
|
|
###############################################################################
|
|
## Header and footer for each target
|
|
###############################################################################
|
|
|
|
# Dump targets taht current depends on
|
|
ifeq ($(SONIC_CONFIG_PRINT_DEPENDENCIES),y)
|
|
PRINT_DEPENDENCIES = echo Dependencies for $@ are $^ $(LOG)
|
|
endif
|
|
|
|
# header for each rule
|
|
define HEADER
|
|
@
|
|
$(PRINT_DEPENDENCIES)
|
|
$(FLUSH_LOG)
|
|
./update_screen.sh -a $@ $*
|
|
endef
|
|
|
|
# footer for each rule
|
|
define FOOTER
|
|
./update_screen.sh -d $@ $($*_CACHE_LOADED)
|
|
endef
|
|
|
|
###############################################################################
|
|
## Definition of derived target
|
|
###############################################################################
|
|
|
|
# call:
|
|
# add_derived_package some_deb.deb, some_derived_deb
|
|
define add_derived_package
|
|
$(2)_DEPENDS += $(1)
|
|
$(2)_RDEPENDS += $($(1)_RDEPENDS)
|
|
$(2)_MAIN_DEB = $(1)
|
|
$(1)_DERIVED_DEBS += $(2)
|
|
$(2)_URL = $($(1)_URL)
|
|
$(2)_SRC_PATH = $($(1)_SRC_PATH)
|
|
SONIC_DERIVED_DEBS += $(2)
|
|
endef
|
|
|
|
# call:
|
|
# add_extra_package some_deb.deb, some_extra_deb
|
|
define add_extra_package
|
|
$(2)_MAIN_DEB = $(1)
|
|
$(1)_EXTRA_DEBS += $(2)
|
|
SONIC_EXTRA_DEBS += $(2)
|
|
endef
|
|
|
|
###############################################################################
|
|
## Definition of conflict packages
|
|
###############################################################################
|
|
|
|
# call:
|
|
# add_conflict_package some_deb.deb, conflict_deb
|
|
define add_conflict_package
|
|
$(1)_CONFLICT_DEBS += $(2)
|
|
$(2)_CONFLICT_DEBS += $(1)
|
|
endef
|
|
|
|
###############################################################################
|
|
## Definition of debug dockers
|
|
###############################################################################
|
|
|
|
# call:
|
|
# add_dbg_docker some_docker.gz, some-docker-dbg.gz
|
|
define add_dbg_docker
|
|
$(2)_PATH = $($(1)_PATH)
|
|
$(2)_DBG_DEPENDS += $($(1)_DBG_DEPENDS)
|
|
$(2)_DBG_IMAGE_PACKAGES += $($(1)_DBG_IMAGE_PACKAGES)
|
|
$(2)_PYTHON_DEBS += $($(1)_PYTHON_DEBS)
|
|
$(2)_PYTHON_WHEELS += $($(1)_PYTHON_WHEELS)
|
|
$(2)_LOAD_DOCKERS += $($(1)_LOAD_DOCKERS)
|
|
$(2)_CACHE_MODE += $($(1)_CACHE_MODE)
|
|
$(2)_DEP_FLAGS += $($(1)_DEP_FLAGS)
|
|
$(2)_DEP_FILES += $($(1)_DEP_FILES)
|
|
$(2)_SMDEP_FILES += $($(1)_SMDEP_FILES)
|
|
$(2)_SMDEP_PATHS += $($(1)_SMDEP_PATHS)
|
|
$(2)_DEPENDS += $($(1)_DEPENDS)
|
|
$(2)_RDEPENDS += $($(1)_RDEPENDS)
|
|
$(2)_MAIN_DOCKER = $(1)
|
|
$(1)_DBG_DOCKER += $(2)
|
|
SONIC_DBG_DOCKERS += $(2)
|
|
endef
|
|
|
|
|
|
|
|
###############################################################################
|
|
## Utility functions
|
|
###############################################################################
|
|
# Recursive wildcard function
|
|
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
|
|
|
|
expand = $(foreach d,$(1),$(call expand,$($(d)_$(2)),$(2))) $(1)
|
|
|
|
###############################################################################
|
|
## Uninstall debs
|
|
###############################################################################
|
|
define UNINSTALL_DEBS
|
|
if [ -n "$(1)" ]; then \
|
|
while true; do \
|
|
if mkdir $(DEBS_PATH)/dpkg_lock &> /dev/null; then \
|
|
{ sudo DEBIAN_FRONTEND=noninteractive dpkg -P $(foreach deb,$(1),$(firstword $(subst _, ,$(basename $(deb))))) $(LOG) && rm -d $(DEBS_PATH)/dpkg_lock && break; } || { rm -d $(DEBS_PATH)/dpkg_lock && exit 1 ; } \
|
|
fi; \
|
|
done; \
|
|
fi
|
|
endef
|
|
|
|
###############################################################################
|
|
## Setup overlay fs for dpkg admin directory /var/lib/dpkg
|
|
###############################################################################
|
|
define SETUP_OVERLAYFS_FOR_DPKG_ADMINDIR
|
|
upperdir=$(shell mktemp -d -p $(DPKG_ADMINDIR_PATH))
|
|
workdir=$(shell mktemp -d -p $(DPKG_ADMINDIR_PATH))
|
|
mergedir=$(shell mktemp -d -p $(DPKG_ADMINDIR_PATH))
|
|
sudo mount -t overlay overlay -olowerdir=/var/lib/dpkg,upperdir=$$upperdir,workdir=$$workdir $$mergedir
|
|
export SONIC_DPKG_ADMINDIR=$$mergedir
|
|
trap "sudo umount $$mergedir && rm -rf $$mergedir $$upperdir $$workdir" EXIT
|
|
endef
|
|
|
|
|
|
###############################################################################
|
|
## Manifest generation routine
|
|
## TODO: changelog generation
|
|
###############################################################################
|
|
# call:
|
|
# generate_manifest some_docker.gz, version_suffix
|
|
define generate_manifest
|
|
$(eval export version=$($(1).gz_VERSION)$(2))
|
|
$(eval export name=$($(1).gz_CONTAINER_NAME))
|
|
$(eval export package_name=$($(1).gz_PACKAGE_NAME))
|
|
$(eval export asic_service=$(shell [ -f files/build_templates/per_namespace/$(name).service.j2 ] && echo true || echo false))
|
|
$(eval export host_service=$(shell [ -f files/build_templates/$(name).service.j2 ] && echo true || echo false))
|
|
$(eval export depends=$($(1).gz_PACKAGE_DEPENDS))
|
|
$(eval export requires=$($(1).gz_SERVICE_REQUIRES))
|
|
$(eval export after=$($(1).gz_SERVICE_AFTER))
|
|
$(eval export before=$($(1).gz_SERVICE_BEFORE))
|
|
$(eval export dependent_of=$($(1).gz_SERVICE_DEPENDENT_OF))
|
|
$(eval export privileged=$($(1).gz_CONTAINER_PRIVILEGED))
|
|
$(eval export volumes=$($(1).gz_CONTAINER_VOLUMES))
|
|
$(eval export tmpfs=$($(1).gz_CONTAINER_TMPFS))
|
|
$(eval export config_cli_plugin=$($(1).gz_CLI_CONFIG_PLUGIN))
|
|
$(eval export show_cli_plugin=$($(1).gz_CLI_SHOW_PLUGIN))
|
|
j2 $($*.gz_PATH)/Dockerfile.j2 > $($(1).gz_PATH)/Dockerfile
|
|
j2 --customize scripts/j2cli/json_filter.py files/build_templates/manifest.json.j2 > $($(1).gz_PATH)/manifest.common.json
|
|
if [ -f $($*.gz_PATH)/manifest.part.json.j2 ]; then
|
|
j2 --customize scripts/j2cli/json_filter.py $($(1).gz_PATH)/manifest.part.json.j2 > $($(1).gz_PATH)/manifest.part.json
|
|
jq -s '.[0] * .[1]' $($(1).gz_PATH)/manifest.common.json $($(1).gz_PATH)/manifest.part.json > $($(1).gz_PATH)/manifest.json
|
|
else
|
|
mv $($(1).gz_PATH)/manifest.common.json $($(1).gz_PATH)/manifest.json
|
|
fi
|
|
endef
|