File size: 3,483 Bytes
bd7b448 1db2179 695ac96 1db2179 695ac96 1db2179 3ab7cd8 1db2179 1fe9935 1db2179 c0f7580 1db2179 c0f7580 1db2179 695ac96 1db2179 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | // @ts-nocheck
import os from 'node:os'
import path from 'node:path'
import { readdir, access } from 'node:fs/promises'
import { exec as execCallback, spawn } from 'node:child_process'
import { promisify } from 'node:util'
const exec = promisify(execCallback)
async function pathExists(target: string) {
try {
await access(target)
return true
} catch {
return false
}
}
async function checkNvcc() {
try {
await exec('nvcc --version', { env: process.env })
} catch {
throw new Error('nvcc not found')
}
}
function sortVersionsDesc(versions: string[]) {
return versions.sort((a, b) => {
const verA = parseInt(a.replace('v', '').replace('.', ''))
const verB = parseInt(b.replace('v', '').replace('.', ''))
return verB - verA
})
}
async function setupCuda() {
const cudaPath = process.env.CUDA_PATH
if (cudaPath) {
const binPath = path.join(cudaPath, 'bin')
process.env.PATH = `${binPath}${path.delimiter}${process.env.PATH}`
return
}
const cudaRoot = 'C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA'
const versions = await readdir(cudaRoot).catch(() => [])
sortVersionsDesc(versions)
for (const version of versions) {
if (version.startsWith('v')) {
const binPath = path.join(cudaRoot, version, 'bin')
if (await pathExists(binPath)) {
process.env.PATH = `${binPath}${path.delimiter}${process.env.PATH}`
process.env.CUDA_PATH = path.join(cudaRoot, version)
return
}
}
}
throw new Error(
'NVCC not found. Please install the CUDA Toolkit from https://developer.nvidia.com/cuda-downloads',
)
}
async function setupCl() {
const vsRoots = [
'C:/Program Files/Microsoft Visual Studio',
'C:/Program Files (x86)/Microsoft Visual Studio',
]
const editions = ['Community', 'Professional', 'Enterprise', 'BuildTools']
for (const vsRoot of vsRoots) {
const vsVersions = await readdir(vsRoot).catch(() => [])
for (const vsVersion of vsVersions) {
for (const edition of editions) {
const vcPath = path.join(vsRoot, vsVersion, edition, 'VC/Tools/MSVC')
if (await pathExists(vcPath)) {
const msvcVersions = await readdir(vcPath)
for (const msvcVersion of msvcVersions) {
const binPath = path.join(vcPath, msvcVersion, 'bin/Hostx64/x64')
if (await pathExists(binPath)) {
process.env.PATH = `${binPath}${path.delimiter}${process.env.PATH}`
return
}
}
}
}
}
}
throw new Error(
'cl.exe not found. Please install Visual Studio with C++ build tools from https://visualstudio.microsoft.com/downloads/',
)
}
async function dev() {
if (os.type() === 'Windows_NT') {
// First, try to check if nvcc is available
await checkNvcc()
// If not found, try to set up CUDA paths
.catch(async () => {
await setupCuda()
// Check again after setup
await checkNvcc()
})
// Setup cl.exe path
await setupCl()
}
const args = process.argv.slice(2)
if (args.length === 0) {
throw new Error('No command provided')
}
const proc = spawn(args[0], args.slice(1), {
stdio: 'inherit',
shell: false,
env: process.env,
})
proc.on('error', (err) => {
throw err
})
proc.on('exit', (code) => {
process.exit(code)
})
}
dev().catch((err) => {
process.stderr.write(`Error: ${err.message} \n`)
process.exit(1)
})
|