# SPDX-License-Identifier: GPL-2.0-only
# Copyright (c) 2026 MetaX Integrated Circuits (Shanghai) Co., Ltd. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify it under the terms of the
# GNU General Public License, version 2, as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License, version 2, for more details.
#
# You should have received a copy of the GNU General Public License, version 2, along with this
# program; if not, see <https://www.gnu.org/licenses/>

MX_MAKEFILE_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
BUILD_DATE=\"$(shell date +%Y-%m-%d" "%T)\"
BUILD_USER=\"$(shell echo $${USER})\"

AC_PATH:=$(shell which autoconf)
ifeq ("$(AC_PATH)","")
  $(error Firsr Install the autoconf & automake)
endif

ifeq ($(wildcard $(MX_MAKEFILE_DIR)/../Module.symvers),)
    MODULE_BUILD_IN := $(shell echo no)
else
    MODULE_BUILD_IN := $(shell echo yes)
    BUILD_COMMIT=\"$(shell git -C $(MX_MAKEFILE_DIR)/../ rev-parse --short HEAD)\"
endif

# add check for ci build path
ifneq ($(wildcard $(MX_MAKEFILE_DIR)/../../../Module.symvers),)
    CI_BUILD := $(shell echo yes)
endif

subdir-ccflags-y += -DBUILD_DATE="$(BUILD_DATE)"
subdir-ccflags-y += -DBUILD_USER="$(BUILD_USER)"
subdir-ccflags-y += -DBUILD_COMMIT="$(BUILD_COMMIT)"

# The check for KERNELRELEASE is used to separate the two parts of the makefile.
# first pass is by the "make" instance run on the command line
ifeq ($(KERNELRELEASE),)
  ifeq ("$(PREBUILD_KVER)", "")
    # for using "make" directly (dkms doesn't need this step)
    ifeq ("$(KERNEL_PATH)", "")
      $(info KERNEL_PATH not set, use 5.4.0-42-generic)
      KERNEL_PATH := /lib/modules/5.4.0-42-generic/build
      # no need to do pre-build for "make clean" and "make clean_dkms"
      ifeq ($(filter clean%,$(MAKECMDGOALS)),)
        DKMS_PREBUILD := $(shell $(MX_MAKEFILE_DIR)/dkms/pre-build.sh 5.4.0-42-generic $(CC) > /dev/null)
      endif
    endif
  else
    $(info pre-build for kernel version $(PREBUILD_KVER))
    DKMS_PREBUILD := $(shell $(MX_MAKEFILE_DIR)/dkms/pre-build.sh $(PREBUILD_KVER) $(CC) > /dev/null)
  endif
# second pass is by the kbuild system
else
  # compatible with the CLANG compiler
  MX_CC_VERSION = $(subst $(pound),,$(shell LC_ALL=C $(CC) --version 2>/dev/null | head -n 1))
  ifneq ($(findstring clang,$(MX_CC_VERSION)),)
    MX_CLANG_FLAGS := $(call cc-disable-warning, implicit-fallthrough)
    MX_CLANG_FLAGS += $(call cc-disable-warning, gnu-variable-sized-type-not-at-end)
    subdir-ccflags-y += $(MX_CLANG_FLAGS)
  endif
endif

# Must set METAX_SYM in make command if metax_rdma not built with metax.ko
ifeq ($(MODULE_BUILD_IN), yes)
    $(info build in with metax.ko)
    MODULE_SYM := $(MX_MAKEFILE_DIR)/../Module.symvers
    METAX_ETH ?= $(MX_MAKEFILE_DIR)/../interface/metax
else
    ifeq ($(wildcard $(METAX_SYM)),)
        $(info $(METAX_SYM) does not exist.)
    endif
    MODULE_SYM := $(METAX_SYM)
    ifeq ($(CI_BUILD), yes)
        MODULE_SYM := $(MX_MAKEFILE_DIR)/../../../Module.symvers
    endif
    $(info build local metax_rdma out with $(MODULE_SYM))
endif
KBUILD_EXTRA_SYMBOLS := $(MODULE_SYM)

# compatible for mlnx_ofed
ifeq ($(src),)
        src=.
endif
include $(src)/ofa.mk

ifneq ($(METAX_ETH), )
	LINUXINCLUDE += -I${METAX_ETH}
endif

LINUXINCLUDE += -I${MX_MAKEFILE_DIR}
subdir-ccflags-y += -include $(MX_MAKEFILE_DIR)/dkms/config/config.h

metax_rdma-y += rdma/metax_rdma_main.o \
        rdma/metax_rdma_verbs.o \
        rdma/mxc600_rdma.o \
        rdma/metax_rdma_qp.o \
        rdma/metax_rdma_cq.o \
        rdma/metax_rdma_mr.o \
        rdma/metax_rdma_std_types.o \
        rdma/metax_rdma_compat.o \
        rdma/metax_rdma_stats.o

obj-m += metax_rdma.o

all:
	+make -C $(KERNEL_PATH) M=$(MX_MAKEFILE_DIR)

clean:
	+make -C $(KERNEL_PATH) M=$(MX_MAKEFILE_DIR) clean
clean_dkms: clean
	@rm -rf dkms/config/config.h dkms/config/config.h.in dkms/config/config.h.in~ \
                dkms/Makefile dkms/aclocal.m4 dkms/configure dkms/build-* \
                dkms/.tmp_versions dkms/config.log dkms/config.status

