1 Star 0 Fork 3.6K

naziraa / mindquantum

forked from MindSpore / mindquantum 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
build.ps1 15.77 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
# Copyright 2021 Huawei Technologies Co., Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
Param(
[Alias("B")][ValidateNotNullOrEmpty()][string]$Build,
[switch]$BuildIsolation,
[switch]$CCache,
[switch]$CMakeNoRegistry,
[switch]$Clean3rdParty,
[switch]$CleanAll,
[switch]$CleanBuildDir,
[switch]$CleanCache,
[switch]$CleanVenv,
[ValidateNotNullOrEmpty()][string]$Config,
[ValidateNotNullOrEmpty()][string]$CudaArch,
[switch]$Cxx,
[switch]$Debug,
[switch]$DebugCMake,
[switch]$Delocate,
[Alias("N")][switch]$DryRun,
[switch]$FastBuild,
[ValidateNotNullOrEmpty()][string]$FastBuildDir,
[ValidateNotNullOrEmpty()][string]$G,
[switch]$Gitee,
[switch]$Gpu,
[Alias("H")][switch]$Help,
[Alias("J")][ValidateRange("Positive")][int]$Jobs,
[switch]$LocalPkgs,
[switch]$Logging,
[switch]$Ninja,
[switch]$NoConfig,
[switch]$NoBuildIsolation,
[switch]$NoDelocate,
[switch]$NoFastBuild,
[switch]$NoGitee,
[switch]$OnlyPytest,
[Alias("O")][ValidateNotNullOrEmpty()][string]$Output,
[ValidateNotNullOrEmpty()][string]$PlatName,
[switch]$Quiet,
[switch]$ShowLibraries,
[switch]$Test,
[switch]$UpdateVenv,
[Alias("V")][switch]$Verbose,
[ValidateNotNullOrEmpty()][string]$Venv
)
$BASEPATH = Split-Path $MyInvocation.MyCommand.Path -Parent
$ROOTDIR = $BASEPATH
$PROGRAM = Split-Path $MyInvocation.MyCommand.Path -Leaf
# Test for MindSpore CI
$_IS_MINDSPORE_CI = $false
if ("$Env:JENKINS_URL" -Match 'https?://build.mindspore.cn' -And [bool]$Env:CI) {
Write-Output "Detected MindSpore/MindQuantum CI"
$_IS_MINDSPORE_CI = $true
}
# ==============================================================================
. (Join-Path $ROOTDIR 'scripts\build\common_functions.ps1')
# ------------------------------------------------------------------------------
# Default values
$python_extra_pkgs = @('wheel-filename>1.2')
if ($_IS_MINDSPORE_CI ) {
Set-Value 'cmake_debug_mode' $true
Set-Value 'do_clean_3rdparty' $true
Set-Value 'enable_gitee' $true
Set-Value 'enable_gpu' $true
Set-Value 'enable_projectq' $true
}
# ------------------------------------------------------------------------------
function Help-Header {
Write-Output 'Build binary Python wheel for MindQunantum'
Write-Output ''
Write-Output 'This is mainly relevant for developers that want to deploy MindQuantum '
Write-Output 'on machines other than their own.'
Write-Output ''
Write-Output 'This script will create a Python virtualenv in the MindQuantum root'
Write-Output 'directory and then build a binary Python wheel of MindQuantum.'
}
function Extra-Help {
Write-Output 'Extra options:'
Write-Output ' -(No)BuildIsolation Pass --no-isolation to python3 -m build'
Write-Output ' -(No)Delocate Delocate the binary wheels after build is finished'
Write-Output ' (enabled by default; pass -NoDelocate to disable)'
Write-Output ' -(No)FastBuild If possible use an existing CMake directory to build the C++ Python extensions'
Write-Output ' instead of using the normal Python bdist_wheel process.'
Write-Output ' Use this with caution. CI build should not be using this.'
Write-Output ' -FastBuildDir Specify build directory when performing a fast-build'
Write-Output ' -O,-Output [dir] Output directory for built wheels'
Write-Output ' -P,-PlatName [dir] Platform name to use for wheel delocation'
Write-Output ' (only effective if -Delocate is used)'
Write-Output ''
Write-Output 'Example calls:'
Write-Output "$PROGRAM"
Write-Output "$PROGRAM -Gpu"
Write-Output "$PROGRAM -Cxx -WithBoost -Without-gmp -Venv D:\venv"
}
# ------------------------------------------------------------------------------
. (Join-Path $ROOTDIR 'scripts\build\parse_common_args.ps1') @args
if ($LastExitCode -ne 0) {
exit $LastExitCode
}
# ------------------------------------------------------------------------------
if (([bool]$Delocate)) {
Set-Value 'delocate_wheel'
}
if (([bool]$NoDelocate)) {
Set-Value 'delocate_wheel' $false
}
if (([bool]$BuildIsolation)) {
Set-Value 'build_isolation'
}
if (([bool]$NoBuildIsolation)) {
Set-Value 'build_isolation' $false
}
if (([bool]$FastBuild)) {
Set-Value 'fast_build'
}
if (([bool]$NoFastBuild)) {
Set-Value 'fast_build' $false
}
if ([bool]$FastBuildDir) {
Set-Value 'fast_build_dir' "$FastBuildDir"
}
if ([bool]$Output) {
Set-Value 'output_path' "$Output"
}
if ([bool]$PlatName) {
Set-Value 'platform_name' "$PlatName"
}
# ==============================================================================
# Locate python or python3
. (Join-Path $ROOTDIR 'scripts\build\locate_python3.ps1')
if ($LastExitCode -ne 0) {
exit $LastExitCode
}
# ==============================================================================
$ErrorActionPreference = 'Stop'
Write-Output "Called with: $($MyInvocation.Line)"
cd "$ROOTDIR"
# ------------------------------------------------------------------------------
# NB: `created_venv` variable can be used to detect if a virtualenv was created or not
. (Join-Path $ROOTDIR 'scripts\build\python_virtualenv_activate.ps1')
if ($LastExitCode -ne 0) {
exit $LastExitCode
}
# ------------------------------------------------------------------------------
# Locate cmake or cmake3
# NB: `cmake_from_venv` variable is set by this script (and is used by python_virtualenv_update.sh)
. (Join-Path $ROOTDIR 'scripts\build\locate_cmake.ps1')
if ($LastExitCode -ne 0) {
exit $LastExitCode
}
# ------------------------------------------------------------------------------
# Update Python virtualenv (if requested/necessary)
. (Join-Path $ROOTDIR 'scripts\build\python_virtualenv_update.ps1')
if ($LastExitCode -ne 0) {
exit $LastExitCode
}
# ------------------------------------------------------------------------------
# Setup arguments for build
if ($_build_dir_was_set -eq $null) { $_build_dir_was_set = $false }
$build_args = @()
$cmake_option_names = @{
cmake_debug_mode = 'ENABLE_CMAKE_DEBUG'
do_clean_3rdparty = 'CLEAN_3RDPARTY_INSTALL_DIR'
enable_cxx = 'ENABLE_CXX_EXPERIMENTAL'
enable_gitee = 'ENABLE_GITEE'
enable_gpu = 'ENABLE_CUDA'
enable_logging = 'ENABLE_LOGGING'
enable_projectq = 'ENABLE_PROJECTQ'
enable_tests = 'BUILD_TESTING'
logging_enable_debug = 'ENABLE_LOGGING_DEBUG_LEVEL'
logging_enable_trace = 'ENABLE_LOGGING_TRACE_LEVEL'
}
foreach ($el in $cmake_option_names.GetEnumerator()) {
$value = Invoke-Expression -Command ("`${0}" -f $el.Name)
if ($value) {
$build_args += '--set', "$($el.Value)"
}
else {
$build_args += '--unset', "$($el.Value)"
}
}
if ($_IS_MINDSPORE_CI ) {
$build_args += '--set', 'MINDSPORE_CI'
}
if ($cmake_make_silent) {
$build_args += '--unset', 'USE_VERBOSE_MAKEFILE'
}
else {
$build_args += '--set', 'USE_VERBOSE_MAKEFILE'
}
if ($cmake_no_registry) {
$build_args += '--unset', 'CMAKE_FIND_USE_PACKAGE_REGISTRY'
$build_args += '--unset', 'CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY'
}
else {
$build_args += '--set', 'CMAKE_FIND_USE_PACKAGE_REGISTRY'
$build_args += '--set', 'CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY'
}
if ([bool]$cmake_generator) {
$build_args += '-G', "$cmake_generator"
}
if ($fast_build) {
$build_args += 'bdist_wheel', '--fast-build'
if ([bool]$fast_build_dir) {
$build_args += 'bdist_wheel', '--fast-build-dir', "$fast_build_dir"
}
}
if ($n_jobs -ne -1) {
$build_args += '--var', 'JOBS', '$n_jobs'
$build_args += 'build_ext', "--jobs=$n_jobs"
}
if ($build_type -eq 'Debug') {
$build_args += 'build', '--debug'
}
if ($_build_dir_was_set) {
$build_args += 'build_ext', '--build-dir', "$build_dir"
}
if ($force_local_pkgs) {
$build_args += '--var', 'MQ_FORCE_LOCAL_PKGS', 'all'
}
elseif ([bool]"$local_pkgs") {
$build_args += '--var', 'MQ_FORCE_LOCAL_PKGS', "`"$local_pkgs`""
}
# --------------------------------------
if ($enable_gpu -And [bool]$cuda_arch) {
Write-Error -Category NotImplemented -Message "-CudaArch is unsupported (thus ignored) with $PROGRAM!"
}
if ($enable_ccache) {
$ccache_exec=''
if(Test-CommandExists ccache) {
$ccache_exec = 'ccache'
}
elseif(Test-CommandExists sccache) {
$ccache_exec = 'sccache'
}
if ([bool]$ccache_exec) {
$ccache_exec = (Get-Command "$ccache_exec").Source
$build_args += '--var', 'CMAKE_C_COMPILER_LAUNCHER', "$ccache_exec"
$build_args += '--var', 'CMAKE_CXX_COMPILER_LAUNCHER', "$ccache_exec"
if([bool]$enable_gpu) {
$build_args += '--var', 'CMAKE_CUDA_COMPILER_LAUNCHER', "$ccache_exec"
}
}
}
# NB: CMake < 3.24 typically set CC, CXX during the first run, which basically overwrites the values in CC, CXX. In
# order to work around that, we explicitly set the compilers using the related CMake variables.
if([bool]$Env:CC) {
$build_args += '--var', 'CMAKE_C_COMPILER', "$Env:CC"
}
if([bool]$Env:CXX) {
$build_args += '--var', 'CMAKE_CXX_COMPILER', "$Env:CXX"
}
if([bool]$Env:CUDACXX) {
$build_args += '--var', 'CMAKE_CUDA_COMPILER', "$Env:CUDACXX"
}
Write-Debug 'Will be passing these arguments to setup.py:'
Write-Debug " $build_args"
# Convert the CMake arguments for passing them using -C to python3 -m build
$fixed_args = @()
foreach($arg in $build_args) {
$fixed_args += "-C--global-option=$arg"
}
$build_args = @('-w')
if (-Not $build_isolation) {
$build_args += "--no-isolation"
}
# ------------------------------------------------------------------------------
# Build the wheels
if ($_build_dir_was_set) {
if ($do_clean_build_dir) {
Write-Output "Deleting build folder: $build_dir"
Call-Cmd Remove-Item -Force -Recurse "'$build_dir'" -ErrorAction SilentlyContinue
}
elseif ($do_clean_cache) {
Write-Output "Removing CMake cache at: $build_dir/CMakeCache.txt"
Call-Cmd Remove-Item -Force "'$build_dir/CMakeCache.txt'" -ErrorAction SilentlyContinue
Write-Output "Removing CMake files at: $build_dir/CMakeFiles"
Call-Cmd Remove-Item -Force -Recurse "'$build_dir/CMakeFiles'" -ErrorAction SilentlyContinue
Write-Output "Removing CMake files at: $build_dir/CMakeFiles"
Call-Cmd Remove-Item -Force -Recurse "'$build_dir/CMakeFiles'" -ErrorAction SilentlyContinue
Write-Output "Removing CMake files at: $build_dir/cmake-ldtest*"
Call-Cmd Remove-Item -Force -Recurse "'$build_dir/cmake-ldtest*'" -ErrorAction SilentlyContinue
}
}
if ($delocate_wheel) {
$Env:MQ_DELOCATE_WHEEL = 1
if ([bool]$platform_name) {
$Env:MQ_DELOCATE_WHEEL_PLAT = "$platform_name"
}
}
else {
$Env:MQ_DELOCATE_WHEEL = 0
}
Call-Cmd "$PYTHON" -m build @build_args @fixed_args @unparsed_args
if ($LastExitCode -ne 0) {
exit $LastExitCode
}
# ------------------------------------------------------------------------------
if (Test-Path -Path "$output_path") {
Call-Cmd Remove-Item -Force -Recurse "'$output_path'" -ErrorAction SilentlyContinue
}
Call-Cmd New-Item -Path "'$output_path'" -ItemType "directory"
Call-Cmd Move-Item -Path "'$ROOTDIR\*'" -Destination "$output_path"
Call-Cmd Write-Output "------Successfully created mindquantum package------"
# ==============================================================================
<#
.SYNOPSIS
Performs monthly data updates.
.DESCRIPTION
Build MindQunantum locally (in-source build)
This is mainly relevant for developers that do not want to always have to reinstall the Python package
This script will create a Python virtualenv in the MindQuantum root directory and then build all the C++ Python
modules and place the generated libraries in their right locations within the MindQuantum folder hierarchy so Python
knows how to find them.
A pth-file will be created in the virtualenv site-packages directory so that the MindQuantum root folder will be added
to the Python PATH without the need to modify PYTHONPATH.
.PARAMETER Build
Specify build directory. Defaults to: Path\To\Script\build
.PARAMETER BuildIsolation
Do not pass --no-isolation to python3 -m build
.PARAMETER CCache
If ccache or sccache are found within the PATH, use them with CMake
.PARAMETER CMakeNoRegistry
Disable the use of CMake package registries during configuration
.PARAMETER Clean3rdParty
Clean 3rd party installation directory
.PARAMETER CleanAll
Clean everything before building.
Equivalent to -CleanVenv -CleanBuildDir
.PARAMETER CleanBuildDir
Delete build directory before building
.PARAMETER CleanCache
Re-run CMake with a clean CMake cache
.PARAMETER CleanVenv
Delete Python virtualenv before building
.PARAMETER CMakeNoRegistry
Do not use the CMake registry to find packages
.PARAMETER Config
Path to INI configuration file with default values for the parameters
.PARAMETER Cxx
(experimental) Enable MindQuantum C++ support
.PARAMETER Debug
Build in debug mode
.PARAMETER DebugCMake
Enable debugging mode for CMake configuration step
.PARAMETER DryRun
Dry run; only print commands but do not execute them
.PARAMETER Delocate
Delocate the binary wheels after build is finished (enabled by default; pass -NoDelocate to disable)
.PARAMETER FastBuild
If possible use an existing CMake directory to build the C++ Python extensions instead of using the normal Python
bdist_wheel process.Use this with caution.
CI build should not be using this.
.PARAMETER FastBuildDir
Specify build directory when performing a fast-build
.PARAMETER Gitee
Use Gitee (where possible) instead of Github/Gitlab
.PARAMETER Gpu
Enable GPU support
.PARAMETER Help
Show help message.
.PARAMETER Jobs
Number of parallel jobs for building
.PARAMETER LocalPkgs
Compile third-party dependencies locally
.PARAMETER Logging
Enable logging in C++ code
.PARAMETER Ninja
Build using Ninja instead of make
.PARAMETER NoBuildIsolation
Pass --no-isolation to python3 -m build
.PARAMETER NoConfig
Ignore any configuration file
.PARAMETER NoDelocate
Do not delocate the binary wheels after build is finished (pass -Delocate to enable)
.PARAMETER NoFastBuild
Do not use a "fast" build process when building a wheel. See doc for -FastBuild.
.PARAMETER NoGitee
Do not favor Gitee over Github/Gitlab
.PARAMETER OnlyPytest
Only install pytest and its dependencies when creating/building the virtualenv
.PARAMETER Output
Output directory for built wheels
.PARAMETER PlatName
Platform name to use for wheel delocation (only effective if -Delocate is used)
.PARAMETER Quiet
Disable verbose build rules
.PARAMETER ShowLibraries
Show all known third-party libraries.
.PARAMETER Test
Build C++ tests and install dependencies for Python testing as well
.PARAMETER Verbose
Enable verbose output from the Bash scripts
.PARAMETER Venv
Path to Python virtual environment. Defaults to: Path\To\Script\venv
.PARAMETER UpdateVenv
Update the python virtual environment
.PARAMETER CudaArch
Comma-separated list of architectures to generate device code for.
Only useful if -Gpu is passed. See CMAKE_CUDA_ARCHITECTURES for more information.
.PARAMETER G
CMake argument: Specify a build system generator.
.INPUTS
None.
.OUTPUTS
None.
.EXAMPLE
PS> .\build.ps1
.EXAMPLE
PS> .\build.ps1 -gpu
.EXAMPLE
PS> .\build.ps1 -Cxx -WithBoost -WithoutEigen3
.EXAMPLE
PS> .\build.ps1 -Gpu -DCMAKE_CUDA_COMPILER=D:\cuda\bin\nvcc
#>
Python
1
https://gitee.com/naziraa/mindquantum.git
git@gitee.com:naziraa/mindquantum.git
naziraa
mindquantum
mindquantum
master

搜索帮助