licenses(["restricted"])  # MPL2, portions GPL v3, LGPL v3, BSD-like

package(default_visibility = ["//visibility:public"])

config_setting(
    name = "using_hipcc",
    values = {
        "define": "using_rocm_hipcc=true",
    },
)

cc_library(
    name = "rocm_headers",
    hdrs = [
        "rocm/rocm_config.h",
        ":miopen-include",
        ":rccl-include",
        ":rocblas-include",
        ":rocfft-include",
        ":rocm-include",
    ],
    includes = [
        ".",
        "rocm/include",
        "rocm/include/rocrand",
    ],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "hip",
    srcs = ["rocm/lib/libhip_hcc.so"],
    data = ["rocm/lib/libhip_hcc.so"],
    includes = [
        ".",
        "rocm/include",
    ],
    linkstatic = 1,
    visibility = ["//visibility:public"],
)

cc_library(
    name = "rocblas",
    srcs = ["rocm/lib/librocblas.so"],
    data = ["rocm/lib/librocblas.so"],
    includes = [
        ".",
        "rocm/include",
    ],
    linkstatic = 1,
    visibility = ["//visibility:public"],
)

cc_library(
    name = "rocfft",
    srcs = ["rocm/lib/librocfft.so"],
    data = ["rocm/lib/librocfft.so"],
    includes = [
        ".",
        "rocm/include",
    ],
    linkstatic = 1,
    visibility = ["//visibility:public"],
)

cc_library(
    name = "hiprand",
    srcs = ["rocm/lib/libhiprand.so"],
    data = ["rocm/lib/libhiprand.so"],
    includes = [
        ".",
        "rocm/include",
        "rocm/include/rocrand",
    ],
    linkstatic = 1,
    visibility = ["//visibility:public"],
)

cc_library(
    name = "miopen",
    srcs = ["rocm/lib/libMIOpen.so"],
    data = ["rocm/lib/libMIOpen.so"],
    includes = [
        ".",
        "rocm/include",
    ],
    linkstatic = 1,
    visibility = ["//visibility:public"],
)

cc_library(
    name = "rccl",
    srcs = ["rocm/lib/librccl.so"],
    data = ["rocm/lib/librccl.so"],
    includes = [
        ".",
        "rocm/include",
    ],
    linkstatic = 1,
    visibility = ["//visibility:public"],
)

cc_library(
    name = "rocm",
    visibility = ["//visibility:public"],
    deps = [
        ":hip",
        ":hiprand",
        ":miopen",
        ":rocblas",
        ":rocfft",
        ":rocm_headers",
    ],
)

genrule(
    name = "rocm-include",
    outs = [
        "rocm/include/amd_comgr.h",
        "rocm/include/amd_hsa_common.h",
        "rocm/include/amd_hsa_elf.h",
        "rocm/include/amd_hsa_kernel_code.h",
        "rocm/include/amd_hsa_queue.h",
        "rocm/include/amd_hsa_signal.h",
        "rocm/include/as.h",
        "rocm/include/device_amd_hsa.h",
        "rocm/include/hcc/amd_hsa_common.h",
        "rocm/include/hcc/amd_hsa_elf.h",
        "rocm/include/hcc/amd_hsa_kernel_code.h",
        "rocm/include/hcc/amd_hsa_queue.h",
        "rocm/include/hcc/amd_hsa_signal.h",
        "rocm/include/hcc/array_view",
        "rocm/include/hcc/as.h",
        "rocm/include/hcc/clang-c/BuildSystem.h",
        "rocm/include/hcc/clang-c/CXCompilationDatabase.h",
        "rocm/include/hcc/clang-c/CXErrorCode.h",
        "rocm/include/hcc/clang-c/CXString.h",
        "rocm/include/hcc/clang-c/Documentation.h",
        "rocm/include/hcc/clang-c/Index.h",
        "rocm/include/hcc/clang-c/Platform.h",
        "rocm/include/hcc/coordinate",
        "rocm/include/hcc/device_amd_hsa.h",
        "rocm/include/hcc/experimental/algorithm",
        "rocm/include/hcc/experimental/exception_list",
        "rocm/include/hcc/experimental/execution_policy",
        "rocm/include/hcc/experimental/impl/algorithm_impl.inl",
        "rocm/include/hcc/experimental/impl/algorithm_impl_seq.inl",
        "rocm/include/hcc/experimental/impl/exclusive_scan.inl",
        "rocm/include/hcc/experimental/impl/inclusive_scan.inl",
        "rocm/include/hcc/experimental/impl/kernel_launch.inl",
        "rocm/include/hcc/experimental/impl/numeric_impl_seq.inl",
        "rocm/include/hcc/experimental/impl/reduce.inl",
        "rocm/include/hcc/experimental/impl/scan.inl",
        "rocm/include/hcc/experimental/impl/sort.inl",
        "rocm/include/hcc/experimental/impl/stablesort.inl",
        "rocm/include/hcc/experimental/impl/transform.inl",
        "rocm/include/hcc/experimental/impl/transform_exclusive_scan.inl",
        "rocm/include/hcc/experimental/impl/transform_inclusive_scan.inl",
        "rocm/include/hcc/experimental/impl/transform_reduce.inl",
        "rocm/include/hcc/experimental/impl/transform_scan.inl",
        "rocm/include/hcc/experimental/impl/type_utils.inl",
        "rocm/include/hcc/experimental/numeric",
        "rocm/include/hcc/grid_launch.h",
        "rocm/include/hcc/grid_launch.hpp",
        "rocm/include/hcc/hc.hpp",
        "rocm/include/hcc/hc_am.hpp",
        "rocm/include/hcc/hc_am_internal.hpp",
        "rocm/include/hcc/hc_defines.h",
        "rocm/include/hcc/hc_math.hpp",
        "rocm/include/hcc/hc_norm_unorm.inl",
        "rocm/include/hcc/hc_printf.hpp",
        "rocm/include/hcc/hc_prof_runtime.h",
        "rocm/include/hcc/hc_rt_debug.h",
        "rocm/include/hcc/hc_short_vector.hpp",
        "rocm/include/hcc/hc_short_vector.inl",
        "rocm/include/hcc/hcc_features.hpp",
        "rocm/include/hcc/hsa.h",
        "rocm/include/hcc/hsa_atomic.h",
        "rocm/include/hcc/kalmar_aligned_alloc.h",
        "rocm/include/hcc/kalmar_buffer.h",
        "rocm/include/hcc/kalmar_cpu_launch.h",
        "rocm/include/hcc/kalmar_exception.h",
        "rocm/include/hcc/kalmar_index.h",
        "rocm/include/hcc/kalmar_launch.h",
        "rocm/include/hcc/kalmar_math.h",
        "rocm/include/hcc/kalmar_runtime.h",
        "rocm/include/hcc/kalmar_serialize.h",
        "rocm/include/hcc/kalmar_short_vectors.inl",
        "rocm/include/hcc/llvm-c/Remarks.h",
        "rocm/include/hcc/llvm-c/lto.h",
        "rocm/include/hcc/llvm/Target/AMDGPU/AMDGPU.h",
        "rocm/include/hcc/llvm/Target/AMDGPU/Disassembler/CodeObjectDisassembler.h",
        "rocm/include/hcc/ockl.h",
        "rocm/include/hcc/ockl_hsa.h",
        "rocm/include/hcc/ocml.h",
        "rocm/include/hcc/pinned_vector.hpp",
        "rocm/include/hip/channel_descriptor.h",
        "rocm/include/hip/device_functions.h",
        "rocm/include/hip/driver_types.h",
        "rocm/include/hip/hcc_detail/channel_descriptor.h",
        "rocm/include/hip/hcc_detail/code_object_bundle.hpp",
        "rocm/include/hip/hcc_detail/concepts.hpp",
        "rocm/include/hip/hcc_detail/cuda/cuda.h",
        "rocm/include/hip/hcc_detail/cuda/math_functions.h",
        "rocm/include/hip/hcc_detail/device_functions.h",
        "rocm/include/hip/hcc_detail/device_library_decls.h",
        "rocm/include/hip/hcc_detail/driver_types.h",
        "rocm/include/hip/hcc_detail/elfio/elf_types.hpp",
        "rocm/include/hip/hcc_detail/elfio/elfio.hpp",
        "rocm/include/hip/hcc_detail/elfio/elfio_dump.hpp",
        "rocm/include/hip/hcc_detail/elfio/elfio_dynamic.hpp",
        "rocm/include/hip/hcc_detail/elfio/elfio_header.hpp",
        "rocm/include/hip/hcc_detail/elfio/elfio_note.hpp",
        "rocm/include/hip/hcc_detail/elfio/elfio_relocation.hpp",
        "rocm/include/hip/hcc_detail/elfio/elfio_section.hpp",
        "rocm/include/hip/hcc_detail/elfio/elfio_segment.hpp",
        "rocm/include/hip/hcc_detail/elfio/elfio_strings.hpp",
        "rocm/include/hip/hcc_detail/elfio/elfio_symbols.hpp",
        "rocm/include/hip/hcc_detail/elfio/elfio_utils.hpp",
        "rocm/include/hip/hcc_detail/functional_grid_launch.hpp",
        "rocm/include/hip/hcc_detail/grid_launch.h",
        "rocm/include/hip/hcc_detail/grid_launch.hpp",
        "rocm/include/hip/hcc_detail/grid_launch_GGL.hpp",
        "rocm/include/hip/hcc_detail/helpers.hpp",
        "rocm/include/hip/hcc_detail/hip_atomic.h",
        "rocm/include/hip/hcc_detail/hip_common.h",
        "rocm/include/hip/hcc_detail/hip_complex.h",
        "rocm/include/hip/hcc_detail/hip_db.h",
        "rocm/include/hip/hcc_detail/hip_fp16.h",
        "rocm/include/hip/hcc_detail/hip_fp16_gcc.h",
        "rocm/include/hip/hcc_detail/hip_fp16_math_fwd.h",
        "rocm/include/hip/hcc_detail/hip_ldg.h",
        "rocm/include/hip/hcc_detail/hip_memory.h",
        "rocm/include/hip/hcc_detail/hip_prof_str.h",
        "rocm/include/hip/hcc_detail/hip_runtime.h",
        "rocm/include/hip/hcc_detail/hip_runtime_api.h",
        "rocm/include/hip/hcc_detail/hip_surface_types.h",
        "rocm/include/hip/hcc_detail/hip_texture_types.h",
        "rocm/include/hip/hcc_detail/hip_vector_types.h",
        "rocm/include/hip/hcc_detail/hiprtc.h",
        "rocm/include/hip/hcc_detail/host_defines.h",
        "rocm/include/hip/hcc_detail/hsa_helpers.hpp",
        "rocm/include/hip/hcc_detail/llvm_intrinsics.h",
        "rocm/include/hip/hcc_detail/macro_based_grid_launch.hpp",
        "rocm/include/hip/hcc_detail/math_functions.h",
        "rocm/include/hip/hcc_detail/math_fwd.h",
        "rocm/include/hip/hcc_detail/program_state.hpp",
        "rocm/include/hip/hcc_detail/surface_functions.h",
        "rocm/include/hip/hcc_detail/texture_functions.h",
        "rocm/include/hip/hcc_detail/texture_types.h",
        "rocm/include/hip/hip_common.h",
        "rocm/include/hip/hip_complex.h",
        "rocm/include/hip/hip_fp16.h",
        "rocm/include/hip/hip_hcc.h",
        "rocm/include/hip/hip_profile.h",
        "rocm/include/hip/hip_runtime.h",
        "rocm/include/hip/hip_runtime_api.h",
        "rocm/include/hip/hip_texture_types.h",
        "rocm/include/hip/hip_vector_types.h",
        "rocm/include/hip/hiprtc.h",
        "rocm/include/hip/math_functions.h",
        "rocm/include/hip/nvcc_detail/channel_descriptor.h",
        "rocm/include/hip/nvcc_detail/hip_complex.h",
        "rocm/include/hip/nvcc_detail/hip_runtime.h",
        "rocm/include/hip/nvcc_detail/hip_runtime_api.h",
        "rocm/include/hip/nvcc_detail/hip_texture_types.h",
        "rocm/include/hip/texture_types.h",
        "rocm/include/hipblas-export.h",
        "rocm/include/hipblas-version.h",
        "rocm/include/hipblas.h",
        "rocm/include/hipfft.h",
        "rocm/include/hiprand/hiprand.h",
        "rocm/include/hiprand/hiprand.hpp",
        "rocm/include/hiprand/hiprand_hcc.h",
        "rocm/include/hiprand/hiprand_kernel.h",
        "rocm/include/hiprand/hiprand_kernel_hcc.h",
        "rocm/include/hiprand/hiprand_kernel_nvcc.h",
        "rocm/include/hiprand/hiprand_mtgp32_host.h",
        "rocm/include/hiprand/hiprand_nvcc.h",
        "rocm/include/hiprand/hiprand_version.h",
        "rocm/include/hsa.h",
        "rocm/include/hsa/Brig.h",
        "rocm/include/hsa/amd_hsa_common.h",
        "rocm/include/hsa/amd_hsa_elf.h",
        "rocm/include/hsa/amd_hsa_kernel_code.h",
        "rocm/include/hsa/amd_hsa_queue.h",
        "rocm/include/hsa/amd_hsa_signal.h",
        "rocm/include/hsa/amd_hsa_tools_interfaces.h",
        "rocm/include/hsa/hsa.h",
        "rocm/include/hsa/hsa_api_trace.h",
        "rocm/include/hsa/hsa_ext_amd.h",
        "rocm/include/hsa/hsa_ext_debugger.h",
        "rocm/include/hsa/hsa_ext_finalize.h",
        "rocm/include/hsa/hsa_ext_image.h",
        "rocm/include/hsa/hsa_ext_profiler.h",
        "rocm/include/hsa/hsa_ven_amd_aqlprofile.h",
        "rocm/include/hsa/hsa_ven_amd_loader.h",
        "rocm/include/hsakmt.h",
        "rocm/include/hsakmttypes.h",
        "rocm/include/linux/kfd_ioctl.h",
        "rocm/include/miopen/config.h",
        "rocm/include/miopen/export.h",
        "rocm/include/miopen/miopen.h",
        "rocm/include/miopen/version.h",
        "rocm/include/miopen_kernel_includes.h",
        "rocm/include/miopen_kernels.h",
        "rocm/include/miopengemm/accuracytests.hpp",
        "rocm/include/miopengemm/alphagenerator.hpp",
        "rocm/include/miopengemm/apitest.hpp",
        "rocm/include/miopengemm/architests.hpp",
        "rocm/include/miopengemm/basegenerator.hpp",
        "rocm/include/miopengemm/betacgenerator.hpp",
        "rocm/include/miopengemm/bundle.hpp",
        "rocm/include/miopengemm/bylinegenerator.hpp",
        "rocm/include/miopengemm/copygenerator.hpp",
        "rocm/include/miopengemm/cpugemm.hpp",
        "rocm/include/miopengemm/derivedparams.hpp",
        "rocm/include/miopengemm/enums.hpp",
        "rocm/include/miopengemm/error.hpp",
        "rocm/include/miopengemm/findparams.hpp",
        "rocm/include/miopengemm/floattostring.hpp",
        "rocm/include/miopengemm/gemm.hpp",
        "rocm/include/miopengemm/geometries.hpp",
        "rocm/include/miopengemm/geometry.hpp",
        "rocm/include/miopengemm/graph.hpp",
        "rocm/include/miopengemm/hint.hpp",
        "rocm/include/miopengemm/hyperparams.hpp",
        "rocm/include/miopengemm/kernelcache.hpp",
        "rocm/include/miopengemm/kernelcachemerge.hpp",
        "rocm/include/miopengemm/kernelstring.hpp",
        "rocm/include/miopengemm/macgrid.hpp",
        "rocm/include/miopengemm/miogemm.hpp",
        "rocm/include/miopengemm/nearest.hpp",
        "rocm/include/miopengemm/normalformgenerator.hpp",
        "rocm/include/miopengemm/oclutil.hpp",
        "rocm/include/miopengemm/outputwriter.hpp",
        "rocm/include/miopengemm/platform.hpp",
        "rocm/include/miopengemm/prepgenerator.hpp",
        "rocm/include/miopengemm/programcacher.hpp",
        "rocm/include/miopengemm/programs.hpp",
        "rocm/include/miopengemm/randomutil.hpp",
        "rocm/include/miopengemm/redirection.hpp",
        "rocm/include/miopengemm/setabcw.hpp",
        "rocm/include/miopengemm/solution.hpp",
        "rocm/include/miopengemm/standalone.hpp",
        "rocm/include/miopengemm/stringutilbase.hpp",
        "rocm/include/miopengemm/tiling.hpp",
        "rocm/include/miopengemm/timer.hpp",
        "rocm/include/miopengemm/tinyone.hpp",
        "rocm/include/miopengemm/tinytwo.hpp",
        "rocm/include/miopengemm/tinyzero.hpp",
        "rocm/include/ockl.h",
        "rocm/include/ockl_hsa.h",
        "rocm/include/ocml.h",
        "rocm/include/opencl1.2-c.pch",
        "rocm/include/opencl2.0-c.pch",
        "rocm/include/profiler/CXLActivityLogger/CXLActivityLogger.h",
        "rocm/include/rccl.h",
        "rocm/include/rocblas-auxiliary.h",
        "rocm/include/rocblas-export.h",
        "rocm/include/rocblas-functions.h",
        "rocm/include/rocblas-types.h",
        "rocm/include/rocblas-version.h",
        "rocm/include/rocblas.h",
        "rocm/include/rocblas_bfloat16.h",
        "rocm/include/rocfft-export.h",
        "rocm/include/rocfft-version.h",
        "rocm/include/rocfft.h",
        "rocm/include/rocprofiler/rocprofiler.h",
        "rocm/include/rocrand/rocrand.h",
        "rocm/include/rocrand/rocrand.hpp",
        "rocm/include/rocrand/rocrand_common.h",
        "rocm/include/rocrand/rocrand_discrete.h",
        "rocm/include/rocrand/rocrand_discrete_types.h",
        "rocm/include/rocrand/rocrand_kernel.h",
        "rocm/include/rocrand/rocrand_log_normal.h",
        "rocm/include/rocrand/rocrand_mrg32k3a.h",
        "rocm/include/rocrand/rocrand_mrg32k3a_precomputed.h",
        "rocm/include/rocrand/rocrand_mtgp32.h",
        "rocm/include/rocrand/rocrand_mtgp32_11213.h",
        "rocm/include/rocrand/rocrand_normal.h",
        "rocm/include/rocrand/rocrand_philox4x32_10.h",
        "rocm/include/rocrand/rocrand_poisson.h",
        "rocm/include/rocrand/rocrand_sobol32.h",
        "rocm/include/rocrand/rocrand_sobol_precomputed.h",
        "rocm/include/rocrand/rocrand_uniform.h",
        "rocm/include/rocrand/rocrand_version.h",
        "rocm/include/rocrand/rocrand_xorwow.h",
        "rocm/include/rocrand/rocrand_xorwow_precomputed.h",
    ],
    cmd = """cp -rLf "/opt/rocm/include/." "$(@D)/rocm/include/" """,
)

genrule(
    name = "rocfft-include",
    outs = [
        "rocm/include/rocfft/hipfft.h",
        "rocm/include/rocfft/rocfft-export.h",
        "rocm/include/rocfft/rocfft-version.h",
        "rocm/include/rocfft/rocfft.h",
    ],
    cmd = """cp -rLf "/opt/rocm/rocfft/include/." "$(@D)/rocm/include/rocfft/" """,
)

genrule(
    name = "rocblas-include",
    outs = [
        "rocm/include/rocblas/rocblas-auxiliary.h",
        "rocm/include/rocblas/rocblas-export.h",
        "rocm/include/rocblas/rocblas-functions.h",
        "rocm/include/rocblas/rocblas-types.h",
        "rocm/include/rocblas/rocblas-version.h",
        "rocm/include/rocblas/rocblas.h",
        "rocm/include/rocblas/rocblas_bfloat16.h",
    ],
    cmd = """cp -rLf "/opt/rocm/rocblas/include/." "$(@D)/rocm/include/rocblas/" """,
)

genrule(
    name = "miopen-include",
    outs = [
        "rocm/include/miopen/miopen/config.h",
        "rocm/include/miopen/miopen/export.h",
        "rocm/include/miopen/miopen/miopen.h",
        "rocm/include/miopen/miopen/version.h",
        "rocm/include/miopen/miopen_kernel_includes.h",
        "rocm/include/miopen/miopen_kernels.h",
    ],
    cmd = """cp -rLf "/opt/rocm/miopen/include/." "$(@D)/rocm/include/miopen/" """,
)

genrule(
    name = "rccl-include",
    outs = [
        "rocm/include/rccl/rccl.h",
    ],
    cmd = """cp -rLf "/opt/rocm/rccl/include/." "$(@D)/" """,
)

genrule(
    name = "rocm-lib",
    outs = [
        "rocm/lib/libhip_hcc.so",
        "rocm/lib/librocblas.so",
        "rocm/lib/librocfft.so",
        "rocm/lib/libhiprand.so",
        "rocm/lib/libMIOpen.so",
        "rocm/lib/librccl.so",
    ],
    cmd = """cp -f "/opt/rocm/hip/lib/libhip_hcc.so" "$(location rocm/lib/libhip_hcc.so)" && \
cp -f "/opt/rocm/rocblas/lib/librocblas.so.2.2.11.0" "$(location rocm/lib/librocblas.so)" && \
cp -f "/opt/rocm/rocfft/lib/librocfft.so.0.9.4.0" "$(location rocm/lib/librocfft.so)" && \
cp -f "/opt/rocm/hiprand/lib/libhiprand.so.2.6.0" "$(location rocm/lib/libhiprand.so)" && \
cp -f "/opt/rocm/miopen/lib/libMIOpen.so.1" "$(location rocm/lib/libMIOpen.so)" && \
cp -f "/opt/rocm/rccl/lib/librccl.so" "$(location rocm/lib/librccl.so)" """,
)
