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