From d7b96dfdf1a241035a372326c5c8e4769efe4a9f Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Fri, 28 May 2021 20:16:02 +0300 Subject: [PATCH] [sonic-sdk] add sonic sdk and sonic sdk buildenv (#6712) - Why I did it To give SONiC Application Extension developers an environment to run and develop their apps. - How I did it Created sonic-sdk and sonic-sdk-buildenv dockers and their dbg versions. - How to verify it Build: $ make -f slave target/sonic-sdk.gz target/sonic-sdk-buildenv.gz --- build_debian.sh | 19 ++++---- .../docker-sonic-sdk-buildenv/Dockerfile.j2 | 43 +++++++++++++++++++ dockers/docker-sonic-sdk/Dockerfile.j2 | 29 +++++++++++++ files/build_templates/sonic_version.yml.j2 | 20 +++++++++ .../vs/sonic-version/build_sonic_version.sh | 15 +++---- .../vs/sonic-version/sonic_version.yml.j2 | 1 + rules/docker-config-engine-buster.mk | 4 +- rules/docker-sonic-sdk-buildenv.dep | 12 ++++++ rules/docker-sonic-sdk-buildenv.mk | 29 +++++++++++++ rules/docker-sonic-sdk.dep | 12 ++++++ rules/docker-sonic-sdk.mk | 24 +++++++++++ rules/functions | 2 + rules/sairedis.mk | 23 ++++++---- rules/sonic-utilities.mk | 6 ++- rules/swss-common.mk | 15 ++++--- slave.mk | 12 +++++- 16 files changed, 230 insertions(+), 36 deletions(-) create mode 100755 dockers/docker-sonic-sdk-buildenv/Dockerfile.j2 create mode 100755 dockers/docker-sonic-sdk/Dockerfile.j2 create mode 100644 files/build_templates/sonic_version.yml.j2 create mode 120000 platform/vs/sonic-version/sonic_version.yml.j2 create mode 100644 rules/docker-sonic-sdk-buildenv.dep create mode 100644 rules/docker-sonic-sdk-buildenv.mk create mode 100644 rules/docker-sonic-sdk.dep create mode 100644 rules/docker-sonic-sdk.mk diff --git a/build_debian.sh b/build_debian.sh index c3e8e94544..7c2770cc73 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -474,16 +474,15 @@ fi ## Version file sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic -sudo tee $FILESYSTEM_ROOT/etc/sonic/sonic_version.yml > /dev/null < /dev/null < $1 diff --git a/platform/vs/sonic-version/sonic_version.yml.j2 b/platform/vs/sonic-version/sonic_version.yml.j2 new file mode 120000 index 0000000000..2bbebeb225 --- /dev/null +++ b/platform/vs/sonic-version/sonic_version.yml.j2 @@ -0,0 +1 @@ +../../../files/build_templates/sonic_version.yml.j2 \ No newline at end of file diff --git a/rules/docker-config-engine-buster.mk b/rules/docker-config-engine-buster.mk index b386c882f4..f7232b23d6 100644 --- a/rules/docker-config-engine-buster.mk +++ b/rules/docker-config-engine-buster.mk @@ -11,7 +11,9 @@ $(DOCKER_CONFIG_ENGINE_BUSTER)_LOAD_DOCKERS += $(DOCKER_BASE_BUSTER) $(DOCKER_CONFIG_ENGINE_BUSTER)_FILES += $(SWSS_VARS_TEMPLATE) $(DOCKER_CONFIG_ENGINE_BUSTER)_FILES += $($(SONIC_CTRMGRD)_CONTAINER_SCRIPT) -$(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS = $($(DOCKER_BASE_BUSTER)_DBG_DEPENDS) +$(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS = $($(DOCKER_BASE_BUSTER)_DBG_DEPENDS) \ + $(LIBSWSSCOMMON_DBG) \ + $(LIBHIREDIS_DBG) $(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES = $($(DOCKER_BASE_BUSTER)_DBG_IMAGE_PACKAGES) SONIC_DOCKER_IMAGES += $(DOCKER_CONFIG_ENGINE_BUSTER) diff --git a/rules/docker-sonic-sdk-buildenv.dep b/rules/docker-sonic-sdk-buildenv.dep new file mode 100644 index 0000000000..56f1c0ff7a --- /dev/null +++ b/rules/docker-sonic-sdk-buildenv.dep @@ -0,0 +1,12 @@ + +DPATH := $($(DOCKER_SONIC_SDK_BUILDENV)_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/docker-sonic-sdk-buildenv.mk rules/docker-sonic-sdk-buildenv.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(DPATH)) + +$(DOCKER_SONIC_SDK_BUILDENV)_CACHE_MODE := GIT_CONTENT_SHA +$(DOCKER_SONIC_SDK_BUILDENV)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(DOCKER_SONIC_SDK_BUILDENV)_DEP_FILES := $(DEP_FILES) + +$(eval $(call add_dbg_docker,$(DOCKER_SONIC_SDK_BUILDENV),$(DOCKER_SONIC_SDK_BUILDENV_DBG))) + diff --git a/rules/docker-sonic-sdk-buildenv.mk b/rules/docker-sonic-sdk-buildenv.mk new file mode 100644 index 0000000000..52e11b815c --- /dev/null +++ b/rules/docker-sonic-sdk-buildenv.mk @@ -0,0 +1,29 @@ +# SONiC SDK Docker Image + +DOCKER_SONIC_SDK_BUILDENV_STEM = sonic-sdk-buildenv +DOCKER_SONIC_SDK_BUILDENV = $(DOCKER_SONIC_SDK_BUILDENV_STEM).gz +DOCKER_SONIC_SDK_BUILDENV_DBG = $(DOCKER_SONIC_SDK_BUILDENV_STEM)-$(DBG_IMAGE_MARK).gz + +$(DOCKER_SONIC_SDK_BUILDENV)_PATH = $(DOCKERS_PATH)/docker-sonic-sdk-buildenv + +$(DOCKER_SONIC_SDK_BUILDENV)_DEPENDS += $(LIBSAIVS) \ + $(LIBSAIVS_DEV) \ + $(LIBSAIREDIS_DEV) \ + $(LIBSAIMETADATA_DEV) \ + $(LIBSWSSCOMMON_DEV) \ + $(LIBHIREDIS_DEV) \ + $(LIBNL3_DEV) \ + $(LIBNL_GENL3_DEV) \ + $(LIBNL_ROUTE3_DEV) \ + $(LIBNL_NF3_DEV) \ + $(LIBNL_CLI_DEV) + +$(DOCKER_SONIC_SDK_BUILDENV)_DBG_DEPENDS = $($(DOCKER_SONIC_SDK)_DBG_DEPENDS) \ + $(LIBSAIVS_DBG) +$(DOCKER_SONIC_SDK_BUILDENV)_DBG_IMAGE_PACKAGES = $($(DOCKER_SONIC_SDK)_DBG_IMAGE_PACKAGES) + + +$(DOCKER_SONIC_SDK_BUILDENV)_LOAD_DOCKERS += $(DOCKER_SONIC_SDK) + +SONIC_DOCKER_IMAGES += $(DOCKER_SONIC_SDK_BUILDENV) +SONIC_DOCKER_DBG_IMAGES += $(DOCKER_SONIC_SDK_BUILDENV_DBG) diff --git a/rules/docker-sonic-sdk.dep b/rules/docker-sonic-sdk.dep new file mode 100644 index 0000000000..d9507aa16b --- /dev/null +++ b/rules/docker-sonic-sdk.dep @@ -0,0 +1,12 @@ + +DPATH := $($(DOCKER_SONIC_SDK)_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/docker-sonic-sdk.mk rules/docker-sonic-sdk.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(DPATH)) + +$(DOCKER_SONIC_SDK)_CACHE_MODE := GIT_CONTENT_SHA +$(DOCKER_SONIC_SDK)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(DOCKER_SONIC_SDK)_DEP_FILES := $(DEP_FILES) + +$(eval $(call add_dbg_docker,$(DOCKER_SONIC_SDK),$(DOCKER_SONIC_SDK_DBG))) + diff --git a/rules/docker-sonic-sdk.mk b/rules/docker-sonic-sdk.mk new file mode 100644 index 0000000000..b6a185c6d9 --- /dev/null +++ b/rules/docker-sonic-sdk.mk @@ -0,0 +1,24 @@ +# SONiC SDK Docker Image + +DOCKER_SONIC_SDK_STEM = sonic-sdk +DOCKER_SONIC_SDK = $(DOCKER_SONIC_SDK_STEM).gz +DOCKER_SONIC_SDK_DBG = $(DOCKER_SONIC_SDK_STEM)-$(DBG_IMAGE_MARK).gz + +$(DOCKER_SONIC_SDK)_PATH = $(DOCKERS_PATH)/docker-sonic-sdk + +$(DOCKER_SONIC_SDK)_DEPENDS += $(LIBSAIREDIS) \ + $(LIBSAIMETADATA) +$(DOCKER_SONIC_SDK)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER) + +$(DOCKER_SONIC_SDK)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS) \ + $(LIBSAIREDIS_DBG) \ + $(LIBSAIMETADATA_DBG) +$(DOCKER_SONIC_SDK)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES) + +SONIC_DOCKER_IMAGES += $(DOCKER_SONIC_SDK) +SONIC_DOCKER_DBG_IMAGES += $(DOCKER_SONIC_SDK_DBG) + +$(DOCKER_SONIC_SDK)_LABELS += com.azure.sonic.versions.libswsscommon=$(LIBSWSSCOMMON_VERSION) +$(DOCKER_SONIC_SDK)_LABELS += com.azure.sonic.versions.libsairedis=$(LIBSAIREDIS_VERSION) + +$(DOCKER_SONIC_SDK)_FILES += $(SUPERVISOR_PROC_EXIT_LISTENER_SCRIPT) diff --git a/rules/functions b/rules/functions index 479f5f70c4..705cb654e7 100644 --- a/rules/functions +++ b/rules/functions @@ -85,6 +85,8 @@ $(2)_MAIN_DEB = $(1) $(1)_DERIVED_DEBS += $(2) $(2)_URL = $($(1)_URL) $(2)_SRC_PATH = $($(1)_SRC_PATH) +$(2)_NAME = $($(1)_NAME) +$(2)_VERSION = $($(1)_VERSION) SONIC_DERIVED_DEBS += $(2) endef diff --git a/rules/sairedis.mk b/rules/sairedis.mk index 67148d1b58..1d38a74b14 100644 --- a/rules/sairedis.mk +++ b/rules/sairedis.mk @@ -1,41 +1,46 @@ # sairedis package -LIBSAIREDIS = libsairedis_1.0.0_$(CONFIGURED_ARCH).deb +LIBSAIREDIS_VERSION = 1.0.0 +LIBSAIREDIS_NAME = libsairedis + +LIBSAIREDIS = $(LIBSAIREDIS_NAME)_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb $(LIBSAIREDIS)_DPKG_TARGET = binary-sairedis $(LIBSAIREDIS)_SRC_PATH = $(SRC_PATH)/sonic-sairedis +$(LIBSAIREDIS)_VERSION = $(LIBSAIREDIS_VERSION) +$(LIBSAIREDIS)_NAME = $(LIBSAIREDIS_NAME) $(LIBSAIREDIS)_DEPENDS += $(LIBSWSSCOMMON_DEV) $(LIBSAIREDIS)_RDEPENDS += $(LIBSWSSCOMMON) $(LIBSAIREDIS)_DEB_BUILD_OPTIONS = nocheck SONIC_DPKG_DEBS += $(LIBSAIREDIS) -LIBSAIREDIS_DEV = libsairedis-dev_1.0.0_$(CONFIGURED_ARCH).deb +LIBSAIREDIS_DEV = $(LIBSAIREDIS_NAME)-dev_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DEV))) -LIBSAIVS = libsaivs_1.0.0_$(CONFIGURED_ARCH).deb +LIBSAIVS = libsaivs_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS))) -LIBSAIVS_DEV = libsaivs-dev_1.0.0_$(CONFIGURED_ARCH).deb +LIBSAIVS_DEV = libsaivs-dev_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS_DEV))) $(LIBSAIVS_DEV)_DEPENDS += $(LIBSAIVS) -LIBSAIMETADATA = libsaimetadata_1.0.0_$(CONFIGURED_ARCH).deb +LIBSAIMETADATA = libsaimetadata_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA))) -LIBSAIMETADATA_DEV = libsaimetadata-dev_1.0.0_$(CONFIGURED_ARCH).deb +LIBSAIMETADATA_DEV = libsaimetadata-dev_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb $(LIBSAIMETADATA_DEV)_DEPENDS += $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DEV))) -LIBSAIREDIS_DBG = libsairedis-dbg_1.0.0_$(CONFIGURED_ARCH).deb +LIBSAIREDIS_DBG = $(LIBSAIREDIS_NAME)-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb $(LIBSAIREDIS_DBG)_DEPENDS += $(LIBSAIREDIS) $(LIBSAIREDIS_DBG)_RDEPENDS += $(LIBSAIREDIS) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DBG))) -LIBSAIVS_DBG = libsaivs-dbg_1.0.0_$(CONFIGURED_ARCH).deb +LIBSAIVS_DBG = libsaivs-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb $(LIBSAIVS_DBG)_DEPENDS += $(LIBSAIVS) $(LIBSAIVS_DBG)_RDEPENDS += $(LIBSAIVS) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS_DBG))) -LIBSAIMETADATA_DBG = libsaimetadata-dbg_1.0.0_$(CONFIGURED_ARCH).deb +LIBSAIMETADATA_DBG = libsaimetadata-dbg_$(LIBSAIREDIS_VERSION)_$(CONFIGURED_ARCH).deb $(LIBSAIMETADATA_DBG)_DEPENDS += $(LIBSAIMETADATA) $(LIBSAIMETADATA_DBG)_RDEPENDS += $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DBG))) diff --git a/rules/sonic-utilities.mk b/rules/sonic-utilities.mk index 4e5b5adbc5..519f633cc7 100644 --- a/rules/sonic-utilities.mk +++ b/rules/sonic-utilities.mk @@ -1,8 +1,12 @@ # sonic utilities package -SONIC_UTILITIES_PY3 = sonic_utilities-1.2-py3-none-any.whl +SONIC_UTILITIES_PY3_VERSION = 1.2 +SONIC_UTILITIES_PY3_NAME = sonic_utilities +SONIC_UTILITIES_PY3 = $(SONIC_UTILITIES_PY3_NAME)-$(SONIC_UTILITIES_PY3_VERSION)-py3-none-any.whl $(SONIC_UTILITIES_PY3)_SRC_PATH = $(SRC_PATH)/sonic-utilities $(SONIC_UTILITIES_PY3)_PYTHON_VERSION = 3 +$(SONIC_UTILITIES_PY3)_NAME = $(SONIC_UTILITIES_PY3_NAME) +$(SONIC_UTILITIES_PY3)_VERSION = $(SONIC_UTILITIES_PY3_VERSION) $(SONIC_UTILITIES_PY3)_DEPENDS += $(SONIC_PY_COMMON_PY3) \ $(SWSSSDK_PY3) \ $(SONIC_CONFIG_ENGINE_PY3) \ diff --git a/rules/swss-common.mk b/rules/swss-common.mk index 8a319ea62b..09dc312277 100644 --- a/rules/swss-common.mk +++ b/rules/swss-common.mk @@ -1,7 +1,12 @@ # libswsscommon package -LIBSWSSCOMMON = libswsscommon_1.0.0_$(CONFIGURED_ARCH).deb +LIBSWSSCOMMON_VERSION = 1.0.0 +LIBSWSSCOMMON_NAME = libswsscommon + +LIBSWSSCOMMON = $(LIBSWSSCOMMON_NAME)_$(LIBSWSSCOMMON_VERSION)_$(CONFIGURED_ARCH).deb $(LIBSWSSCOMMON)_SRC_PATH = $(SRC_PATH)/sonic-swss-common +$(LIBSWSSCOMMON)_VERSION = $(LIBSWSSCOMMON_VERSION) +$(LIBSWSSCOMMON)_NAME = $(LIBSWSSCOMMON_NAME) $(LIBSWSSCOMMON)_DEPENDS += $(LIBHIREDIS_DEV) $(LIBNL3_DEV) $(LIBNL_GENL3_DEV) \ $(LIBNL_ROUTE3_DEV) $(LIBNL_NF3_DEV) \ $(LIBNL_CLI_DEV) @@ -9,16 +14,16 @@ $(LIBSWSSCOMMON)_RDEPENDS += $(LIBHIREDIS) $(LIBNL3) $(LIBNL_GENL3) \ $(LIBNL_ROUTE3) $(LIBNL_NF3) $(LIBNL_CLI) SONIC_DPKG_DEBS += $(LIBSWSSCOMMON) -LIBSWSSCOMMON_DEV = libswsscommon-dev_1.0.0_$(CONFIGURED_ARCH).deb +LIBSWSSCOMMON_DEV = $(LIBSWSSCOMMON_NAME)-dev_$(LIBSWSSCOMMON_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(LIBSWSSCOMMON_DEV))) -PYTHON_SWSSCOMMON = python-swsscommon_1.0.0_$(CONFIGURED_ARCH).deb +PYTHON_SWSSCOMMON = python-swsscommon_$(LIBSWSSCOMMON_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(PYTHON_SWSSCOMMON))) -PYTHON3_SWSSCOMMON = python3-swsscommon_1.0.0_$(CONFIGURED_ARCH).deb +PYTHON3_SWSSCOMMON = python3-swsscommon_$(LIBSWSSCOMMON_VERSION)_$(CONFIGURED_ARCH).deb $(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(PYTHON3_SWSSCOMMON))) -LIBSWSSCOMMON_DBG = libswsscommon-dbg_1.0.0_$(CONFIGURED_ARCH).deb +LIBSWSSCOMMON_DBG = $(LIBSWSSCOMMON_NAME)-dbg_$(LIBSWSSCOMMON_VERSION)_$(CONFIGURED_ARCH).deb $(LIBSWSSCOMMON_DBG)_DEPENDS += $(LIBSWSSCOMMON) $(LIBSWSSCOMMON_DBG)_RDEPENDS += $(LIBSWSSCOMMON) $(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(LIBSWSSCOMMON_DBG))) diff --git a/slave.mk b/slave.mk index 9cce5392cc..3316b30ba2 100644 --- a/slave.mk +++ b/slave.mk @@ -747,6 +747,10 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_whls=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_PYTHON_WHEELS)))\n" | awk '!a[$$0]++')) $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_dbgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DBG_PACKAGES)))\n" | awk '!a[$$0]++')) $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_pkgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_APT_PACKAGES)))\n" | awk '!a[$$0]++')) + # Label docker image with componenets versions + $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_labels=$(foreach component,$($*.gz_DEPENDS) $($*.gz_PYTHON_DEBS) $($*.gz_PYTHON_WHEELS),\ + $(shell [[ ! -z "$($(component)_VERSION)" && ! -z "$($(component)_NAME)" ]] && \ + echo "--label com.azure.sonic.versions.$($(component)_NAME)=$($(component)_VERSION)"))) j2 $($*.gz_PATH)/Dockerfile.j2 > $($*.gz_PATH)/Dockerfile $(call generate_manifest,$*) # Prepare docker build info @@ -768,6 +772,7 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform --build-arg image_version=$(SONIC_IMAGE_VERSION) \ --label com.azure.sonic.manifest="$$(cat $($*.gz_PATH)/manifest.json)" \ --label Tag=$(SONIC_IMAGE_VERSION) \ + $($(subst -,_,$(notdir $($*.gz_PATH)))_labels) \ -t $* $($*.gz_PATH) $(LOG) scripts/collect_docker_version_files.sh $* $(TARGET_PATH) docker save $* | gzip -c > $@ @@ -835,7 +840,8 @@ SONIC_TARGET_LIST += $(addprefix $(TARGET_PATH)/, $(DOCKER_DBG_IMAGES)) DOCKER_LOAD_TARGETS = $(addsuffix -load,$(addprefix $(TARGET_PATH)/, \ $(SONIC_SIMPLE_DOCKER_IMAGES) \ - $(DOCKER_IMAGES))) + $(DOCKER_IMAGES) \ + $(DOCKER_DBG_IMAGES))) $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TARGET_PATH)/$$*.gz $(HEADER) @@ -944,7 +950,9 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ export python_swss_debs+=" $(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(LIBSWSSCOMMON)) $(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(PYTHON_SWSSCOMMON)) $(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(PYTHON3_SWSSCOMMON))" export sonic_utilities_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_UTILITIES_PY3))" export sonic_host_services_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_HOST_SERVICES_PY3))" - + export components="$(foreach component,$(notdir $^),\ + $(shell [[ ! -z '$($(component)_VERSION)' && ! -z '$($(component)_NAME)' ]] && \ + echo $($(component)_NAME)==$($(component)_VERSION)))" $(foreach docker, $($*_DOCKERS),\ export docker_image="$(docker)" export docker_image_name="$(basename $(docker))"