#!/usr/bin/env ruby
# encoding: UTF-8

require 'digest'
require 'fileutils'

if ARGV.length == 0
  STDERR.puts "substitute Nvidia's Linux OpenGL/Vulkan libraries:\n\s\s[env SHIM_DEBUG=1] #{File.basename($PROGRAM_NAME)} <application> [application args]"
  exit(1)
end

`sysctl hw.nvidia.version` =~ /^hw.nvidia.version: NVIDIA UNIX x86_64 Kernel Module  ([\d\.+]+)/
DRIVER_VERSION = $1

raise "No NVIDIA kernel module found" if not DRIVER_VERSION

NVIDIA_LIB64_DIR = ENV['NVIDIA_LIB64_DIR'] || '/compat/linux/usr/lib64'
NVIDIA_LIB32_DIR = ENV['NVIDIA_LIB32_DIR'] || '/compat/linux/usr/lib'

def libmap(target_dir)

  libglx_path = File.join(target_dir, "libGLX_nvidia.so.#{DRIVER_VERSION}")

  lmap = {
    'libgl_nvidia' => libglx_path,
    'libGL.so'     => libglx_path, # no glvnd
    'libGL.so.1'   => libglx_path  # no glvnd
  }

  for path in Dir[File.join(target_dir, 'lib{cuda.so*,nvcuvid.so*,nvidia-*.so*,GLX_nvidia*.so*}')]
    lmap[File.basename(path)] = path
  end

  lmap.map{|k, v| '%-40s %s' % [k, v]}.sort.join("\n")
end

ENV['LD_LIBMAP']        = [libmap(NVIDIA_LIB64_DIR), ENV['LD_LIBMAP']   ].compact.join("\n")
ENV['LD_32_LIBMAP']     = [libmap(NVIDIA_LIB32_DIR), ENV['LD_32_LIBMAP']].compact.join("\n")

ENV['OCL_ICD_VENDORS']  = File.join(__dir__, '../share/libc6-shim/icds/ocl')
ENV['VK_ICD_FILENAMES'] = File.join(__dir__, '../share/libc6-shim/icds/vk/nv.json')

exec([File.join(__dir__, 'with-glibc-shim')] * 2, *ARGV)
