| # |
| # Copyright 2020-present Open Networking Foundation |
| # |
| # 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 default shell |
| SHELL := /bin/bash -e -o pipefail |
| |
| # Variables |
| VERSION ?= $(shell cat ./VERSION) |
| CURRENT_UID := $(shell id -u) |
| CURRENT_GID := $(shell id -g) |
| MKFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) |
| CURRENT_DIR := $(patsubst %/,%,$(dir $(MKFILE_PATH))) |
| LOCAL_APPS := local-apps |
| |
| # Docker related |
| DOCKER_REGISTRY ?= |
| DOCKER_REPOSITORY ?= |
| DOCKER_BUILD_ARGS ?= |
| DOCKER_TAG ?= ${VERSION} |
| DOCKER_MVN_TAG := 3.6.3-openjdk-11-slim |
| DOCKER_MVN_IMAGE := maven:${DOCKER_MVN_TAG} |
| |
| # Docker labels. Only set ref and commit date if committed |
| DOCKER_LABEL_VCS_URL ?= $(shell git remote get-url $(shell git remote)) |
| DOCKER_LABEL_BUILD_DATE ?= $(shell date -u "+%Y-%m-%dT%H:%M:%SZ") |
| DOCKER_LABEL_COMMIT_DATE = $(shell git show -s --format=%cd --date=iso-strict HEAD) |
| |
| ifeq ($(shell git ls-files --others --modified --exclude-standard 2>/dev/null | wc -l | sed -e 's/ //g'),0) |
| DOCKER_LABEL_VCS_REF = $(shell git rev-parse HEAD) |
| else |
| DOCKER_LABEL_VCS_REF = $(shell git rev-parse HEAD)+dirty |
| endif |
| |
| # ONOS related |
| ONOS_VERSION ?= $(shell cat ./ONOS_VERSION) |
| ONOS_DOCKER_TAG ?= ${ONOS_VERSION} |
| ONOS_IMAGENAME := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}tost-onos:${ONOS_DOCKER_TAG} |
| ONOS_BRANCH ?= |
| ONOS_REVIEW ?= |
| export ONOS_ROOT := $(shell pwd)/onos |
| ONOS_PROFILE := "tost" |
| KARAF_VERSION := 4.2.9 |
| |
| # TOST related |
| TOST_IMAGENAME := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}tost:${DOCKER_TAG} |
| |
| # Trellis-Control related |
| TRELLIS_CONTROL_BRANCH ?= |
| TRELLIS_CONTROL_REVIEW ?= |
| TRELLIS_CONTROL_MVN ?= |
| TRELLIS_CONTROL_ROOT := $(shell pwd)/trellis-control |
| TRELLIS_CONTROL_GROUPID := org.onosproject |
| TRELLIS_CONTROL_ARTIFACTID := segmentrouting-oar |
| TRELLIS_CONTROL_ARTIFACT := ${TRELLIS_CONTROL_GROUPID}:${TRELLIS_CONTROL_ARTIFACTID} |
| TRELLIS_CONTROL_VERSION := 3.0.0-SNAPSHOT |
| |
| # Trellis-T3 related |
| TRELLIS_T3_BRANCH ?= |
| TRELLIS_T3_REVIEW ?= |
| TRELLIS_T3_MVN ?= |
| TRELLIS_T3_ROOT := $(shell pwd)/trellis-t3 |
| TRELLIS_T3_GROUPID := org.onosproject |
| TRELLIS_T3_ARTIFACTID := t3-app |
| TRELLIS_T3_ARTIFACT := ${TRELLIS_T3_GROUPID}:${TRELLIS_T3_ARTIFACTID} |
| TRELLIS_T3_VERSION := 3.0.0-SNAPSHOT |
| |
| # Fabric-Tofino related |
| FABRIC_TOFINO_BRANCH ?= |
| FABRIC_TOFINO_REVIEW ?= |
| FABRIC_TOFINO_MVN ?= |
| FABRIC_TOFINO_ROOT := $(shell pwd)/fabric-tofino |
| FABRIC_TOFINO_GROUPID := org.opencord |
| FABRIC_TOFINO_ARTIFACTID := fabric-tofino |
| FABRIC_TOFINO_ARTIFACT := ${FABRIC_TOFINO_GROUPID}:${FABRIC_TOFINO_ARTIFACTID} |
| FABRIC_TOFINO_VERSION := 1.1.1-SNAPSHOT |
| FABRIC_TOFINO_TARGETS := clean fabric-spgw |
| export SDE_DOCKER_IMG := opennetworking/bf-sde:9.0.0-p4c |
| export P4CFLAGS := "-DS1U_SGW_PREFIX='(8w192++8w0++8w0++8w0)' -DS1U_SGW_PREFIX_LEN=8" |
| |
| # Up4 related |
| UP4_BRANCH ?= |
| OMECPROJECT_API ?= |
| UP4_ROOT := $(shell pwd)/up4 |
| UP4_ARTIFACTID := up4-app |
| UP4_VERSION := 1.0.0-SNAPSHOT |
| UP4_TARGETS := _prepare_app_build |
| ifeq ($(OMECPROJECT_API),) |
| UP4_REPO = https://github.com/omec-project/up4.git |
| else |
| UP4_REPO = https://omecproject:${OMECPROJECT_API}@github.com/omec-project/up4.git |
| endif |
| |
| # Kafka-onos related |
| KAFKA_ONOS_BRANCH ?= |
| KAKFA_ONOS_REVIEW ?= |
| KAFKA_ONOS_MVN ?= |
| KAFKA_ONOS_ROOT := $(shell pwd)/kafka-onos |
| KAFKA_ONOS_GROUPID := org.opencord |
| KAFKA_ONOS_ARTIFACTID := kafka |
| KAFKA_ONOS_ARTIFACT := ${KAFKA_ONOS_GROUPID}:${KAFKA_ONOS_ARTIFACTID} |
| KAFKA_ONOS_VERSION := 2.4.0-SNAPSHOT |
| |
| .PHONY: |
| |
| .SILENT: up4 |
| |
| # This should to be the first and default target in this Makefile |
| help: ## : Print this help |
| @echo "Usage: make [<target>]" |
| @echo "where available targets are:" |
| @echo |
| @grep '^[[:alnum:]_-]*:.* ##' $(MAKEFILE_LIST) \ |
| | sort | awk 'BEGIN {FS=":.* ## "}; {printf "%-25s %s\n", $$1, $$2};' |
| @echo |
| @echo "Environment variables:" |
| @echo "ONOS_BRANCH : Define to use the following branch to build the image" |
| @echo "ONOS_REVIEW : Define to use the following review to build the image" |
| @echo "TRELLIS_CONTROL_BRANCH : Define to use the following branch to build the image" |
| @echo "TRELLIS_CONTROL_REVIEW : Define to use the following review to build the image" |
| @echo "TRELLIS_CONTROL_MVN : Define to download the app using mvn" |
| @echo "TRELLIS_T3_BRANCH : Define to use the following branch to build the image" |
| @echo "TRELLIS_T3_REVIEW : Define to use the following review to build the image" |
| @echo "TRELLIS_T3_MVN : Define to download the app using mvn" |
| @echo "FABRIC_TOFINO_BRANCH : Define to use the following branch to build the image" |
| @echo "FABRIC_TOFINO_REVIEW : Define to use the following review to build the image" |
| @echo "FABRIC_TOFINO_MVN : Define to download the app using mvn" |
| @echo "UP4_BRANCH : Define to use the following branch to build the image" |
| @echo "KAFKA_ONOS_BRANCH : Define to use the following branch to build the image" |
| @echo "KAFKA_ONOS_REVIEW : Define to use the following review to build the image" |
| @echo "KAFKA_ONOS_MVN : Define to download the app using mvn" |
| @echo "" |
| @echo "'onos' clones onos if it does not exist in the workspace." |
| @echo "Uses current workspace unless above vars are defined." |
| @echo "" |
| @echo "'trellis-control' clones trellis-control if it does not exist in the workspace." |
| @echo "Uses current workspace unless above vars are defined." |
| @echo "" |
| @echo "'trellis-t3' clones trellis-t3 if it does not exist in the workspace." |
| @echo "Uses current workspace unless above vars are defined." |
| @echo "" |
| @echo "'fabric-tofino' clones fabric-tofino if it does not exist in the workspace." |
| @echo "Uses current workspace unless above vars are defined." |
| @echo "" |
| @echo "'up4' clones up4 if it does not exist in the workspace." |
| @echo "Uses current workspace unless above vars are defined." |
| @echo "" |
| @echo "'kafka-onos' clones kafka-onos if it does not exist in the workspace." |
| @echo "Uses current workspace unless above vars are" |
| @echo "" |
| |
| ## Make targets |
| |
| mvn_settings.xml: mvn_settings.sh ## : Builds mvn_settings file for proxy |
| @./$< |
| |
| local-apps: ## : Creates the folder that will host the oar file |
| mkdir -p ${LOCAL_APPS}/ |
| |
| trellis-control: ## : Checkout trellis-control code |
| # Clones trellis-control if it does not exist |
| if [ ! -d "trellis-control" ]; then \ |
| git clone https://gerrit.onosproject.org/trellis-control; \ |
| fi |
| # Both are not supported |
| ifdef TRELLIS_CONTROL_BRANCH |
| ifdef TRELLIS_CONTROL_REVIEW |
| @echo "Too many parameters. You cannot specify branch and review." |
| exit 1 |
| else |
| cd ${TRELLIS_CONTROL_ROOT} && git checkout ${TRELLIS_CONTROL_BRANCH} |
| endif |
| else |
| ifdef TRELLIS_CONTROL_REVIEW |
| cd ${TRELLIS_CONTROL_ROOT} && git review -d ${TRELLIS_CONTROL_REVIEW} |
| endif |
| endif |
| |
| trellis-control-build: mvn_settings.xml local-apps trellis-control ## : Builds trellis-control using local app or mvn |
| # Settings are needed by both build processes - contains proxy settings and extra |
| cp mvn_settings.xml ${TRELLIS_CONTROL_ROOT}/ |
| ifdef TRELLIS_CONTROL_MVN |
| # Dependencies are needed only by the mvn copy - contains repo settings |
| cp dependencies.xml ${TRELLIS_CONTROL_ROOT}/ |
| # Mounting the current dir allows to cache the .m2 folder that is persisted and leveraged by subsequent builds |
| docker run -t --rm -v ${CURRENT_DIR}:/root -w /root/trellis-control ${DOCKER_MVN_IMAGE} \ |
| bash -c "mvn dependency:copy -Dartifact=${TRELLIS_CONTROL_ARTIFACT}:${TRELLIS_CONTROL_VERSION}:oar \ |
| -DoutputDirectory=oar/target -Dmdep.useBaseVersion=true \ |
| -Dmdep.overWriteReleases=true -Dmdep.overWriteSnapshots=true -f dependencies.xml \ |
| -s mvn_settings.xml; \ |
| chown -R ${CURRENT_UID}:${CURRENT_GID} /root" |
| else |
| # Having the same mount file allows to reduce build time. |
| docker run -t --rm -v ${CURRENT_DIR}:/root -w /root/trellis-control ${DOCKER_MVN_IMAGE} \ |
| bash -c "mvn clean install -s mvn_settings.xml; \ |
| chown -R ${CURRENT_UID}:${CURRENT_GID} /root" |
| endif |
| # Final step requires to move the oar to the folder used by the tost docker file |
| cp ${TRELLIS_CONTROL_ROOT}/oar/target/${TRELLIS_CONTROL_ARTIFACTID}-${TRELLIS_CONTROL_VERSION}.oar ${LOCAL_APPS}/ |
| |
| trellis-t3: ## : Checkout trellis-t3 code |
| if [ ! -d "trellis-t3" ]; then \ |
| git clone https://gerrit.onosproject.org/trellis-t3; \ |
| fi |
| ifdef TRELLIS_T3_BRANCH |
| ifdef TRELLIS_T3_REVIEW |
| @echo "Too many parameters. You cannot specify branch and review." |
| exit 1 |
| else |
| cd ${TRELLIS_T3_ROOT} && git checkout ${TRELLIS_T3_BRANCH} |
| endif |
| else |
| ifdef TRELLIS_T3_REVIEW |
| cd ${TRELLIS_T3_ROOT} && git review -d ${TRELLIS_T3_REVIEW} |
| endif |
| endif |
| |
| trellis-t3-build: mvn_settings.xml local-apps trellis-t3 ## : Builds trellis-t3 using local app or mvn |
| cp mvn_settings.xml ${TRELLIS_T3_ROOT}/ |
| ifdef TRELLIS_T3_MVN |
| cp dependencies.xml ${TRELLIS_T3_ROOT}/ |
| docker run -t --rm -v ${CURRENT_DIR}:/root -w /root/trellis-t3 ${DOCKER_MVN_IMAGE} \ |
| bash -c "mvn dependency:copy -Dartifact=${TRELLIS_T3_ARTIFACT}:${TRELLIS_T3_VERSION}:oar \ |
| -DoutputDirectory=app/target -Dmdep.useBaseVersion=true \ |
| -Dmdep.overWriteReleases=true -Dmdep.overWriteSnapshots=true -f dependencies.xml \ |
| -s mvn_settings.xml; \ |
| chown -R ${CURRENT_UID}:${CURRENT_GID} /root" |
| else |
| docker run -t --rm -v ${CURRENT_DIR}:/root -w /root/trellis-t3 ${DOCKER_MVN_IMAGE} \ |
| bash -c "mvn clean install -s mvn_settings.xml; \ |
| chown -R ${CURRENT_UID}:${CURRENT_GID} /root" |
| endif |
| cp ${TRELLIS_T3_ROOT}/app/target/${TRELLIS_T3_ARTIFACTID}-${TRELLIS_T3_VERSION}.oar ${LOCAL_APPS}/ |
| |
| fabric-tofino: ## : Checkout fabric-tofino code |
| if [ ! -d "fabric-tofino" ]; then \ |
| git clone https://gerrit.opencord.org/fabric-tofino; \ |
| fi |
| ifdef FABRIC_TOFINO_BRANCH |
| ifdef FABRIC_TOFINO_REVIEW |
| @echo "Too many parameters. You cannot specify branch and review." |
| exit 1 |
| else |
| cd ${FABRIC_TOFINO_ROOT} && git checkout ${FABRIC_TOFINO_BRANCH} |
| endif |
| else |
| ifdef FABRIC_TOFINO_REVIEW |
| cd ${FABRIC_TOFINO_ROOT} && git review -d ${FABRIC_TOFINO_REVIEW} |
| endif |
| endif |
| |
| fabric-tofino-build: mvn_settings.xml local-apps fabric-tofino ## : Builds fabric-tofino using local app or mvn |
| cp mvn_settings.xml ${FABRIC_TOFINO_ROOT}/ |
| ifdef FABRIC_TOFINO_MVN |
| cp dependencies.xml ${FABRIC_TOFINO_ROOT}/ |
| docker run -t --rm -v ${CURRENT_DIR}:/root -w /root/fabric-tofino ${DOCKER_MVN_IMAGE} \ |
| bash -c "mvn dependency:copy -Dartifact=${FABRIC_TOFINO_ARTIFACT}:${FABRIC_TOFINO_VERSION}:oar \ |
| -DoutputDirectory=target -Dmdep.useBaseVersion=true \ |
| -Dmdep.overWriteReleases=true -Dmdep.overWriteSnapshots=true -f dependencies.xml \ |
| -s mvn_settings.xml; \ |
| chown -R ${CURRENT_UID}:${CURRENT_GID} /root" |
| else |
| # This workaround is temporary - typically we need to build only the pipeconf |
| cd ${FABRIC_TOFINO_ROOT} && make ${FABRIC_TOFINO_TARGETS} |
| docker run -t --rm -v ${CURRENT_DIR}:/root -w /root/fabric-tofino ${DOCKER_MVN_IMAGE} \ |
| bash -c "mvn clean install -s mvn_settings.xml; \ |
| chown -R ${CURRENT_UID}:${CURRENT_GID} /root" |
| endif |
| cp ${FABRIC_TOFINO_ROOT}/target/${FABRIC_TOFINO_ARTIFACTID}-${FABRIC_TOFINO_VERSION}.oar ${LOCAL_APPS}/ |
| |
| up4: ## : Checkout up4 code |
| if [ ! -d "up4" ]; then \ |
| git clone ${UP4_REPO}; \ |
| fi |
| ifdef UP4_BRANCH |
| cd ${UP4_ROOT} && git checkout ${UP4_BRANCH} |
| endif |
| |
| up4-build: mvn_settings.xml local-apps up4 ## : Builds up4 using local app or mvn |
| cp mvn_settings.xml ${UP4_ROOT}/app |
| # Copy the p4 reources inside the app before the actual build |
| cd ${UP4_ROOT} && make ${UP4_TARGETS} |
| docker run -t --rm -v ${CURRENT_DIR}:/root -w /root/up4/app ${DOCKER_MVN_IMAGE} \ |
| bash -c "mvn clean install -s mvn_settings.xml; \ |
| chown -R ${CURRENT_UID}:${CURRENT_GID} /root" |
| cp ${UP4_ROOT}/app/app/target/${UP4_ARTIFACTID}-${UP4_VERSION}.oar ${LOCAL_APPS}/ |
| |
| kafka-onos: ## : Checkout kafka-onos code |
| if [ ! -d "kafka-onos" ]; then \ |
| git clone https://gerrit.opencord.org/kafka-onos; \ |
| fi |
| ifdef KAFKA_ONOS_BRANCH |
| ifdef KAFKA_ONOS_REVIEW |
| @echo "Too many parameters. You cannot specify branch and review." |
| exit 1 |
| else |
| cd ${KAFKA_ONOS_ROOT} && git checkout ${KAFKA_ONOS_BRANCH} |
| endif |
| else |
| ifdef KAFKA_ONOS_REVIEW |
| cd ${KAFKA_ONOS_ROOT} && git review -d ${KAFKA_ONOS_REVIEW} |
| endif |
| endif |
| |
| kafka-onos-build: mvn_settings.xml local-apps kafka-onos ## : Builds kafka-onos using local app or mvn |
| cp mvn_settings.xml ${KAFKA_ONOS_ROOT}/ |
| ifdef KAFKA_ONOS_MVN |
| cp dependencies.xml ${KAFKA_ONOS_ROOT}/ |
| docker run -t --rm -v ${CURRENT_DIR}:/root -w /root/kafka-onos ${DOCKER_MVN_IMAGE} \ |
| bash -c "mvn dependency:copy -Dartifact=${KAFKA_ONOS_ARTIFACT}:${KAFKA_ONOS_VERSION}:oar \ |
| -DoutputDirectory=target -Dmdep.useBaseVersion=true \ |
| -Dmdep.overWriteReleases=true -Dmdep.overWriteSnapshots=true -f dependencies.xml \ |
| -s mvn_settings.xml; \ |
| chown -R ${CURRENT_UID}:${CURRENT_GID} /root" |
| else |
| docker run -t --rm -v ${CURRENT_DIR}:/root -w /root/kafka-onos ${DOCKER_MVN_IMAGE} \ |
| bash -c "mvn clean install -s mvn_settings.xml; \ |
| chown -R ${CURRENT_UID}:${CURRENT_GID} /root" |
| endif |
| cp ${KAFKA_ONOS_ROOT}/target/${KAFKA_ONOS_ARTIFACTID}-${KAFKA_ONOS_VERSION}.oar ${LOCAL_APPS}/ |
| |
| onos: ## : Checkout onos code |
| if [ ! -d "onos" ]; then \ |
| git clone https://gerrit.onosproject.org/onos; \ |
| fi |
| ifdef ONOS_BRANCH |
| ifdef ONOS_REVIEW |
| @echo "Too many parameters. You cannot specify branch and review." |
| exit 1 |
| else |
| cd ${ONOS_ROOT} && git checkout ${ONOS_BRANCH} |
| endif |
| else |
| ifdef ONOS_REVIEW |
| cd ${ONOS_ROOT} && git review -d ${ONOS_REVIEW} |
| endif |
| endif |
| |
| onos-build: onos ## : Builds the tost-onos docker image |
| # Set some env variables |
| cd ${ONOS_ROOT} && \ |
| . tools/build/envDefaults && \ |
| docker build . -t ${ONOS_IMAGENAME} \ |
| --build-arg PROFILE=${ONOS_PROFILE} |
| |
| tost-build: ## : Builds the tost docker image |
| docker build $(DOCKER_BUILD_ARGS) \ |
| -t ${TOST_IMAGENAME} \ |
| --build-arg LOCAL_APPS=${LOCAL_APPS} \ |
| --build-arg KARAF_VERSION=${KARAF_VERSION} \ |
| --build-arg org_label_schema_version="${VERSION}" \ |
| --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \ |
| --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \ |
| --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \ |
| --build-arg org_onosproject_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \ |
| -f Dockerfile.tost . |
| |
| onos-push: ## : Pushes the tost-onos docker image to an external repository |
| docker push ${ONOS_IMAGENAME} |
| |
| tost-push: ## : Pushes the tost docker image to an external repository |
| docker push ${TOST_IMAGENAME} |
| |
| # Used for CI job |
| docker-build: onos trellis-control-build trellis-t3-build kafka-onos-build fabric-tofino-build up4-build tost-build ## : Builds the tost image |
| |
| # User for CD job |
| docker-push: tost-push ## : Pushes the tost image |
| |
| clean: ## : Deletes any locally copied files or artifacts |
| rm -rf ${ONOS_ROOT} |
| rm -rf ${TRELLIS_CONTROL_ROOT} |
| rm -rf ${TRELLIS_T3_ROOT} |
| rm -rf ${FABRIC_TOFINO_ROOT} |
| rm -rf ${UP4_ROOT} |
| rm -rf ${KAFKA_ONOS_ROOT} |
| rm -rf ${LOCAL_APPS} |
| rm -rf .m2 |
| rm -rf mvn_settings.xml |
| |
| # end file |