# Copyright (c) 2014-2024 Broadcom. All Rights Reserved.
# Broadcom Confidential. The term "Broadcom" refers to Broadcom Inc.
# and/or its subsidiaries.

#-------------------------------------------------------------------------------
# Makefile
#
#    Provides a wrapper to compile drivers in the VMKAPI DDK devkit.
#
#    This is a generic Makefile and no changes are required to compile
#    drivers provided that a single .sc file exists in the current directory.
#-------------------------------------------------------------------------------

#-------------------------------------------------------------------------------
# Tools
#-------------------------------------------------------------------------------

CAYMAN_PIGZ_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_pigz-bd3ba3f0f5cfb59d176076fff5007217af11677d-toolchain)
export GOBUILD_CAYMAN_PIGZ_ROOT = $(CAYMAN_PIGZ_DIR)
CAYMAN_ESX_GLIBC_2_17_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_esx_glibc_2_17-5828c91aa74be7f2c8807a5225d8472f1ce8499b-toolchain)
export GOBUILD_CAYMAN_ESX_GLIBC_2_17_ROOT = $(CAYMAN_ESX_GLIBC_2_17_DIR)
CAYMAN_ESX_GDB_PY3_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_esx_gdb_py3-d78c49165525472f2939ff0e9c0e8bce949185a4-toolchain)
export GOBUILD_CAYMAN_ESX_GDB_PY3_ROOT = $(CAYMAN_ESX_GDB_PY3_DIR)
CAYMAN_ESX_PYCPARSER_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_esx_pycparser-6075b10d7e04d0d75e1e94076df0a0d128f6f029-toolchain)
export GOBUILD_CAYMAN_ESX_PYCPARSER_ROOT = $(CAYMAN_ESX_PYCPARSER_DIR)
CAYMAN_EXPAT_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_expat-3a18078780f8d78df2cc1c360226163d24e95ed2-toolchain)
export GOBUILD_CAYMAN_EXPAT_ROOT = $(CAYMAN_EXPAT_DIR)
CAYMAN_ZSTD_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_zstd-729b414c6cd7bf240b6fbbae99546466c2c04ecd-toolchain)
export GOBUILD_CAYMAN_ZSTD_ROOT = $(CAYMAN_ZSTD_DIR)
CAYMAN_PERL_SCONS_BOOTSTRAP_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_perl_scons_bootstrap-01cb598ecba77cfe80bb203bc891654464e3d9b9-toolchain)
export GOBUILD_CAYMAN_PERL_SCONS_BOOTSTRAP_ROOT = $(CAYMAN_PERL_SCONS_BOOTSTRAP_DIR)
CAYMAN_URLLIB3_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_urllib3-ba409ed6305923db2279ca2d847829d8920ac84c-toolchain)
export GOBUILD_CAYMAN_URLLIB3_ROOT = $(CAYMAN_URLLIB3_DIR)
CAYMAN_LIBFFI_SCONS_BOOTSTRAP_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_libffi_scons_bootstrap-65d39211b0d32de29d0e9869f88cbbe3201c059a-toolchain)
export GOBUILD_CAYMAN_LIBFFI_SCONS_BOOTSTRAP_ROOT = $(CAYMAN_LIBFFI_SCONS_BOOTSTRAP_DIR)
CAYMAN_ESX_NCURSES_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_esx_ncurses-36489878eee8e2ed31f6c24c2abca2af1b5b9e8b-toolchain)
export GOBUILD_CAYMAN_ESX_NCURSES_ROOT = $(CAYMAN_ESX_NCURSES_DIR)
export BASH_COMPONENT_DIRS=$(CAYMAN_ESX_NCURSES_DIR)/usr/lib64
CAYMAN_PYTHON3_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_python3-2daebbc0e2e2d508290222d4b7f573ad580a1551-toolchain)
export GOBUILD_CAYMAN_PYTHON3_ROOT = $(CAYMAN_PYTHON3_DIR)
CAYMAN_LLVM_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_llvm-d16a3a7fb0edc01c4d160a515bfaf24873c08ca3-toolchain)
export GOBUILD_CAYMAN_LLVM_ROOT = $(CAYMAN_LLVM_DIR)
CAYMAN_ESX_TOOLCHAIN_GCC9_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_esx_toolchain_gcc9-44a0a472a39593d070d217e46e727f241f802565-toolchain)
export GOBUILD_CAYMAN_ESX_TOOLCHAIN_GCC9_ROOT = $(CAYMAN_ESX_TOOLCHAIN_GCC9_DIR)
export CC = $(CAYMAN_ESX_TOOLCHAIN_GCC9_DIR)
CAYMAN_PERL_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_perl-53f305fc7bf62bbc4ab693543c8fa3edac4e7ce6-toolchain)
export GOBUILD_CAYMAN_PERL_ROOT = $(CAYMAN_PERL_DIR)
CAYMAN_SHELL_TOOLCHAIN_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_shell_toolchain-74728808ac7c398e6314902ff43f5eb1885cea48-toolchain)
export GOBUILD_CAYMAN_SHELL_TOOLCHAIN_ROOT = $(CAYMAN_SHELL_TOOLCHAIN_DIR)
CAYMAN_OPENJDK21_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_openjdk21-c4b4e163234a2cfc5f03a5a24a21f0ed3d10ba42-toolchain)
export GOBUILD_CAYMAN_OPENJDK21_ROOT = $(CAYMAN_OPENJDK21_DIR)
export JAVA_HOME = $(CAYMAN_OPENJDK21_DIR)/lin64/jdk/
CAYMAN_ZLIB_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_zlib-80a36dc66ead3656ebd757357a12fe403576892c-toolchain)
export GOBUILD_CAYMAN_ZLIB_ROOT = $(CAYMAN_ZLIB_DIR)
CAYMAN_ESX_TOOLCHAIN_GCC12_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_esx_toolchain_gcc12-2f4979f6cdf0af8747f7c428d0299a025a7ba7f8-toolchain)
export GOBUILD_CAYMAN_ESX_TOOLCHAIN_GCC12_ROOT = $(CAYMAN_ESX_TOOLCHAIN_GCC12_DIR)
export CC = $(CAYMAN_ESX_TOOLCHAIN_GCC12_DIR)
CAYMAN_BAZEL_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_bazel-c5f9e21d5f97ad910bb3412eab3d6cebf8b34b34-toolchain)
export GOBUILD_CAYMAN_BAZEL_ROOT = $(CAYMAN_BAZEL_DIR)
CAYMAN_ESX_GLIBC_2_28_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_esx_glibc_2_28-c5331253fecee798d163c5a46d82f6fa86ea4791-toolchain)
export GOBUILD_CAYMAN_ESX_GLIBC_2_28_ROOT = $(CAYMAN_ESX_GLIBC_2_28_DIR)
export PERL_GLIBC_DIR=$(CAYMAN_ESX_GLIBC_2_28_DIR)/sysroot/lib64
CAYMAN_SCONS_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_scons-69f4dd00a17b5176c8c264b9cbf3f097dc1cd837-toolchain)
export GOBUILD_CAYMAN_SCONS_ROOT = $(CAYMAN_SCONS_DIR)
CAYMAN_PYTHON_SCONS_BOOTSTRAP_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_python_scons_bootstrap-ce0b608102d69617f359b6bb0986c3bc2ceebe5f-toolchain)
export GOBUILD_CAYMAN_PYTHON_SCONS_BOOTSTRAP_ROOT = $(CAYMAN_PYTHON_SCONS_BOOTSTRAP_DIR)
CAYMAN_PYTHON_ZSTANDARD_DIR = $(shell /bin/rpm -q --qf "%{instprefixes}\n" vmware-esx-cayman_python-zstandard-e0e1bd82fca1050a7e12c3c78990ef0015618742-toolchain)
export GOBUILD_CAYMAN_PYTHON_ZSTANDARD_ROOT = $(CAYMAN_PYTHON_ZSTANDARD_DIR)
VMW_COMPONENTS = cayman_pigz cayman_esx_glibc_2_17 cayman_esx_gdb_py3 cayman_esx_pycparser cayman_expat cayman_zstd cayman_perl_scons_bootstrap cayman_urllib3 cayman_libffi_scons_bootstrap cayman_esx_ncurses cayman_python3 cayman_llvm cayman_esx_toolchain_gcc9 cayman_perl cayman_shell_toolchain cayman_openjdk21 cayman_zlib cayman_esx_toolchain_gcc12 cayman_bazel cayman_esx_glibc_2_28 cayman_scons cayman_python_scons_bootstrap cayman_python-zstandard
VMW_COMPONENT_DIRS = $(CAYMAN_PIGZ_DIR) $(CAYMAN_ESX_GLIBC_2_17_DIR) $(CAYMAN_ESX_GDB_PY3_DIR) $(CAYMAN_ESX_PYCPARSER_DIR) $(CAYMAN_EXPAT_DIR) $(CAYMAN_ZSTD_DIR) $(CAYMAN_PERL_SCONS_BOOTSTRAP_DIR) $(CAYMAN_URLLIB3_DIR) $(CAYMAN_LIBFFI_SCONS_BOOTSTRAP_DIR) $(CAYMAN_ESX_NCURSES_DIR) $(CAYMAN_PYTHON3_DIR) $(CAYMAN_LLVM_DIR) $(CAYMAN_ESX_TOOLCHAIN_GCC9_DIR) $(CAYMAN_PERL_DIR) $(CAYMAN_SHELL_TOOLCHAIN_DIR) $(CAYMAN_OPENJDK21_DIR) $(CAYMAN_ZLIB_DIR) $(CAYMAN_ESX_TOOLCHAIN_GCC12_DIR) $(CAYMAN_BAZEL_DIR) $(CAYMAN_ESX_GLIBC_2_28_DIR) $(CAYMAN_SCONS_DIR) $(CAYMAN_PYTHON_SCONS_BOOTSTRAP_DIR) $(CAYMAN_PYTHON_ZSTANDARD_DIR)

AWK = /build/toolchain/lin64/gawk-3.1.5/bin/awk
BASH = /build/toolchain/lin64/bash-4.1/bin/bash
CP = /build/toolchain/lin64/coreutils-8.6/bin/cp
ECHO = /build/toolchain/lin64/coreutils-8.6/bin/echo
FIND = /build/toolchain/lin64/findutils-4.2.27/bin/find
GREP = /build/toolchain/lin64/grep-2.5.1a/bin/grep
GZIP = /build/toolchain/lin64/gzip-1.5/bin/gzip
MAKE = /build/toolchain/lin64/make-3.81/bin/make
MKDIR = /build/toolchain/lin64/coreutils-8.6/bin/mkdir
MV = /build/toolchain/lin64/coreutils-8.6/bin/mv
PERL = /build/toolchain/lin32/perl-5.8.8/bin/perl
RM = /build/toolchain/lin64/coreutils-8.6/bin/rm
SED = /build/toolchain/lin64/sed-4.1.5/bin/sed
TR = /build/toolchain/lin64/coreutils-8.6/bin/tr
PYTHON = /build/toolchain/lin64/python-3.5.2-openssl1.0.2q/bin/python

TOOLCHAIN_PATH = /opt/vmware/toolchain
#-------------------------------------------------------------------------------
# Parameters to the scons command
#-------------------------------------------------------------------------------
PRODUCT      = nativeddk
BUILDTYPE    = release
BUILD_NUMBER = 24755229
ESX_IO       = 0
TARGET_ARCH  = $(PRODUCT)
export BUILD_NUMBER

VMKAPI_DIR   = $(shell /bin/rpm -q --qf '%{INSTPREFIXES}\n' vmware-esx-nativeddk-devtools-9.0.0-0.24755229)
SRC          = $(VMKAPI_DIR)/src
FIND_RPM     = $(VMKAPI_DIR)/tools/find_rpm_install_dir.sh
VIRTUAL_GOBUILD = $(VMKAPI_DIR)/tools/gobuild/nativeddk.cache
EPKDIR      := $(shell $(FIND_RPM) vmware-esx-packaging-kit)
ifeq ($(strip $(EPKDIR)),)
    $(error Unable to locate ESX Packaging Kit installation directory)
endif

BAZEL        = $(GOBUILD_CAYMAN_BAZEL_ROOT)/bin/bazel
SCONS        = cd $(SRC); $(SRC)/scons/bin/scons
FULL_PWD     := $(shell pwd)
SC           := $(shell echo *.sc | $(AWK) '{print $$1}')
MANIFEST     = $(FULL_PWD)/$(SC)
BUILD        = build
SCONS_BUILD  = .build
TARGET       = $(FULL_PWD)/$(BUILD)
SCONS_TARGET = $(FULL_PWD)/$(SCONS_BUILD)
VENDOR       = Microchip
VERSION      = $(shell cat smartpqi.sc | $(AWK) '/driverVersion = / {print$$3}' | $(SED) 's/"//g'| $(SED) 's/,//g')

DEVKIT_BUILD_CACHE = devkit-build-cache-$(BUILD_NUMBER)
SAMPLE_DIR = $(shell pwd | $(AWK) -F "src" '{print $$NF}')

# Map VIB acceptance level to canonical default signing-key file base name
ACCEPT_LEVEL = $(shell grep acceptance-level $(MANIFEST))
ifneq ($(findstring accepted,$(ACCEPT_LEVEL)),)
    VMW_KC_NAME = accepted
else
ifneq ($(findstring partner,$(ACCEPT_LEVEL)),)
    VMW_KC_NAME = vmpartner
else
ifneq ($(findstring certified,$(ACCEPT_LEVEL)),)
    VMW_KC_NAME = vmware
else
ifeq ($(findstring community,$(ACCEPT_LEVEL)),)
    $(error invalid acceptance level $(ACCEPT_LEVEL))
endif
endif
endif
endif
ifneq ($(VMW_KC_NAME),)
    KEYPATH?=$(EPKDIR)/testcerts/$(VMW_KC_NAME).key
    CERTPATH?=$(EPKDIR)/testcerts/$(VMW_KC_NAME).cert
endif

define check_empty
if [ -z "$(1)" ]; then \
        echo "variable is empty"; \
        exit 1; \
fi
endef

all vib:
	@$(SCONS) native-driver-modules native-driver-vibs native-driver-bundle \
	       RELEASE_PACKAGES_DIR=$(TARGET) \
	       TOOLKIT_MANIFEST=$(MANIFEST) \
	       PRODUCT=$(PRODUCT) \
	       BUILDTYPE=$(BUILDTYPE) \
	       BUILD_NUMBER=$(BUILD_NUMBER) \
	       ESX_IO=$(ESX_IO) \
	       ESX_SIGN_BINARIES=0 \
	       EPKPATH=$(EPKDIR) \
	       BUILDROOT=$(SCONS_TARGET) \
	       VIRTUAL_GOBUILD=$(VIRTUAL_GOBUILD) \
               KEYPATH=$(KEYPATH) \
               CERTPATH=$(CERTPATH)

	cd $(BUILD)/component;$(MV) MIS*.zip $(VENDOR)-smartpqi_$(VERSION)-1OEM.900.0.$(BUILD_NUMBER).zip

bazel:
	@echo Fetching target name to build...
	$(eval BAZEL_TARGET=$(shell make bazel-query && cat target_name | cut -d ' ' -f1))
	@echo Fetched target is : $(BAZEL_TARGET)
	@$(call check_empty,$(BAZEL_TARGET))

	$(BAZEL) --output_user_root=$(VMKAPI_DIR) \
        --bazelrc=$(VMKAPI_DIR)/src/sdk.bazelrc \
        build $(BAZEL_TARGET) \
        --action_env=VMWARE_BUILDDIR=$(FULL_PWD) \
        --action_env=PERL_GLIBC_DIR=$(PERL_GLIBC_DIR) \
        --action_env=GOBUILD_CAYMAN_PERL_ROOT=$(GOBUILD_CAYMAN_PERL_ROOT) \
        --sandbox_debug --subcommands --verbose_failures \
        --config={$(TARGET_ARCH),release,sdk_build_env} \
        --repository_cache=$(TOOLCHAIN_PATH)/$(DEVKIT_BUILD_CACHE)/repocache

	readlink $(TARGET) || ln -s $(VMKAPI_DIR)/src/bazel-bin/$(SAMPLE_DIR) $(TARGET)

bazel-query:
	@$(BAZEL) --output_user_root=$(VMKAPI_DIR) \
        --bazelrc=$(VMKAPI_DIR)/src/sdk.bazelrc \
        cquery 'filter(".*-depot", attr(generator_function, driver_package, ...))' \
        --sandbox_debug --subcommands --verbose_failures \
        --config={$(TARGET_ARCH),release,sdk_build_env} \
        --repository_cache=$(TOOLCHAIN_PATH)/$(DEVKIT_BUILD_CACHE)/repocache > target_name

bazel-clean:
	$(BAZEL) --output_user_root=$(VMKAPI_DIR) clean --config=release --repo_env=PRODUCT=esx --expunge
	@$(RM) target_name
	readlink $(TARGET) && unlink $(TARGET)

clean:
	@echo Cleaning out build directories ...
	@$(RM) -rf $(TARGET) $(SCONS_TARGET)
	@echo Done.
