# -*- mode: makefile -*-
#

ifeq ($(RM),true)
.SECONDARY: $(%.o) $(%f.o) $(%f90.o)
endif

LINK.c = $(CLINKER) $(CCPPFLAGS) $(LDFLAGS) $(EXEFLAGS)
LINK.o = $(CLINKER) $(LDFLAGS) $(EXEFLAGS)
LINK.F = $(FLINKER) $(FCPPFLAGS) $(LDFLAGS)
LINK.cc = $(CXXLINKER) $(CXXCPPFLAGS) $(LDFLAGS)

# make macros KOKKOS_USE_CUDA_COMPILER etc are defined in `${PETSC_DIR}/${PETSC_ARCH}/lib/petsc/conf/petscvariables`
ifneq ($(KOKKOS_USE_CUDA_COMPILER),)
  # Kokkos requires nvcc to be in PATH and the C++ compiler to be given in an environmental variable
  # We prefer to use the Kokkos nvcc_wrapper compiler wrapper for compiling Kokkos files. The command is adapted from PETSC_COMPILE.kokkos.cxx
  # in gmakefile.test, with additional "-o $*.o" to generate intended foo.o instead of foo.kokkos.o
  PETSC_KOKKOSCOMPILE_SINGLE = PATH=`dirname $(CUDAC)`:$(PATH) NVCC_WRAPPER_DEFAULT_COMPILER="$(CUDA_CXX)" $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda -c $(CUDAC_FLAGS) ${PETSC_CCPPFLAGS} $(CUDACPPFLAGS) $(CUDA_CXXFLAGS) $(MPICXX_INCLUDES) -o $*.o

  LINK.kokkos.cxx = PATH=`dirname $(CUDAC)`:$(PATH) NVCC_WRAPPER_DEFAULT_COMPILER=$(CUDA_CXX) $(KOKKOS_BIN)/nvcc_wrapper --expt-extended-lambda $(CUDAC_FLAGS) $(MPICXX_INCLUDES) ${PETSC_CCPPFLAGS} $(CUDA_CXXFLAGS) $(CUDACPPFLAGS) $(CUDA_CXXLIBS) $(MPICXX_LIBS) $(LDFLAGS)
else ifneq ($(KOKKOS_USE_HIP_COMPILER),)
  PETSC_KOKKOSCOMPILE_SINGLE = ${PETSC_HIPCOMPILE_SINGLE}
  LINK.kokkos.cxx = $(HIPC)  $(HIPC_FLAGS)  $(HIPPP_FLAGS)  $(HIPOPTFLAGS)  $(CXXFLAGS) $(CXXCPPFLAGS) $(LDFLAGS) $(MPICXX_INCLUDES) $(MPICXX_LIBS)
else ifneq ($(KOKKOS_USE_SYCL_COMPILER),)
  PETSC_KOKKOSCOMPILE_SINGLE = ${PETSC_SYCLCOMPILE_SINGLE}
  LINK.kokkos.cxx = $(SYCLC) $(SYCLC_FLAGS) $(SYCLPP_FLAGS) $(SYCLOPTFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(LDFLAGS) $(MPICXX_INCLUDES) $(MPICXX_LIBS)
else
  PETSC_KOKKOSCOMPILE_SINGLE = ${PETSC_CXXCOMPILE_SINGLE}
  LINK.kokkos.cxx = $(CXXLINKER) $(CXX_FLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(LDFLAGS)
endif

LINK.hip.cpp = $(HIPC) $(HIPC_FLAGS) $(HIPPP_FLAGS) $(HIPOPTFLAGS) $(CXXFLAGS) $(CXXCPPFLAGS) $(LDFLAGS) $(MPICXX_INCLUDES) $(MPICXX_LIBS)

ifneq ($(RAJA_USE_CUDA_COMPILER),)
  PETSC_RAJACOMPILE_SINGLE  = ${CUDAC} -o $*.o $(MPICXX_INCLUDES) ${CUDAC_FLAGS} -x cu -Xcudafe "--display_error_number" -c --compiler-options="${PETSC_CCPPFLAGS} ${PETSC_CC_INCLUDES} ${CUDA_CXXFLAGS}" --expt-extended-lambda --expt-relaxed-constexpr
else
    PETSC_RAJACOMPILE_SINGLE = ${CXX} -o $*.o -c ${CXX_FLAGS} ${CXXFLAGS} ${CXXCPPFLAGS}
endif

LDLIBS += $(PETSC_LIB)

% : %.F90
	$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@
% : %.kokkos.cxx
	$(LINK.kokkos.cxx) $^ $(LOADLIBES) $(LDLIBS) -o $@
% : %.cxx
	$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
% : %.hip.cpp
	$(LINK.hip.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@

ifneq (,$(findstring -TP,$(PCC_FLAGS)))
% : %.c
	${PETSC_COMPILE_SINGLE} `pwd`/$<
	${CLINKER} $(EXEFLAGS) -o $@ $@.o  $(PETSC_LIB)
endif

include ${PETSC_DIR}/lib/petsc/conf/test.common
