# MNNPyBridge # |-- include # |-- wrapper # |-- test (Release + Dynamic + MD) # |-- x64 # |-- x86 # |-- lib # |-- x64 # | |-- (Debug/Release x Dynamic/Static x MD/MT) # | # |-- x86 # |-- (Debug/Release x Dynamic/Static x MD/MT) Param( [Parameter(Mandatory=$true)][String]$version, [Parameter(Mandatory=$true)][String]$pyc_env, [Parameter(Mandatory=$true)][String]$mnn_path, [Parameter(Mandatory=$true)][String]$python_path, [Parameter(Mandatory=$false)][String]$numpy_path, [Parameter(Mandatory=$true)][String]$path, [Switch]$train_api, [Switch]$x86 ) # build it according to cmake_cmd, exit 1 when any error occur function Build([String]$cmake_cmd, [String]$ninja_cmd = "ninja") { Invoke-Expression $cmake_cmd # build process may failed because of lnk1181, but be success when run again $try_times = 2 if ($LastExitCode -eq 0) { For ($cnt = 0; $cnt -lt $try_times; $cnt++) { try { Invoke-Expression $ninja_cmd if ($LastExitCode -eq 0) { return } } catch {} } } popd exit 1 } $erroractionpreference = "stop" mkdir -p $path -ErrorAction Ignore $PACKAGE_PATH = $(Resolve-Path $path).Path $arch = $(If($x86) {"x86"} Else {"x64"}) $PACKAGE_LIB_PATH = "$PACKAGE_PATH/lib/$arch" $TEST_TOOL_PATH = "$PACKAGE_PATH/test/$arch" #clear and create package directory pushd $PACKAGE_PATH Remove-Item -Path include, wrapper -Recurse -ErrorAction Ignore mkdir -p include, wrapper popd Remove-Item -Path $PACKAGE_LIB_PATH, $TEST_TOOL_PATH -Recurse -ErrorAction Ignore mkdir -p $PACKAGE_LIB_PATH, $TEST_TOOL_PATH pushd $PACKAGE_LIB_PATH mkdir -p Debug\Dynamic\MD, Debug\Dynamic\MT, Debug\Static\MD, Debug\Static\MT, Release\Dynamic\MD, Release\Dynamic\MT, Release\Static\MD, Release\Static\MT popd # assume $PACKAGE_PATH exist cp pymnn\src\MNNPyBridge.h $PACKAGE_PATH\include Remove-Item pymnn_pyc_tmp -Recurse -ErrorAction Ignore mkdir pymnn_pyc_tmp cp -r pymnn\pip_package\MNN pymnn_pyc_tmp pushd pymnn_pyc_tmp Remove-Item MNN -Include __pycache__ -Recurse pushd MNN function Remove([String]$module) { rm -r -force $module (Get-Content __init__.py).replace("from . import $module", "") | Set-Content __init__.py } Remove "tools" if (!$train_api) { Remove "data" Remove "optim" } popd popd $mnn_path = $(Resolve-Path $mnn_path).Path $python_path = $(Resolve-Path $python_path).Path $CMAKE_ARGS = "-DPYMNN_USE_ALINNPYTHON=ON -DPYMNN_RUNTIME_CHECK_VM=ON -DPYMNN_EXPR_API=ON -DPYMNN_BUILD_TEST=OFF -DPYMNN_IMGCODECS=ON -DPYMNN_IMGPROC_DRAW=ON -DPYMNN_IMGPROC_STRUCTURAL=ON -DPYMNN_IMGPROC_MISCELLANEOUS=ON -DPYMNN_IMGPROC_COLOR=ON -DPYMNN_IMGPROC_GEOMETRIC=ON -DPYMNN_IMGPROC_FILTER=ON" if ($train_api) { $CMAKE_ARGS = "$CMAKE_ARGS -DPYMNN_TRAIN_API=ON" } if ($numpy_path) { $CMAKE_ARGS = "$CMAKE_ARGS -DPYMNN_NUMPY_USABLE=ON -Dnumpy_path=$numpy_path" } $CMAKE_ARGS = "$CMAKE_ARGS -Dmnn_path=$mnn_path -Dpython_path=$python_path" Remove-Item pymnn_build -Recurse -ErrorAction Ignore mkdir pymnn_build pushd pymnn_build function exist([String]$build_type, [String]$lib_type, [String]$crt_type) { function _exist([String]$lib) { $lib_dir = "$lib/lib/$arch/$build_type/$lib_type/$crt_type" return $((Test-Path -Path $lib_dir) -and ((Get-ChildItem -Path "$lib_dir/*" -Include "*.lib").Count -ne 0)) } return $((_exist $mnn_path) -and (_exist $python_path)) } function log([String]$msg) { echo "================================" echo "Build MNNPyBridge $msg" echo "================================" } ##### Debug/Dynamic/MT #### if (exist Debug Dynamic MT) { log "Debug/Dynamic/MT" Remove-Item CMakeCache.txt -ErrorAction Ignore Build "cmake -G Ninja $CMAKE_ARGS -DCMAKE_BUILD_TYPE=Debug -DMNN_WIN_RUNTIME_MT=ON ../pymnn" cp mnnpybridge.lib,mnnpybridge.dll,mnnpybridge.pdb $PACKAGE_LIB_PATH\Debug\MT rm mnnpybridge.* } ##### Debug/Dynamic/MD #### if (exist Debug Dynamic MD) { log "Debug/Dynamic/MD" Remove-Item CMakeCache.txt -ErrorAction Ignore Build "cmake -G Ninja $CMAKE_ARGS -DCMAKE_BUILD_TYPE=Debug ../pymnn" cp mnnpybridge.lib,mnnpybridge.dll,mnnpybridge.pdb $PACKAGE_LIB_PATH\Debug\MD rm mnnpybridge.* } ##### Debug/Static/MT #### if (exist Debug Static MT) { log "Debug/Static/MT" Remove-Item CMakeCache.txt -ErrorAction Ignore Build "cmake -G Ninja $CMAKE_ARGS -DCMAKE_BUILD_TYPE=Debug -DMNN_WIN_RUNTIME_MT=ON -DMNN_BUILD_SHARED_LIBS=OFF ../pymnn" cp mnnpybridge.lib $PACKAGE_LIB_PATH\Debug\Static\MT rm mnnpybridge.* } ##### Debug/Static/MD #### if (exist Debug Static MD) { log "Debug/Static/MD" Remove-Item CMakeCache.txt -ErrorAction Ignore Build "cmake -G Ninja $CMAKE_ARGS -DCMAKE_BUILD_TYPE=Debug -DMNN_BUILD_SHARED_LIBS=OFF ../pymnn" cp mnnpybridge.lib $PACKAGE_LIB_PATH\Debug\Static\MD rm mnnpybridge.* } ##### Release/Dynamic/MT #### if (exist Release Dynamic MT) { log "Release + MT" Remove-Item CMakeCache.txt -ErrorAction Ignore Build "cmake -G Ninja $CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release -DMNN_WIN_RUNTIME_MT=ON ../pymnn" cp mnnpybridge.lib,mnnpybridge.dll,mnnpybridge.pdb $PACKAGE_LIB_PATH\Release\Dynamic\MT rm mnnpybridge.* } ##### Release/Dynamic/MD #### if (exist Release Dynamic MD) { log "Release + MD" Remove-Item CMakeCache.txt -ErrorAction Ignore Build "cmake -G Ninja $CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release ../pymnn" cp mnnpybridge.lib,mnnpybridge.dll,mnnpybridge.pdb $PACKAGE_LIB_PATH\Release\Dynamic\MD #cp mnnpybridge_test.exe $TEST_TOOL_PATH #cp $mnn_path/lib/$arch/Release/MD/MNN.dll $TEST_TOOL_PATH #cp $python_path/lib/$arch/Release/MD/python.dll $TEST_TOOL_PATH #cp $numpy_path/lib/$arch/Release/MD/numpy_python.dll $TEST_TOOL_PATH rm mnnpybridge.* } ##### Release/Static/MT #### if (exist Release Static MT) { log "Release/Static/MT" Remove-Item CMakeCache.txt -ErrorAction Ignore Build "cmake -G Ninja $CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release -DMNN_WIN_RUNTIME_MT=ON -DMNN_BUILD_SHARED_LIBS=OFF ../pymnn" cp mnnpybridge.lib $PACKAGE_LIB_PATH\Release\Static\MT rm mnnpybridge.* } ##### Release/Static/MD #### if (exist Release Static MD) { log "Release/Static/MD" Remove-Item CMakeCache.txt -ErrorAction Ignore Build "cmake -G Ninja $CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release -DMNN_BUILD_SHARED_LIBS=OFF ../pymnn" cp mnnpybridge.lib $PACKAGE_LIB_PATH\Release\Static\MD rm mnnpybridge.* } popd