mirror of https://github.com/AlexeyAB/darknet.git
517 lines
17 KiB
PowerShell
517 lines
17 KiB
PowerShell
<#
|
|
Copyright (c) Stefano Sinigardi
|
|
|
|
MIT License
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
SOFTWARE.
|
|
#>
|
|
|
|
$utils_psm1_version = "1.4.1"
|
|
$IsWindowsPowerShell = switch ( $PSVersionTable.PSVersion.Major ) {
|
|
5 { $true }
|
|
4 { $true }
|
|
3 { $true }
|
|
2 { $true }
|
|
default { $false }
|
|
}
|
|
|
|
$ExecutableSuffix = ""
|
|
if ($IsWindowsPowerShell -or $IsWindows) {
|
|
$ExecutableSuffix = ".exe"
|
|
}
|
|
|
|
$64bitPwsh = $([Environment]::Is64BitProcess)
|
|
$64bitOS = $([Environment]::Is64BitOperatingSystem)
|
|
$osArchitecture = [System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture
|
|
switch ($osArchitecture) {
|
|
"X86" {
|
|
$vcpkgArchitecture = "x86"
|
|
$vsArchitecture = "Win32"
|
|
}
|
|
"X64" {
|
|
$vcpkgArchitecture = "x64"
|
|
$vsArchitecture = "x64"
|
|
}
|
|
"Arm" {
|
|
$vcpkgArchitecture = "arm"
|
|
$vsArchitecture = "arm"
|
|
}
|
|
"Arm64" {
|
|
$vcpkgArchitecture = "arm64"
|
|
$vsArchitecture = "arm64"
|
|
}
|
|
default {
|
|
$vcpkgArchitecture = "x64"
|
|
$vsArchitecture = "x64"
|
|
Write-Output "Unknown architecture. Trying x64"
|
|
}
|
|
}
|
|
|
|
|
|
Push-Location $PSScriptRoot
|
|
$GIT_EXE = Get-Command "git" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Definition
|
|
if ($GIT_EXE) {
|
|
$IsInGitSubmoduleString = $(git rev-parse --show-superproject-working-tree 2> $null)
|
|
if ($IsInGitSubmoduleString.Length -eq 0) {
|
|
$IsInGitSubmodule = $false
|
|
}
|
|
else {
|
|
$IsInGitSubmodule = $true
|
|
}
|
|
}
|
|
else {
|
|
$IsInGitSubmodule = $false
|
|
}
|
|
Pop-Location
|
|
|
|
$cuda_version_full = "12.6.2"
|
|
$cuda_version_short = "12.6"
|
|
$cuda_version_full_dashed = $cuda_version_full.replace('.', '-')
|
|
$cuda_version_short_dashed = $cuda_version_short.replace('.', '-')
|
|
|
|
function activateVenv([string]$VenvPath) {
|
|
if ($IsWindowsPowerShell -or $IsWindows) {
|
|
$activate_script = "$VenvPath/Scripts/Activate.ps1"
|
|
}
|
|
else {
|
|
$activate_script = "$VenvPath/bin/Activate.ps1"
|
|
}
|
|
|
|
$activate_script = Resolve-Path $activate_script
|
|
$VenvPath = Resolve-Path $VenvPath
|
|
|
|
if ($env:VIRTUAL_ENV -eq $VenvPath) {
|
|
Write-Host "Venv already activated"
|
|
return
|
|
}
|
|
else {
|
|
Write-Host "Activating venv"
|
|
if (-Not (Test-Path $activate_script)) {
|
|
MyThrow("Could not find activate script at $activate_script")
|
|
}
|
|
& $activate_script
|
|
}
|
|
}
|
|
|
|
|
|
function getProgramFiles32bit() {
|
|
$out = ${env:PROGRAMFILES(X86)}
|
|
if ($null -eq $out) {
|
|
$out = ${env:PROGRAMFILES}
|
|
}
|
|
|
|
if ($null -eq $out) {
|
|
MyThrow("Could not find [Program Files 32-bit]")
|
|
}
|
|
|
|
return $out
|
|
}
|
|
|
|
function getLatestVisualStudioWithDesktopWorkloadPath([bool]$required = $true) {
|
|
$programFiles = getProgramFiles32bit
|
|
$vswhereExe = "$programFiles\Microsoft Visual Studio\Installer\vswhere.exe"
|
|
if (Test-Path $vswhereExe) {
|
|
$output = & $vswhereExe -products * -latest -requires Microsoft.VisualStudio.Workload.NativeDesktop -format xml
|
|
[xml]$asXml = $output
|
|
foreach ($instance in $asXml.instances.instance) {
|
|
$installationPath = $instance.InstallationPath -replace "\\$" # Remove potential trailing backslash
|
|
}
|
|
if (!$installationPath) {
|
|
#Write-Host "Warning: no full Visual Studio setup has been found, extending search to include also partial installations" -ForegroundColor Yellow
|
|
$output = & $vswhereExe -products * -latest -format xml
|
|
[xml]$asXml = $output
|
|
foreach ($instance in $asXml.instances.instance) {
|
|
$installationPath = $instance.InstallationPath -replace "\\$" # Remove potential trailing backslash
|
|
}
|
|
}
|
|
if (!$installationPath) {
|
|
#Write-Host "Warning: no full Visual Studio setup has been found, extending search to include also pre-release installations" -ForegroundColor Yellow
|
|
$output = & $vswhereExe -prerelease -products * -latest -format xml
|
|
[xml]$asXml = $output
|
|
foreach ($instance in $asXml.instances.instance) {
|
|
$installationPath = $instance.InstallationPath -replace "\\$" # Remove potential trailing backslash
|
|
}
|
|
}
|
|
if (!$installationPath) {
|
|
if ($required) {
|
|
MyThrow("Could not locate any installation of Visual Studio")
|
|
}
|
|
else {
|
|
Write-Host "Could not locate any installation of Visual Studio" -ForegroundColor Red
|
|
return $null
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if ($required) {
|
|
MyThrow("Could not locate vswhere at $vswhereExe")
|
|
}
|
|
else {
|
|
Write-Host "Could not locate vswhere at $vswhereExe" -ForegroundColor Red
|
|
return $null
|
|
}
|
|
}
|
|
return $installationPath
|
|
}
|
|
|
|
function getLatestVisualStudioWithDesktopWorkloadVersion([bool]$required = $true) {
|
|
$programFiles = getProgramFiles32bit
|
|
$vswhereExe = "$programFiles\Microsoft Visual Studio\Installer\vswhere.exe"
|
|
if (Test-Path $vswhereExe) {
|
|
$output = & $vswhereExe -products * -latest -requires Microsoft.VisualStudio.Workload.NativeDesktop -format xml
|
|
[xml]$asXml = $output
|
|
foreach ($instance in $asXml.instances.instance) {
|
|
$installationVersion = $instance.InstallationVersion
|
|
}
|
|
if (!$installationVersion) {
|
|
#Write-Host "Warning: no full Visual Studio setup has been found, extending search to include also partial installations" -ForegroundColor Yellow
|
|
$output = & $vswhereExe -products * -latest -format xml
|
|
[xml]$asXml = $output
|
|
foreach ($instance in $asXml.instances.instance) {
|
|
$installationVersion = $instance.installationVersion
|
|
}
|
|
}
|
|
if (!$installationVersion) {
|
|
#Write-Host "Warning: no full Visual Studio setup has been found, extending search to include also pre-release installations" -ForegroundColor Yellow
|
|
$output = & $vswhereExe -prerelease -products * -latest -format xml
|
|
[xml]$asXml = $output
|
|
foreach ($instance in $asXml.instances.instance) {
|
|
$installationVersion = $instance.installationVersion
|
|
}
|
|
}
|
|
if (!$installationVersion) {
|
|
if ($required) {
|
|
MyThrow("Could not locate any installation of Visual Studio")
|
|
}
|
|
else {
|
|
Write-Host "Could not locate any installation of Visual Studio" -ForegroundColor Red
|
|
return $null
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if ($required) {
|
|
MyThrow("Could not locate vswhere at $vswhereExe")
|
|
}
|
|
else {
|
|
Write-Host "Could not locate vswhere at $vswhereExe" -ForegroundColor Red
|
|
return $null
|
|
}
|
|
}
|
|
return $installationVersion
|
|
}
|
|
|
|
function setupVisualStudio([bool]$required = $true, [bool]$enable_clang = $false) {
|
|
$CL_EXE = Get-Command "cl" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Definition
|
|
if (-Not $CL_EXE) {
|
|
$vsfound = getLatestVisualStudioWithDesktopWorkloadPath($required)
|
|
if (-Not $vsfound) {
|
|
if ($required) {
|
|
MyThrow("Could not locate any installation of Visual Studio")
|
|
}
|
|
else {
|
|
Write-Host "Could not locate any installation of Visual Studio" -ForegroundColor Red
|
|
return
|
|
}
|
|
}
|
|
else {
|
|
Write-Host "Found VS in ${vsfound}"
|
|
Push-Location "${vsfound}/Common7/Tools"
|
|
cmd.exe /c "VsDevCmd.bat -arch=${vsArchitecture} & set" |
|
|
ForEach-Object {
|
|
if ($_ -match "=") {
|
|
$v = $_.split("="); Set-Item -force -path "ENV:\$($v[0])" -value "$($v[1])"
|
|
}
|
|
}
|
|
Pop-Location
|
|
if ($enable_clang) {
|
|
$env:PATH = "${vsfound}/VC/Tools/Llvm/${vsArchitecture}/bin;$env:PATH"
|
|
}
|
|
Write-Host "Visual Studio Command Prompt variables set"
|
|
}
|
|
}
|
|
}
|
|
|
|
function DownloadNinja() {
|
|
Write-Host "Downloading a portable version of Ninja" -ForegroundColor Yellow
|
|
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue ninja
|
|
Remove-Item -Force -ErrorAction SilentlyContinue ninja.zip
|
|
if ($IsWindows -or $IsWindowsPowerShell) {
|
|
$url = "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-win.zip"
|
|
}
|
|
elseif ($IsLinux) {
|
|
$url = "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-linux.zip"
|
|
}
|
|
elseif ($IsMacOS) {
|
|
$url = "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-mac.zip"
|
|
}
|
|
else {
|
|
MyThrow("Unknown OS, unsupported")
|
|
}
|
|
Invoke-RestMethod -Uri $url -Method Get -ContentType application/zip -OutFile "ninja.zip"
|
|
Expand-Archive -Path ninja.zip
|
|
Remove-Item -Force -ErrorAction SilentlyContinue ninja.zip
|
|
return "./ninja${ExecutableSuffix}"
|
|
}
|
|
|
|
function DownloadAria2() {
|
|
Write-Host "Downloading a portable version of Aria2" -ForegroundColor Yellow
|
|
if ($IsWindows -or $IsWindowsPowerShell) {
|
|
$basename = "aria2-1.37.0-win-32bit-build1"
|
|
$zipName = "${basename}.zip"
|
|
$outFolder = "$basename/$basename"
|
|
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue $outFolder
|
|
Remove-Item -Force -ErrorAction SilentlyContinue $zipName
|
|
$url = "https://github.com/aria2/aria2/releases/download/release-1.37.0/$zipName"
|
|
Invoke-RestMethod -Uri $url -Method Get -ContentType application/zip -OutFile $zipName
|
|
Expand-Archive -Path $zipName
|
|
}
|
|
elseif ($IsLinux) {
|
|
$basename = "aria2-1.36.0-linux-gnu-64bit-build1"
|
|
$zipName = "${basename}.tar.bz2"
|
|
$outFolder = $basename
|
|
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue $outFolder
|
|
Remove-Item -Force -ErrorAction SilentlyContinue $zipName
|
|
$url = "https://github.com/q3aql/aria2-static-builds/releases/download/v1.36.0/$zipName"
|
|
Invoke-RestMethod -Uri $url -Method Get -ContentType application/zip -OutFile $zipName
|
|
tar xf $zipName
|
|
}
|
|
elseif ($IsMacOS) {
|
|
$basename = "aria2-1.35.0-osx-darwin"
|
|
$zipName = "${basename}.tar.bz2"
|
|
$outFolder = "aria2-1.35.0/bin"
|
|
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue $outFolder
|
|
Remove-Item -Force -ErrorAction SilentlyContinue $zipName
|
|
$url = "https://github.com/aria2/aria2/releases/download/release-1.35.0/$zipName"
|
|
Invoke-RestMethod -Uri $url -Method Get -ContentType application/zip -OutFile $zipName
|
|
tar xf $zipName
|
|
}
|
|
else {
|
|
MyThrow("Unknown OS, unsupported")
|
|
}
|
|
Remove-Item -Force -ErrorAction SilentlyContinue $zipName
|
|
return "./$outFolder/aria2c${ExecutableSuffix}"
|
|
}
|
|
|
|
function DownloadLicencpp() {
|
|
$licencpp_version = "0.2.5"
|
|
Write-Host "Downloading a portable version of licencpp v${licencpp_version}" -ForegroundColor Yellow
|
|
if ($IsWindows -or $IsWindowsPowerShell) {
|
|
$basename = "licencpp-Windows"
|
|
}
|
|
elseif ($IsLinux) {
|
|
$basename = "licencpp-Linux"
|
|
}
|
|
else {
|
|
MyThrow("Unknown OS, unsupported")
|
|
}
|
|
$zipName = "${basename}.zip"
|
|
$outFolder = "${basename}"
|
|
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue $outFolder
|
|
Remove-Item -Force -ErrorAction SilentlyContinue $zipName
|
|
$url = "https://github.com/cenit/licencpp/releases/download/v${licencpp_version}/$zipName"
|
|
Invoke-RestMethod -Uri $url -Method Get -ContentType application/zip -OutFile $zipName
|
|
Expand-Archive -Path $zipName
|
|
Remove-Item -Force -ErrorAction SilentlyContinue $zipName
|
|
return "./$outFolder/licencpp${ExecutableSuffix}"
|
|
}
|
|
|
|
function Download7Zip() {
|
|
Write-Host "Downloading a portable version of 7-Zip" -ForegroundColor Yellow
|
|
if ($IsWindows -or $IsWindowsPowerShell) {
|
|
$basename = "7za920"
|
|
$zipName = "${basename}.zip"
|
|
$outFolder = "$basename"
|
|
$outSuffix = "a"
|
|
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue $outFolder
|
|
Remove-Item -Force -ErrorAction SilentlyContinue $zipName
|
|
$url = "https://www.7-zip.org/a/$zipName"
|
|
Invoke-RestMethod -Uri $url -Method Get -ContentType application/zip -OutFile $zipName
|
|
Expand-Archive -Path $zipName
|
|
}
|
|
elseif ($IsLinux) {
|
|
$basename = "7z2201-linux-x64"
|
|
$zipName = "${basename}.tar.xz"
|
|
$outFolder = $basename
|
|
$outSuffix = "z"
|
|
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue $outFolder
|
|
Remove-Item -Force -ErrorAction SilentlyContinue $zipName
|
|
$url = "https://www.7-zip.org/a/$zipName"
|
|
Invoke-RestMethod -Uri $url -Method Get -ContentType application/zip -OutFile $zipName
|
|
tar xf $zipName
|
|
}
|
|
elseif ($IsMacOS) {
|
|
$basename = "7z2107-mac"
|
|
$zipName = "${basename}.tar.xz"
|
|
$outFolder = $basename
|
|
$outSuffix = "z"
|
|
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue $outFolder
|
|
Remove-Item -Force -ErrorAction SilentlyContinue $zipName
|
|
$url = "https://www.7-zip.org/a/$zipName"
|
|
Invoke-RestMethod -Uri $url -Method Get -ContentType application/zip -OutFile $zipName
|
|
tar xf $zipName
|
|
}
|
|
else {
|
|
MyThrow("Unknown OS, unsupported")
|
|
}
|
|
Remove-Item -Force -ErrorAction SilentlyContinue $zipName
|
|
return "./$outFolder/7z${outSuffix}${ExecutableSuffix}"
|
|
}
|
|
|
|
Function MyThrow ($Message) {
|
|
if ($global:DisableInteractive) {
|
|
Write-Host $Message -ForegroundColor Red
|
|
throw
|
|
}
|
|
else {
|
|
# Check if running in PowerShell ISE
|
|
if ($psISE) {
|
|
# "ReadKey" not supported in PowerShell ISE.
|
|
# Show MessageBox UI
|
|
$Shell = New-Object -ComObject "WScript.Shell"
|
|
$Shell.Popup($Message, 0, "OK", 0)
|
|
throw
|
|
}
|
|
|
|
$Ignore =
|
|
16, # Shift (left or right)
|
|
17, # Ctrl (left or right)
|
|
18, # Alt (left or right)
|
|
20, # Caps lock
|
|
91, # Windows key (left)
|
|
92, # Windows key (right)
|
|
93, # Menu key
|
|
144, # Num lock
|
|
145, # Scroll lock
|
|
166, # Back
|
|
167, # Forward
|
|
168, # Refresh
|
|
169, # Stop
|
|
170, # Search
|
|
171, # Favorites
|
|
172, # Start/Home
|
|
173, # Mute
|
|
174, # Volume Down
|
|
175, # Volume Up
|
|
176, # Next Track
|
|
177, # Previous Track
|
|
178, # Stop Media
|
|
179, # Play
|
|
180, # Mail
|
|
181, # Select Media
|
|
182, # Application 1
|
|
183 # Application 2
|
|
|
|
Write-Host $Message -ForegroundColor Red
|
|
Write-Host -NoNewline "Press any key to continue..."
|
|
while (($null -eq $KeyInfo.VirtualKeyCode) -or ($Ignore -contains $KeyInfo.VirtualKeyCode)) {
|
|
$KeyInfo = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
|
|
}
|
|
Write-Host ""
|
|
throw
|
|
}
|
|
}
|
|
|
|
Function CopyTexFile ($MyFile) {
|
|
$MyFileName = Split-Path $MyFile -Leaf
|
|
New-Item -ItemType Directory -Force -Path "~/${latex_path}" | Out-Null
|
|
if (-Not (Test-Path "~/${latex_path}/$MyFileName" )) {
|
|
Write-Host "Copying $MyFile to ~/${latex_path}"
|
|
Copy-Item "$MyFile" "~/${latex_path}"
|
|
}
|
|
else {
|
|
Write-Host "~/${latex_path}/$MyFileName already present"
|
|
}
|
|
}
|
|
|
|
Function dos2unix {
|
|
Param (
|
|
[Parameter(mandatory = $true)]
|
|
[string[]]$path
|
|
)
|
|
|
|
Get-ChildItem -File -Recurse -Path $path |
|
|
ForEach-Object {
|
|
Write-Host "Converting $_"
|
|
$x = get-content -raw -path $_.fullname; $x -replace "`r`n", "`n" | Set-Content -NoNewline -Force -path $_.fullname
|
|
}
|
|
}
|
|
|
|
Function unix2dos {
|
|
Param (
|
|
[Parameter(mandatory = $true)]
|
|
[string[]]$path
|
|
)
|
|
|
|
Get-ChildItem -File -Recurse -Path $path |
|
|
ForEach-Object {
|
|
$x = get-content -raw -path $_.fullname
|
|
$SearchStr = [regex]::Escape("`r`n")
|
|
$SEL = Select-String -InputObject $x -Pattern $SearchStr
|
|
if ($null -ne $SEL) {
|
|
Write-Host "Converting $_"
|
|
# do nothing: avoid creating files containing `r`r`n when using unix2dos twice on the same file
|
|
}
|
|
else {
|
|
Write-Host "Converting $_"
|
|
$x -replace "`n", "`r`n" | Set-Content -NoNewline -Force -path $_.fullname
|
|
}
|
|
}
|
|
}
|
|
|
|
Function UpdateRepo {
|
|
if ($GIT_EXE) {
|
|
Get-ChildItem -Directory |
|
|
ForEach-Object {
|
|
Set-Location $_.Name
|
|
git pull
|
|
git submodule update --recursive
|
|
Set-Location ..
|
|
}
|
|
}
|
|
}
|
|
|
|
Export-ModuleMember -Variable utils_psm1_version
|
|
Export-ModuleMember -Variable IsWindowsPowerShell
|
|
Export-ModuleMember -Variable IsInGitSubmodule
|
|
Export-ModuleMember -Variable 64bitPwsh
|
|
Export-ModuleMember -Variable 64bitOS
|
|
Export-ModuleMember -Variable cuda_version_full
|
|
Export-ModuleMember -Variable cuda_version_short
|
|
Export-ModuleMember -Variable cuda_version_full_dashed
|
|
Export-ModuleMember -Variable cuda_version_short_dashed
|
|
Export-ModuleMember -Variable osArchitecture
|
|
Export-ModuleMember -Variable vcpkgArchitecture
|
|
Export-ModuleMember -Variable vsArchitecture
|
|
Export-ModuleMember -Variable ExecutableSuffix
|
|
Export-ModuleMember -Function activateVenv
|
|
Export-ModuleMember -Function getProgramFiles32bit
|
|
Export-ModuleMember -Function getLatestVisualStudioWithDesktopWorkloadPath
|
|
Export-ModuleMember -Function getLatestVisualStudioWithDesktopWorkloadVersion
|
|
Export-ModuleMember -Function setupVisualStudio
|
|
Export-ModuleMember -Function DownloadNinja
|
|
Export-ModuleMember -Function DownloadAria2
|
|
Export-ModuleMember -Function Download7Zip
|
|
Export-ModuleMember -Function DownloadLicencpp
|
|
Export-ModuleMember -Function MyThrow
|
|
Export-ModuleMember -Function CopyTexFile
|
|
Export-ModuleMember -Function dos2unix
|
|
Export-ModuleMember -Function unix2dos
|
|
Export-ModuleMember -Function UpdateRepo
|