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

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
  }

  for path in Dir[File.join(target_dir, 'lib{cuda.so*,nvcuvid.so*,nvidia-*.so*,{EGL,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['__GLX_VENDOR_LIBRARY_NAME'] = 'nvidia'
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__, 'c6-shim-env'), *ARGV)
