diff --git a/CMakePresets.json b/CMakePresets.json
index 44d8733311c9..8529893c4240 100644
--- a/CMakePresets.json
+++ b/CMakePresets.json
@@ -156,6 +156,50 @@
"BUILD_SHARED_LIBS": "NO",
"WITH_DOCS": "NO"
}
+ },
+ {
+ "name": "package-nuget",
+ "inherits": "package",
+ "hidden": true,
+ "cacheVariables": {
+ "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
+ "BUILD_SHARED_LIBS": "YES",
+ "WITH_DOCS": "NO",
+ "DCMAKE_INSTALL_DATADIR": "share/Halide",
+ "Halide_INSTALL_CMAKEDIR": "share/Halide"
+ }
+ },
+ {
+ "name": "package-nuget-win-x86",
+ "inherits": "package-nuget",
+ "binaryDir": "win-x86",
+ "displayName": "Package Halide for Nuget (win-x86)",
+ "description": "Package Halide for Nuget (win-x86)",
+ "generator": "Visual Studio 16 2019",
+ "architecture": "Win32",
+ "toolset": "host=x64",
+ "cacheVariables": {
+ "CPACK_NUGET_PACKAGE_NAME": "Halide.runtime.win-x86",
+ "CMAKE_INSTALL_BINDIR": "runtime/win-x86/native",
+ "CMAKE_INSTALL_LIBDIR": "runtime/win-x86/native",
+ "CMAKE_INSTALL_INCLUDEDIR": "build/native/include"
+ }
+ },
+ {
+ "name": "package-nuget-win-x64",
+ "inherits": "package-nuget",
+ "binaryDir": "win-x64",
+ "displayName": "Package Halide for Nuget (win-x64)",
+ "description": "Package Halide for Nuget (win-x64)",
+ "generator": "Visual Studio 16 2019",
+ "architecture": "x64",
+ "toolset": "host=x64",
+ "cacheVariables": {
+ "CPACK_NUGET_PACKAGE_NAME": "Halide.runtime.win-x64",
+ "CMAKE_INSTALL_BINDIR": "runtime/win-x64/native",
+ "CMAKE_INSTALL_LIBDIR": "runtime/win-x64/native",
+ "CMAKE_INSTALL_INCLUDEDIR": "build/native/include"
+ }
}
]
}
diff --git a/packaging/nuget/Halide.runtime.win-x64/config.cmake b/packaging/nuget/Halide.runtime.win-x64/config.cmake
new file mode 100644
index 000000000000..3bed0e29128c
--- /dev/null
+++ b/packaging/nuget/Halide.runtime.win-x64/config.cmake
@@ -0,0 +1,4 @@
+include(win-x64/CPackConfig.cmake)
+include("${CMAKE_CURRENT_LIST_DIR}/../common/config.cmake")
+
+set(CPACK_NUGET_PACKAGE_NAME Halide.runtime.win-x64)
diff --git a/packaging/nuget/Halide.runtime.win-x86/config.cmake b/packaging/nuget/Halide.runtime.win-x86/config.cmake
new file mode 100644
index 000000000000..951ce27380ae
--- /dev/null
+++ b/packaging/nuget/Halide.runtime.win-x86/config.cmake
@@ -0,0 +1,4 @@
+include(win-x86/CPackConfig.cmake)
+include("${CMAKE_CURRENT_LIST_DIR}/../common/config.cmake")
+
+set(CPACK_NUGET_PACKAGE_NAME Halide.runtime.win-x86)
diff --git a/packaging/nuget/Halide/Halide.nuspec b/packaging/nuget/Halide/Halide.nuspec
new file mode 100644
index 000000000000..dcff565238fa
--- /dev/null
+++ b/packaging/nuget/Halide/Halide.nuspec
@@ -0,0 +1,18 @@
+
+
+
+ Halide
+ @CPACK_PACKAGE_VERSION@
+ @CPACK_NUGET_PACKAGE_AUTHORS@
+ @CPACK_NUGET_PACKAGE_OWNERS@
+ true
+ @CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION@
+ @CPACK_PACKAGE_HOMEPAGE_URL@
+ @CPACK_PACKAGE_DESCRIPTION_SUMMARY@
+ @CPACK_NUGET_PACKAGE_COPYRIGHT@
+
+
+
+
+
+
diff --git a/packaging/nuget/Halide/build.cmake b/packaging/nuget/Halide/build.cmake
new file mode 100644
index 000000000000..5dee9fecd683
--- /dev/null
+++ b/packaging/nuget/Halide/build.cmake
@@ -0,0 +1,10 @@
+include(${Halide_USE_PACKAGE}/CPackConfig.cmake)
+include("${CMAKE_CURRENT_LIST_DIR}/../common/config.cmake")
+
+configure_file(${CMAKE_CURRENT_LIST_DIR}/Halide.nuspec
+ ${CMAKE_CURRENT_BINARY_DIR}/base/Halide.nuspec)
+configure_file(${CMAKE_CURRENT_LIST_DIR}/runtime.json
+ ${CMAKE_CURRENT_BINARY_DIR}/base/runtime.json)
+
+find_program(NUGET_EXE nuget REQUIRED)
+execute_process(COMMAND ${NUGET_EXE} pack ${CMAKE_CURRENT_BINARY_DIR}/base)
diff --git a/packaging/nuget/Halide/runtime.json b/packaging/nuget/Halide/runtime.json
new file mode 100644
index 000000000000..26885c855ba4
--- /dev/null
+++ b/packaging/nuget/Halide/runtime.json
@@ -0,0 +1,14 @@
+{
+ "runtimes": {
+ "win-x64": {
+ "Halide": {
+ "Halide.runtime.win-x64": "@CPACK_PACKAGE_VERSION@"
+ }
+ },
+ "win-x86": {
+ "Halide": {
+ "Halide.runtime.win-x86": "@CPACK_PACKAGE_VERSION@"
+ }
+ }
+ }
+}
diff --git a/packaging/nuget/common/config.cmake b/packaging/nuget/common/config.cmake
new file mode 100644
index 000000000000..daea3544bfd8
--- /dev/null
+++ b/packaging/nuget/common/config.cmake
@@ -0,0 +1,15 @@
+set(CPACK_NUGET_COMPONENT_INSTALL OFF)
+set(CPACK_NUGET_PACKAGE_AUTHORS "Andrew Adams, Jonathan Ragan-Kelley, Steven Johnson, Tzu-Mao Li, alexreinking, Volodymyr Kysenko, Benoit Steiner, Dillon Sharlet, Shoaib Kamil, Zalman Stern")
+set(CPACK_NUGET_PACKAGE_TITLE "Halide Compiler and Libraries")
+set(CPACK_NUGET_PACKAGE_OWNERS alexreinking)
+set(CPACK_NUGET_PACKAGE_COPYRIGHT "Copyright (c) 2012-2020 MIT CSAIL, Google, Facebook, Adobe, NVIDIA CORPORATION, and other contributors.")
+set(CPACK_NUGET_PACKAGE_TAGS "Halide C++ CUDA OpenCL GPU Performance DSL native")
+set(CPACK_NUGET_PACKAGE_DEPENDENCIES "")
+set(CPACK_NUGET_PACKAGE_DEBUG OFF)
+set(CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION MIT)
+
+# CMake 3.20 correctly uses SPDX license variables and drops
+# support for the deprecated license URL option in Nuget.
+if (CMAKE_VERSION VERSION_LESS 3.20)
+ set(CPACK_NUGET_PACKAGE_LICENSEURL "https://github.com/halide/Halide/blob/master/LICENSE.txt")
+endif ()
diff --git a/packaging/nuget/package.bat b/packaging/nuget/package.bat
new file mode 100644
index 000000000000..f38c68457469
--- /dev/null
+++ b/packaging/nuget/package.bat
@@ -0,0 +1,68 @@
+@echo off
+setlocal
+
+set halide_source=%cd%\%~1
+set halide_build_root=%cd%\%~2
+set halide_arch=%~3
+set script_dir=%~dp0
+
+if not exist "%VCPKG_ROOT%\.vcpkg-root" (
+ echo Must define VCPKG_ROOT to be the root of the VCPKG install
+ goto error
+)
+
+if not exist "%LLVM_DIR%\LLVMConfig.cmake" (
+ echo Must set specific LLVM_DIR for packaging
+ goto error
+)
+
+if not exist "%Clang_DIR%\ClangConfig.cmake" (
+ echo Must set specific Clang_DIR for packaging
+ goto error
+)
+
+if "%halide_source%" == "" (
+ echo Usage: %~0 "" "" [win-x86,win-x64]
+ goto error
+)
+
+if "%halide_build_root%" == "" (
+ echo Usage: %~0 "" "" [win-x86,win-x64]
+ goto error
+)
+
+if "%halide_arch%" == "" (
+ echo Usage: %~0 "" "" [win-x86,win-x64]
+ goto error
+)
+
+REM Ninja Multi-Config in 3.18 has some sort of bug. Very disappointing.
+cmake --preset=package-nuget-%halide_arch% -S "%halide_source%" -B "%halide_build_root%\%halide_arch%"
+if ERRORLEVEL 1 goto error
+
+REM We don't distribute Debug binaries because they aren't useful
+REM cmake --build %halide_build_root% --config Debug
+cmake --build "%halide_build_root%\%halide_arch%" --config Release
+if ERRORLEVEL 1 goto error
+
+pushd "%halide_build_root%"
+
+cpack -G NuGet -C Release --config "%script_dir%Halide.runtime.%halide_arch%\config.cmake"
+if ERRORLEVEL 1 (
+ popd
+ goto error
+)
+
+REM TODO: write a second script for this? It should always be safe to clobber.
+cmake -DHalide_USE_PACKAGE=%halide_arch% -P "%script_dir%Halide\build.cmake"
+if ERRORLEVEL 1 (
+ popd
+ goto error
+)
+
+popd
+
+exit /b
+
+:error
+exit /b 1