mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-05-14 20:48:00 +00:00
### Description As suggested by SciPy's doc, we will `Build against NumPy 2.0.0, then it will work for all NumPy versions with the same major version number (NumPy does maintain backwards ABI compatibility), and as far back as NumPy 1.19 series at the time of writing` I think it works because in [numpyconfig.h#L64](https://github.com/numpy/numpy/blob/main/numpy/_core/include/numpy/numpyconfig.h#L64) there is a macro NPY_FEATURE_VERSION. By default it is set to NPY_1_19_API_VERSION. And the NPY_FEATURE_VERSION macro controls ABI. This PR only upgrade the build time dependency; When a user installs ONNX Runtime, they still can use numpy 1.x. ### Motivation and Context Recently numpy published a new version, 2.0.0, which is incompatible with the latest ONNX Runtime release.
705 lines
24 KiB
PowerShell
705 lines
24 KiB
PowerShell
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
# Licensed under the MIT License.
|
|
|
|
enum CMakeBuildType{
|
|
Debug
|
|
Release
|
|
RelWithDebInfo
|
|
MinSizeRel
|
|
}
|
|
|
|
|
|
# The DownloadAndExtract function was copied from: https://github.com/dotnet/arcade/blob/main/eng/common/native/CommonLibrary.psm1
|
|
<#
|
|
.SYNOPSIS
|
|
Get the name of a temporary folder under the native install directory
|
|
#>
|
|
function Get-TempDirectory {
|
|
#TODO: what if the env does not exist?
|
|
if (-not [string]::IsNullOrWhitespace($Env:AGENT_TEMPDIRECTORY)){
|
|
return $Env:AGENT_TEMPDIRECTORY
|
|
} else {
|
|
return $Env:TEMP
|
|
}
|
|
}
|
|
|
|
function Get-TempPathFilename {
|
|
[CmdletBinding(PositionalBinding=$false)]
|
|
Param (
|
|
[Parameter(Mandatory=$True)]
|
|
[string] $Path
|
|
)
|
|
$TempDir = Get-TempDirectory
|
|
$TempFilename = Split-Path $Path -leaf
|
|
$TempPath = Join-Path $TempDir $TempFilename
|
|
return $TempPath
|
|
}
|
|
|
|
<#
|
|
.SYNOPSIS
|
|
Unzip an archive
|
|
.DESCRIPTION
|
|
Powershell module to unzip an archive to a specified directory
|
|
.PARAMETER ZipPath (Required)
|
|
Path to archive to unzip
|
|
.PARAMETER OutputDirectory (Required)
|
|
Output directory for archive contents
|
|
.PARAMETER Force
|
|
Overwrite output directory contents if they already exist
|
|
.NOTES
|
|
- Returns True and does not perform an extraction if output directory already exists but Overwrite is not True.
|
|
- Returns True if unzip operation is successful
|
|
- Returns False if Overwrite is True and it is unable to remove contents of OutputDirectory
|
|
- Returns False if unable to extract zip archive
|
|
#>
|
|
function Expand-Zip {
|
|
[CmdletBinding(PositionalBinding=$false)]
|
|
Param (
|
|
[Parameter(Mandatory=$True)]
|
|
[string] $ZipPath,
|
|
[Parameter(Mandatory=$True)]
|
|
[string] $OutputDirectory,
|
|
[switch] $Force
|
|
)
|
|
if ([string]::IsNullOrWhitespace($OutputDirectory)){
|
|
Write-Error "OutputDirectory cannot be empty"
|
|
}
|
|
Write-Host "Extracting '$ZipPath' to '$OutputDirectory'"
|
|
try {
|
|
if ((Test-Path $OutputDirectory) -And (-Not $Force)) {
|
|
Write-Host "Directory '$OutputDirectory' already exists, skipping extract"
|
|
return $True
|
|
}
|
|
if (Test-Path $OutputDirectory) {
|
|
Write-Host "'Force' is 'True', but '$OutputDirectory' exists, removing directory"
|
|
Remove-Item -Path $OutputDirectory -Force -Recurse
|
|
if ($? -Eq $False) {
|
|
Write-Error "Unable to remove '$OutputDirectory'"
|
|
return $False
|
|
}
|
|
}
|
|
|
|
$TempOutputDirectory = Join-Path "$(Split-Path -Parent $OutputDirectory)" "$(Split-Path -Leaf $OutputDirectory).tmp"
|
|
|
|
if (Test-Path $TempOutputDirectory) {
|
|
Remove-Item $TempOutputDirectory -Force -Recurse
|
|
}
|
|
New-Item -Path $TempOutputDirectory -Force -ItemType "Directory" | Out-Null
|
|
|
|
Add-Type -assembly "system.io.compression.filesystem"
|
|
[io.compression.zipfile]::ExtractToDirectory("$ZipPath", "$TempOutputDirectory")
|
|
if ($? -Eq $False) {
|
|
Write-Error "Unable to extract '$ZipPath'"
|
|
return $False
|
|
}
|
|
|
|
Move-Item -Path $TempOutputDirectory -Destination $OutputDirectory
|
|
}
|
|
catch {
|
|
Write-Host $_
|
|
Write-Host $_.Exception
|
|
|
|
return $False
|
|
}
|
|
return $True
|
|
}
|
|
|
|
<#
|
|
.SYNOPSIS
|
|
Helper module to install an archive to a directory
|
|
.DESCRIPTION
|
|
Helper module to download and extract an archive to a specified directory
|
|
.PARAMETER Uri
|
|
Uri of artifact to download
|
|
.PARAMETER InstallDirectory
|
|
Directory to extract artifact contents to.
|
|
.PARAMETER Force
|
|
Force download / extraction if file or contents already exist. Default = False
|
|
.PARAMETER DownloadRetries
|
|
Total number of retry attempts. Default = 5
|
|
.PARAMETER RetryWaitTimeInSeconds
|
|
Wait time between retry attempts in seconds. Default = 30
|
|
.NOTES
|
|
Returns False if download or extraction fail, True otherwise
|
|
#>
|
|
function DownloadAndExtract {
|
|
[CmdletBinding(PositionalBinding=$false)]
|
|
Param (
|
|
[Parameter(Mandatory=$True)]
|
|
[string] $Uri,
|
|
[Parameter(Mandatory=$True)]
|
|
[string] $InstallDirectory,
|
|
[switch] $Force = $False,
|
|
[int] $DownloadRetries = 5,
|
|
[int] $RetryWaitTimeInSeconds = 30
|
|
)
|
|
# Define verbose switch if undefined
|
|
$Verbose = $VerbosePreference -Eq "Continue"
|
|
|
|
$TempToolPath = Get-TempPathFilename -Path $Uri
|
|
Write-Host "TempToolPath=$TempToolPath"
|
|
# Download native tool
|
|
$DownloadStatus = Get-File -Uri $Uri `
|
|
-Path $TempToolPath `
|
|
-DownloadRetries $DownloadRetries `
|
|
-RetryWaitTimeInSeconds $RetryWaitTimeInSeconds `
|
|
-Force:$Force `
|
|
-Verbose:$Verbose
|
|
|
|
if ($DownloadStatus -Eq $False) {
|
|
Write-Error "Download failed from $Uri"
|
|
return $False
|
|
}
|
|
|
|
|
|
# Extract native tool
|
|
$UnzipStatus = Expand-Zip -ZipPath $TempToolPath `
|
|
-OutputDirectory $InstallDirectory `
|
|
-Force:$Force `
|
|
-Verbose:$Verbose
|
|
if ($UnzipStatus -Eq $False) {
|
|
# Retry Download one more time with Force=true
|
|
$DownloadRetryStatus = Get-File -Uri $Uri `
|
|
-Path $TempToolPath `
|
|
-DownloadRetries 1 `
|
|
-RetryWaitTimeInSeconds $RetryWaitTimeInSeconds `
|
|
-Force:$True `
|
|
-Verbose:$Verbose
|
|
|
|
if ($DownloadRetryStatus -Eq $False) {
|
|
Write-Error "Last attempt of download failed as well"
|
|
return $False
|
|
}
|
|
|
|
# Retry unzip again one more time with Force=true
|
|
$UnzipRetryStatus = Expand-Zip -ZipPath $TempToolPath `
|
|
-OutputDirectory $InstallDirectory `
|
|
-Force:$True `
|
|
-Verbose:$Verbose
|
|
if ($UnzipRetryStatus -Eq $False)
|
|
{
|
|
Write-Error "Last attempt of unzip failed as well"
|
|
# Clean up partial zips and extracts
|
|
if (Test-Path $TempToolPath) {
|
|
Remove-Item $TempToolPath -Force
|
|
}
|
|
if (Test-Path $InstallDirectory) {
|
|
Remove-Item $InstallDirectory -Force -Recurse
|
|
}
|
|
return $False
|
|
}
|
|
}
|
|
|
|
return $True
|
|
}
|
|
|
|
<#
|
|
.SYNOPSIS
|
|
Download a file, retry on failure
|
|
.DESCRIPTION
|
|
Download specified file and retry if attempt fails
|
|
.PARAMETER Uri
|
|
Uri of file to download. If Uri is a local path, the file will be copied instead of downloaded
|
|
.PARAMETER Path
|
|
Path to download or copy uri file to
|
|
.PARAMETER Force
|
|
Overwrite existing file if present. Default = False
|
|
.PARAMETER DownloadRetries
|
|
Total number of retry attempts. Default = 5
|
|
.PARAMETER RetryWaitTimeInSeconds
|
|
Wait time between retry attempts in seconds Default = 30
|
|
#>
|
|
function Get-File {
|
|
[CmdletBinding(PositionalBinding=$false)]
|
|
Param (
|
|
[Parameter(Mandatory=$True)]
|
|
[string] $Uri,
|
|
[Parameter(Mandatory=$True)]
|
|
[string] $Path,
|
|
[int] $DownloadRetries = 5,
|
|
[int] $RetryWaitTimeInSeconds = 30,
|
|
[switch] $Force = $False
|
|
)
|
|
$Attempt = 0
|
|
|
|
if ($Force) {
|
|
if (Test-Path $Path) {
|
|
Remove-Item $Path -Force
|
|
}
|
|
}
|
|
if (Test-Path $Path) {
|
|
Write-Host "File '$Path' already exists, skipping download"
|
|
return $True
|
|
}
|
|
|
|
$DownloadDirectory = Split-Path -ErrorAction Ignore -Path "$Path" -Parent
|
|
if (-Not (Test-Path $DownloadDirectory)) {
|
|
New-Item -path $DownloadDirectory -force -itemType "Directory" | Out-Null
|
|
}
|
|
|
|
$TempPath = "$Path.tmp"
|
|
if (Test-Path -IsValid -Path $Uri) {
|
|
Write-Verbose "'$Uri' is a file path, copying temporarily to '$TempPath'"
|
|
Copy-Item -Path $Uri -Destination $TempPath
|
|
Write-Verbose "Moving temporary file to '$Path'"
|
|
Move-Item -Path $TempPath -Destination $Path
|
|
return $?
|
|
}
|
|
else {
|
|
# Don't display the console progress UI - it's a huge perf hit
|
|
$ProgressPreference = 'SilentlyContinue'
|
|
while($Attempt -Lt $DownloadRetries)
|
|
{
|
|
try {
|
|
Invoke-WebRequest -UseBasicParsing -Uri $Uri -OutFile $TempPath
|
|
Write-Verbose "Downloaded to temporary location '$TempPath'"
|
|
Move-Item -Path $TempPath -Destination $Path
|
|
Write-Verbose "Moved temporary file to '$Path'"
|
|
return $True
|
|
}
|
|
catch {
|
|
$Attempt++
|
|
if ($Attempt -Lt $DownloadRetries) {
|
|
$AttemptsLeft = $DownloadRetries - $Attempt
|
|
Write-Warning "Download failed, $AttemptsLeft attempts remaining, will retry in $RetryWaitTimeInSeconds seconds"
|
|
Start-Sleep -Seconds $RetryWaitTimeInSeconds
|
|
}
|
|
else {
|
|
Write-Error $_
|
|
Write-Error $_.Exception
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $False
|
|
}
|
|
|
|
<#
|
|
.Description
|
|
The Get-DownloadURL function returns the download URL of a external dependency. The URL might be local file path or
|
|
a remote HTTPS URL.
|
|
|
|
.PARAMETER name
|
|
The name of the dependency, should present in the first column of ONNX Runtime's deps.txt.
|
|
|
|
.PARAMETER src_root
|
|
The full path of ONNX Runtime's top level source diretory for locating deps.txt.
|
|
#>
|
|
|
|
function Get-DownloadURL {
|
|
param (
|
|
[Parameter(Mandatory)][string]$name,
|
|
[Parameter(Mandatory)][string]$src_root
|
|
)
|
|
$entry = Import-Csv -Path "$src_root\cmake\deps.txt" -Delimiter ';' -Header name,url,hash -Encoding UTF8 | Where-Object name -eq $name
|
|
return $entry.url
|
|
}
|
|
|
|
<#
|
|
.Description
|
|
The Install-Pybind function installs pybind11 headers, which are needed for building ONNX from source.
|
|
|
|
.PARAMETER cmake_path
|
|
The full path of cmake.exe
|
|
|
|
.PARAMETER src_root
|
|
The full path of ONNX Runtime's top level source diretory for locating deps.txt.
|
|
|
|
.PARAMETER build_config
|
|
The value of CMAKE_BUILD_TYPE, can be Debug, Release, RelWithDebInfo or MinSizeRel.
|
|
#>
|
|
|
|
function Install-Pybind {
|
|
|
|
param (
|
|
[Parameter(Mandatory)][string]$cmake_path,
|
|
[Parameter(Mandatory)][string]$msbuild_path,
|
|
[Parameter(Mandatory)][string]$cpu_arch,
|
|
[Parameter(Mandatory)][string]$src_root,
|
|
[Parameter(Mandatory)][CMakeBuildType]$build_config,
|
|
[Parameter(Mandatory)][string[]]$cmake_extra_args
|
|
)
|
|
|
|
pushd .
|
|
|
|
$url=Get-DownloadURL -name pybind11 -src_root $src_root
|
|
Write-Host "Downloading pybind11 from $url"
|
|
$temp_dir = Get-TempDirectory
|
|
$pybind_src_dir = Join-Path $temp_dir "pybind"
|
|
$download_finished = DownloadAndExtract -Uri $url -InstallDirectory $pybind_src_dir -Force
|
|
if(-Not $download_finished){
|
|
Write-Host -Object "Download failed"
|
|
exit 1
|
|
}
|
|
cd $pybind_src_dir
|
|
cd *
|
|
mkdir build
|
|
cd build
|
|
[string[]]$cmake_args = "..", "-DCMAKE_INSTALL_PREFIX=$install_prefix", "-DBUILD_TESTING=OFF"
|
|
$cmake_args += $cmake_extra_args
|
|
&$cmake_path $cmake_args
|
|
if ($lastExitCode -ne 0) {
|
|
Write-Host -Object "CMake command failed. Exitcode: $exitCode"
|
|
exit $lastExitCode
|
|
}
|
|
|
|
$msbuild_args = "-nodeReuse:false", "-nologo", "-nr:false", "-maxcpucount", "-p:UseMultiToolTask=true", "-p:configuration=`"$build_config`""
|
|
|
|
if ($use_cache) {
|
|
$msbuild_args += "/p:CLToolExe=cl.exe", "/p:CLToolPath=C:\ProgramData\chocolatey\bin", "/p:TrackFileAccess=false", "/p:UseMultiToolTask=true"
|
|
}
|
|
|
|
if($cpu_arch -eq 'x86'){
|
|
$msbuild_args += "/p:platform=Win32"
|
|
} elseif($cpu_arch -eq 'x64') {
|
|
$msbuild_args += "/p:platform=x64"
|
|
}
|
|
|
|
|
|
$final_args = $msbuild_args + "pybind11.sln"
|
|
&$msbuild_path $final_args
|
|
$final_args = $msbuild_args + "INSTALL.vcxproj"
|
|
&$msbuild_path $final_args
|
|
|
|
Write-Host "Installing pybind finished."
|
|
|
|
popd
|
|
}
|
|
|
|
<#
|
|
.Description
|
|
The Install-Abseil function installs Google's abseil library from source.
|
|
|
|
.PARAMETER cmake_path
|
|
The full path of cmake.exe
|
|
|
|
.PARAMETER src_root
|
|
The full path of ONNX Runtime's top level source diretory
|
|
|
|
.PARAMETER build_config
|
|
The value of CMAKE_BUILD_TYPE, can be Debug, Release, RelWithDebInfo or MinSizeRel.
|
|
#>
|
|
function Install-Abseil {
|
|
|
|
param (
|
|
[Parameter(Mandatory)][string]$cmake_path,
|
|
[Parameter(Mandatory)][string]$msbuild_path,
|
|
[Parameter(Mandatory)][string]$cpu_arch,
|
|
[Parameter(Mandatory)][string]$src_root,
|
|
[Parameter(Mandatory)][CMakeBuildType]$build_config,
|
|
[Parameter(Mandatory)][string[]]$cmake_extra_args
|
|
)
|
|
|
|
pushd .
|
|
$url=Get-DownloadURL -name abseil_cpp -src_root $src_root
|
|
Write-Host "Downloading abseil_cpp from $url"
|
|
$temp_dir = Get-TempDirectory
|
|
$absl_src_dir = Join-Path $temp_dir "abseil_cpp"
|
|
$download_finished = DownloadAndExtract -Uri $url -InstallDirectory $absl_src_dir -Force
|
|
if(-Not $download_finished){
|
|
exit 1
|
|
}
|
|
cd $absl_src_dir
|
|
cd *
|
|
|
|
# Search patch.exe
|
|
$patch_path = 'C:\Program Files\Git\usr\bin\patch.exe'
|
|
if(-not (Test-Path $patch_path -PathType Leaf)){
|
|
$git_command_path = (Get-Command -CommandType Application git)[0].Path
|
|
Write-Host "Git command path:$git_command_path"
|
|
$git_installation_folder = Split-Path -Path (Split-Path -Path $git_command_path)
|
|
$patch_path = Join-Path -Path $git_installation_folder "usr\bin\patch.exe"
|
|
}
|
|
if(Test-Path $patch_path -PathType Leaf){
|
|
Write-Host "Patching abseil ..."
|
|
Get-Content $src_root\cmake\patches\abseil\absl_windows.patch | &$patch_path --ignore-whitespace -p1
|
|
} else {
|
|
Write-Host "Skip patching abseil since we cannot find patch.exe at $patch_path"
|
|
}
|
|
|
|
# Run cmake to generate Visual Studio sln file
|
|
[string[]]$cmake_args = ".", "-DABSL_PROPAGATE_CXX_STD=ON", "-DCMAKE_BUILD_TYPE=$build_config", "-DBUILD_TESTING=OFF", "-DABSL_USE_EXTERNAL_GOOGLETEST=ON", "-DCMAKE_INSTALL_PREFIX=$install_prefix"
|
|
$cmake_args += $cmake_extra_args
|
|
|
|
&$cmake_path $cmake_args
|
|
if ($lastExitCode -ne 0) {
|
|
Write-Host -Object "CMake command failed. Exitcode: $exitCode"
|
|
exit $lastExitCode
|
|
}
|
|
|
|
$msbuild_args = "-nodeReuse:false", "-nologo", "-nr:false", "-maxcpucount", "-p:UseMultiToolTask=true", "-p:configuration=`"$build_config`""
|
|
|
|
if ($use_cache) {
|
|
$msbuild_args += "/p:CLToolExe=cl.exe", "/p:CLToolPath=C:\ProgramData\chocolatey\bin", "/p:TrackFileAccess=false", "/p:UseMultiToolTask=true"
|
|
}
|
|
|
|
if($cpu_arch -eq 'x86'){
|
|
$msbuild_args += "/p:platform=Win32"
|
|
} elseif($cpu_arch -eq 'x64') {
|
|
$msbuild_args += "/p:platform=x64"
|
|
}
|
|
|
|
$final_args = $msbuild_args + "absl.sln"
|
|
&$msbuild_path $final_args
|
|
if ($lastExitCode -ne 0) {
|
|
exit $lastExitCode
|
|
}
|
|
$final_args = $msbuild_args + "INSTALL.vcxproj"
|
|
&$msbuild_path $final_args
|
|
if ($lastExitCode -ne 0) {
|
|
exit $lastExitCode
|
|
}
|
|
Write-Host "Installing absl finished."
|
|
popd
|
|
}
|
|
|
|
<#
|
|
.Description
|
|
The Install-UTF8-Range function installs Google's utf8_range library from source.
|
|
utf8_range depends on Abseil.
|
|
|
|
.PARAMETER cmake_path
|
|
The full path of cmake.exe
|
|
|
|
.PARAMETER src_root
|
|
The full path of ONNX Runtime's top level source diretory
|
|
|
|
.PARAMETER build_config
|
|
The value of CMAKE_BUILD_TYPE, can be Debug, Release, RelWithDebInfo or MinSizeRel.
|
|
#>
|
|
function Install-UTF8-Range {
|
|
|
|
param (
|
|
[Parameter(Mandatory)][string]$cmake_path,
|
|
[Parameter(Mandatory)][string]$msbuild_path,
|
|
[Parameter(Mandatory)][string]$cpu_arch,
|
|
[Parameter(Mandatory)][string]$src_root,
|
|
[Parameter(Mandatory)][CMakeBuildType]$build_config,
|
|
[Parameter(Mandatory)][string[]]$cmake_extra_args
|
|
)
|
|
|
|
pushd .
|
|
$url=Get-DownloadURL -name utf8_range -src_root $src_root
|
|
Write-Host "Downloading utf8_range from $url"
|
|
$temp_dir = Get-TempDirectory
|
|
$absl_src_dir = Join-Path $temp_dir "utf8_range"
|
|
$download_finished = DownloadAndExtract -Uri $url -InstallDirectory $absl_src_dir -Force
|
|
if(-Not $download_finished){
|
|
exit 1
|
|
}
|
|
cd $absl_src_dir
|
|
cd *
|
|
|
|
# Run cmake to generate Visual Studio sln file
|
|
[string[]]$cmake_args = ".", "-Dutf8_range_ENABLE_TESTS=OFF", "-Dutf8_range_ENABLE_INSTALL=ON", "-DCMAKE_BUILD_TYPE=$build_config", "-DBUILD_TESTING=OFF", "-DCMAKE_INSTALL_PREFIX=$install_prefix"
|
|
$cmake_args += $cmake_extra_args
|
|
|
|
&$cmake_path $cmake_args
|
|
if ($lastExitCode -ne 0) {
|
|
Write-Host -Object "CMake command failed. Exitcode: $exitCode"
|
|
exit $lastExitCode
|
|
}
|
|
|
|
$msbuild_args = "-nodeReuse:false", "-nologo", "-nr:false", "-maxcpucount", "-p:UseMultiToolTask=true", "-p:configuration=`"$build_config`""
|
|
|
|
if ($use_cache) {
|
|
$msbuild_args += "/p:CLToolExe=cl.exe", "/p:CLToolPath=C:\ProgramData\chocolatey\bin", "/p:TrackFileAccess=false", "/p:UseMultiToolTask=true"
|
|
}
|
|
|
|
if($cpu_arch -eq 'x86'){
|
|
$msbuild_args += "/p:platform=Win32"
|
|
} elseif($cpu_arch -eq 'x64') {
|
|
$msbuild_args += "/p:platform=x64"
|
|
}
|
|
|
|
$final_args = $msbuild_args + "utf8_range.sln"
|
|
&$msbuild_path $final_args
|
|
if ($lastExitCode -ne 0) {
|
|
exit $lastExitCode
|
|
}
|
|
$final_args = $msbuild_args + "INSTALL.vcxproj"
|
|
&$msbuild_path $final_args
|
|
if ($lastExitCode -ne 0) {
|
|
exit $lastExitCode
|
|
}
|
|
Write-Host "Installing utf8_range finished."
|
|
popd
|
|
}
|
|
|
|
<#
|
|
.Description
|
|
The Install-ONNX function installs ONNX python package from source and also the python packages that it depends on.
|
|
This script will build protobuf C/C++ lib/exe for the CPU arch of the current build machine, because we need to run
|
|
protoc.exe on this machine.
|
|
|
|
.PARAMETER cmake_path
|
|
The full path of cmake.exe
|
|
|
|
.PARAMETER src_root
|
|
The full path of ONNX Runtime's top level source diretory
|
|
|
|
.PARAMETER build_config
|
|
The value of CMAKE_BUILD_TYPE, can be Debug, Release, RelWithDebInfo or MinSizeRel.
|
|
#>
|
|
function Install-Protobuf {
|
|
|
|
param (
|
|
[Parameter(Mandatory)][string]$cmake_path,
|
|
[Parameter(Mandatory)][string]$msbuild_path,
|
|
[Parameter(Mandatory)][string]$cpu_arch,
|
|
[Parameter(Mandatory)][string]$src_root,
|
|
[Parameter(Mandatory)][CMakeBuildType]$build_config,
|
|
[Parameter(Mandatory)][string[]]$cmake_extra_args
|
|
)
|
|
|
|
pushd .
|
|
$url=Get-DownloadURL -name protobuf -src_root $src_root
|
|
Write-Host "Downloading protobuf from $url"
|
|
$temp_dir = Get-TempDirectory
|
|
$protobuf_src_dir = Join-Path $temp_dir "protobuf"
|
|
$download_finished = DownloadAndExtract -Uri $url -InstallDirectory $protobuf_src_dir -Force
|
|
if(-Not $download_finished){
|
|
exit 1
|
|
}
|
|
cd $protobuf_src_dir
|
|
cd *
|
|
# Search patch.exe
|
|
$patch_path = 'C:\Program Files\Git\usr\bin\patch.exe'
|
|
if(-not (Test-Path $patch_path -PathType Leaf)){
|
|
$git_command_path = (Get-Command -CommandType Application git)[0].Path
|
|
Write-Host "Git command path:$git_command_path"
|
|
$git_installation_folder = Split-Path -Path (Split-Path -Path $git_command_path)
|
|
$patch_path = Join-Path -Path $git_installation_folder "usr\bin\patch.exe"
|
|
}
|
|
if(Test-Path $patch_path -PathType Leaf){
|
|
Write-Host "Patching protobuf ..."
|
|
Get-Content $src_root\cmake\patches\protobuf\protobuf_cmake.patch | &$patch_path --ignore-whitespace -p1
|
|
} else {
|
|
Write-Host "Skip patching protobuf since we cannot find patch.exe at $patch_path"
|
|
}
|
|
|
|
# Run cmake to generate Visual Studio sln file
|
|
[string[]]$cmake_args = ".", "-Dprotobuf_DISABLE_RTTI=ON", "-DCMAKE_BUILD_TYPE=$build_config", "-Dprotobuf_BUILD_TESTS=OFF", "-Dprotobuf_USE_EXTERNAL_GTEST=ON", "-DBUILD_SHARED_LIBS=OFF", "-DCMAKE_INSTALL_PREFIX=$install_prefix", "-Dprotobuf_MSVC_STATIC_RUNTIME=OFF", "-Dprotobuf_ABSL_PROVIDER=package"
|
|
$cmake_args += $cmake_extra_args
|
|
|
|
&$cmake_path $cmake_args
|
|
if ($lastExitCode -ne 0) {
|
|
Write-Host -Object "CMake command failed. Exitcode: $exitCode"
|
|
exit $lastExitCode
|
|
}
|
|
|
|
$msbuild_args = "-nodeReuse:false", "-nologo", "-nr:false", "-maxcpucount", "-p:UseMultiToolTask=true", "-p:configuration=`"$build_config`""
|
|
if($cpu_arch -eq 'x86'){
|
|
$msbuild_args += "/p:platform=Win32"
|
|
} elseif($cpu_arch -eq 'x64') {
|
|
$msbuild_args += "/p:platform=x64"
|
|
}
|
|
|
|
if ($use_cache) {
|
|
$msbuild_args += "/p:CLToolExe=cl.exe", "/p:CLToolPath=C:\ProgramData\chocolatey\bin", "/p:TrackFileAccess=false", "/p:UseMultiToolTask=true"
|
|
}
|
|
|
|
$final_args = $msbuild_args + "protobuf.sln"
|
|
&$msbuild_path $final_args
|
|
if ($lastExitCode -ne 0) {
|
|
exit $lastExitCode
|
|
}
|
|
$final_args = $msbuild_args + "INSTALL.vcxproj"
|
|
&$msbuild_path $final_args
|
|
if ($lastExitCode -ne 0) {
|
|
exit $lastExitCode
|
|
}
|
|
Write-Host "Installing protobuf finished."
|
|
popd
|
|
}
|
|
|
|
<#
|
|
.Description
|
|
The Install-ONNX function installs ONNX python package from source and also the python packages that it depends on.
|
|
protoc.exe must exist in the PATH.
|
|
#>
|
|
function Install-ONNX {
|
|
|
|
param (
|
|
[Parameter(Mandatory)][CMakeBuildType]$build_config,
|
|
[Parameter(Mandatory)][string]$src_root,
|
|
[Parameter(Mandatory)][string]$protobuf_version
|
|
)
|
|
|
|
pushd .
|
|
|
|
Write-Host "Uninstalling onnx and ignore errors if there is any..."
|
|
[string[]]$pip_args ="-m", "pip", "uninstall", "-y", "onnx", "-qq"
|
|
&"python.exe" $pip_args
|
|
if ($lastExitCode -ne 0) {
|
|
exit $lastExitCode
|
|
}
|
|
$temp_dir = Get-TempDirectory
|
|
$new_requirements_text_file = Join-Path $temp_dir "new_requirements.txt"
|
|
Write-Host "Installing python packages..."
|
|
Get-Content "$src_root\tools\ci_build\github\linux\docker\inference\x86_64\python\cpu\scripts\requirements.txt" | Select-String -pattern 'onnx' -notmatch | Out-File $new_requirements_text_file
|
|
|
|
[string[]]$pip_args = "-m", "pip", "install", "-qq", "--disable-pip-version-check", "-r", $new_requirements_text_file
|
|
&"python.exe" $pip_args
|
|
if ($lastExitCode -ne 0) {
|
|
exit $lastExitCode
|
|
}
|
|
|
|
$url=Get-DownloadURL -name onnx -src_root $src_root
|
|
$onnx_src_dir = Join-Path $temp_dir "onnx"
|
|
$download_finished = DownloadAndExtract -Uri $url -InstallDirectory $onnx_src_dir -Force
|
|
if(-Not $download_finished){
|
|
exit 1
|
|
}
|
|
cd $onnx_src_dir
|
|
cd *
|
|
|
|
# Search patch.exe
|
|
$patch_path = 'C:\Program Files\Git\usr\bin\patch.exe'
|
|
if(-not (Test-Path $patch_path -PathType Leaf)){
|
|
$git_command_path = (Get-Command -CommandType Application git)[0].Path
|
|
Write-Host "Git command path:$git_command_path"
|
|
$git_installation_folder = Split-Path -Path (Split-Path -Path $git_command_path)
|
|
$patch_path = Join-Path -Path $git_installation_folder "usr\bin\patch.exe"
|
|
}
|
|
if(Test-Path $patch_path -PathType Leaf){
|
|
Write-Host "Patching onnx ..."
|
|
Get-Content $src_root\cmake\patches\onnx\onnx.patch | &$patch_path --ignore-whitespace -p1
|
|
} else {
|
|
Write-Host "Skip patching onnx since we cannot find patch.exe at $patch_path"
|
|
}
|
|
|
|
[String]$requirements_txt_content = "protobuf==$protobuf_version`n"
|
|
foreach($line in Get-Content '.\requirements.txt') {
|
|
if($line -match "^protobuf"){
|
|
Write-Host "Replacing protobuf version to $protobuf_version"
|
|
} else{
|
|
$requirements_txt_content += "$line`n"
|
|
}
|
|
}
|
|
|
|
Set-Content -Path '.\requirements.txt' -Value $requirements_txt_content
|
|
|
|
|
|
$Env:ONNX_ML=1
|
|
if($build_config -eq 'Debug'){
|
|
$Env:DEBUG='1'
|
|
}
|
|
$Env:CMAKE_ARGS="-DONNX_USE_PROTOBUF_SHARED_LIBS=OFF -DProtobuf_USE_STATIC_LIBS=ON -DONNX_USE_LITE_PROTO=OFF"
|
|
|
|
python.exe "setup.py" "bdist_wheel"
|
|
|
|
|
|
Write-Host "Installing the newly built ONNX python package"
|
|
Get-ChildItem -Path dist/*.whl | foreach {
|
|
$p = Start-Process -NoNewWindow -Wait -PassThru -FilePath "python.exe" -ArgumentList "-m", "pip", "--disable-pip-version-check", "install", "--upgrade", $_.fullname
|
|
$exitCode = $p.ExitCode
|
|
if ($exitCode -ne 0) {
|
|
Write-Host -Object "Install wheel file failed. Exitcode: $exitCode"
|
|
exit $exitCode
|
|
}
|
|
}
|
|
Write-Host "Finished installing onnx"
|
|
popd
|
|
}
|