mirror of
https://github.com/Z3Prover/z3
synced 2026-07-18 04:55:45 +00:00
The Windows ARM64 nightly build (`mk_win_dist_cmake.py --arm64-only`)
was failing because the cmake-built `Microsoft.Z3` NuGet package was
produced without any native Windows DLL, causing the downstream dotnet
example build to fail.
## Root causes
- **Wrong DLL path in `Microsoft.Z3.csproj.in`**: Path included
`/$(_DN_CMAKE_CONFIG)/` (e.g., `.../RelWithDebInfo/libz3.dll`), but
`CMakeLists.txt` sets `CMAKE_RUNTIME_OUTPUT_DIRECTORY =
PROJECT_BINARY_DIR` with no config subdir. With Ninja single-config, the
DLL lands at `build-dir/libz3.dll`. The `Exists()` guard silently
excluded the DLL from the package.
- **Wrong runtime identifier**: ARM64 DLL was being packed under
`runtimes\win-x64\native` instead of `runtimes\win-arm64\native`.
- **Legacy copy fires for `net8.0`**: `Microsoft.Z3.targets` excluded
`netstandard`/`netcoreapp` but not modern TFMs like `net8.0`, so
`CopyToOutputDirectory` fired and failed trying to copy the absent
`win-x64` DLL.
## Changes
- **`src/api/dotnet/CMakeLists.txt`**: Introduce `Z3_DOTNET_WIN_RID`
cmake variable (`win-x64` / `win-x86` / `win-arm64`) derived from
`TARGET_ARCHITECTURE`; used at `configure_file` time.
- **`src/api/dotnet/Microsoft.Z3.csproj.in`**: Remove
`/$(_DN_CMAKE_CONFIG)` from the Windows DLL path; replace hardcoded
`runtimes\win-x64\native` with `runtimes\${Z3_DOTNET_WIN_RID}\native`.
- **`src/api/dotnet/Microsoft.Z3.targets`**: Add
`!$(TargetFramework.Contains('.'))` to the legacy-copy condition, which
correctly excludes `net5.0`/`net6.0`/`net7.0`/`net8.0` (all use dotted
TFMs) while keeping `net45`/`net472` etc.
- **`src/api/dotnet/Microsoft.Z3.props`**: Add explicit `arm64`
condition mapping `$(Platform) == 'arm64'` to
`runtimes\win-arm64\native\libz3.dll` for legacy .NET Framework ARM64
consumers.
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
198 lines
5.9 KiB
CMake
198 lines
5.9 KiB
CMake
find_package(Dotnet REQUIRED)
|
|
|
|
# Configure AssemblyInfo.cs
|
|
set(VER_MAJOR "${Z3_VERSION_MAJOR}")
|
|
set(VER_MINOR "${Z3_VERSION_MINOR}")
|
|
set(VER_BUILD "${Z3_VERSION_PATCH}")
|
|
set(VER_TWEAK "${Z3_VERSION_TWEAK}")
|
|
|
|
# Generate Native.cs
|
|
set(Z3_DOTNET_NATIVE_FILE "${CMAKE_CURRENT_BINARY_DIR}/Native.cs")
|
|
add_custom_command(OUTPUT "${Z3_DOTNET_NATIVE_FILE}"
|
|
COMMAND "${Python3_EXECUTABLE}"
|
|
"${PROJECT_SOURCE_DIR}/scripts/update_api.py"
|
|
${Z3_FULL_PATH_API_HEADER_FILES_TO_SCAN}
|
|
"--dotnet-output-dir"
|
|
"${CMAKE_CURRENT_BINARY_DIR}"
|
|
DEPENDS
|
|
${Z3_FULL_PATH_API_HEADER_FILES_TO_SCAN}
|
|
"${PROJECT_SOURCE_DIR}/scripts/update_api.py"
|
|
${Z3_GENERATED_FILE_EXTRA_DEPENDENCIES}
|
|
COMMENT "Generating ${Z3_DOTNET_NATIVE_FILE}"
|
|
USES_TERMINAL
|
|
)
|
|
|
|
# Generate Enumerations.cs
|
|
set(Z3_DOTNET_CONST_FILE "${CMAKE_CURRENT_BINARY_DIR}/Enumerations.cs")
|
|
add_custom_command(OUTPUT "${Z3_DOTNET_CONST_FILE}"
|
|
COMMAND "${Python3_EXECUTABLE}"
|
|
"${PROJECT_SOURCE_DIR}/scripts/mk_consts_files.py"
|
|
${Z3_FULL_PATH_API_HEADER_FILES_TO_SCAN}
|
|
"--dotnet-output-dir"
|
|
"${CMAKE_CURRENT_BINARY_DIR}"
|
|
DEPENDS
|
|
${Z3_FULL_PATH_API_HEADER_FILES_TO_SCAN}
|
|
"${PROJECT_SOURCE_DIR}/scripts/mk_consts_files.py"
|
|
${Z3_GENERATED_FILE_EXTRA_DEPENDENCIES}
|
|
COMMENT "Generating ${Z3_DOTNET_CONST_FILE}"
|
|
USES_TERMINAL
|
|
)
|
|
|
|
set(Z3_DOTNET_ASSEMBLY_SOURCES_IN_SRC_TREE
|
|
AlgebraicNum.cs
|
|
ApplyResult.cs
|
|
ArithExpr.cs
|
|
ArithSort.cs
|
|
ArrayExpr.cs
|
|
ArraySort.cs
|
|
AST.cs
|
|
ASTMap.cs
|
|
ASTVector.cs
|
|
BitVecExpr.cs
|
|
BitVecNum.cs
|
|
BitVecSort.cs
|
|
BoolExpr.cs
|
|
BoolSort.cs
|
|
CharSort.cs
|
|
Constructor.cs
|
|
ConstructorList.cs
|
|
Context.cs
|
|
DatatypeExpr.cs
|
|
DatatypeSort.cs
|
|
EnumSort.cs
|
|
Expr.cs
|
|
FiniteDomainExpr.cs
|
|
FiniteDomainNum.cs
|
|
FiniteDomainSort.cs
|
|
FiniteSetSort.cs
|
|
Fixedpoint.cs
|
|
FPExpr.cs
|
|
FPNum.cs
|
|
FPRMExpr.cs
|
|
FPRMNum.cs
|
|
FPRMSort.cs
|
|
FPSort.cs
|
|
FuncDecl.cs
|
|
FuncInterp.cs
|
|
Global.cs
|
|
Goal.cs
|
|
IntExpr.cs
|
|
IntNum.cs
|
|
IntSort.cs
|
|
IntSymbol.cs
|
|
Lambda.cs
|
|
ListSort.cs
|
|
Log.cs
|
|
Model.cs
|
|
NativeContext.cs
|
|
NativeFuncInterp.cs
|
|
NativeModel.cs
|
|
NativeSolver.cs
|
|
OnClause.cs
|
|
Optimize.cs
|
|
ParamDescrs.cs
|
|
Params.cs
|
|
Pattern.cs
|
|
Probe.cs
|
|
Quantifier.cs
|
|
RatNum.cs
|
|
RealExpr.cs
|
|
RealSort.cs
|
|
ReExpr.cs
|
|
RelationSort.cs
|
|
ReSort.cs
|
|
SeqExpr.cs
|
|
SeqSort.cs
|
|
SetSort.cs
|
|
Simplifiers.cs
|
|
Solver.cs
|
|
Sort.cs
|
|
Statistics.cs
|
|
Status.cs
|
|
StringSymbol.cs
|
|
Symbol.cs
|
|
Tactic.cs
|
|
TupleSort.cs
|
|
UninterpretedSort.cs
|
|
UserPropagator.cs
|
|
Version.cs
|
|
Z3Exception.cs
|
|
Z3Object.cs
|
|
)
|
|
|
|
set(Z3_DOTNET_ASSEMBLY_SOURCES "")
|
|
# Make paths to source files absolute
|
|
foreach (csfile ${Z3_DOTNET_ASSEMBLY_SOURCES_IN_SRC_TREE})
|
|
list(APPEND Z3_DOTNET_ASSEMBLY_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/${csfile}")
|
|
endforeach()
|
|
|
|
# Add generated files
|
|
list(APPEND Z3_DOTNET_ASSEMBLY_SOURCES
|
|
"${Z3_DOTNET_CONST_FILE}"
|
|
"${Z3_DOTNET_NATIVE_FILE}"
|
|
)
|
|
|
|
|
|
# Generate <Compile Include="files.cs" /> items
|
|
set(Z3_DOTNET_COMPILE_ITEMS "")
|
|
foreach(csfile ${Z3_DOTNET_ASSEMBLY_SOURCES})
|
|
set(Z3_DOTNET_COMPILE_ITEMS "${Z3_DOTNET_COMPILE_ITEMS}\n <Compile Include=\"${csfile}\" />")
|
|
endforeach()
|
|
|
|
|
|
# FindDotnet.cmake forwards CMake build type to MSBuild.
|
|
# And thus we can put the conditional properties in the project file.
|
|
# Note, nuget package file names do not have the ${VER_REV} part.
|
|
|
|
set(Z3_DOTNET_NUPKG_VERSION "${VER_MAJOR}.${VER_MINOR}.${VER_BUILD}")
|
|
if(TARGET_ARCHITECTURE STREQUAL "i686")
|
|
set(Z3_DOTNET_PLATFORM "x86")
|
|
set(Z3_DOTNET_WIN_RID "win-x86")
|
|
elseif(TARGET_ARCHITECTURE STREQUAL "arm64")
|
|
set(Z3_DOTNET_PLATFORM "AnyCPU")
|
|
set(Z3_DOTNET_WIN_RID "win-arm64")
|
|
else()
|
|
set(Z3_DOTNET_PLATFORM "AnyCPU")
|
|
set(Z3_DOTNET_WIN_RID "win-x64")
|
|
endif()
|
|
|
|
# TODO conditional for signing. we can then enable the ``Release_delaysign`` configuration
|
|
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Microsoft.Z3.csproj.in ${CMAKE_CURRENT_BINARY_DIR}/build/Microsoft.Z3.csproj)
|
|
ADD_DOTNET(${CMAKE_CURRENT_BINARY_DIR}/build/Microsoft.Z3.csproj
|
|
VERSION ${Z3_DOTNET_NUPKG_VERSION}
|
|
PLATFORM ${Z3_DOTNET_PLATFORM}
|
|
SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Microsoft.Z3.csproj.in
|
|
${CMAKE_CURRENT_SOURCE_DIR}/Microsoft.Z3.props
|
|
${CMAKE_CURRENT_SOURCE_DIR}/Microsoft.Z3.targets
|
|
${Z3_DOTNET_ASSEMBLY_SOURCES}
|
|
PACKAGE Microsoft.Z3
|
|
PACK_ARGUMENTS "/p:_DN_CMAKE_CONFIG=$<CONFIG>"
|
|
)
|
|
add_dependencies(BUILD_Microsoft.Z3 libz3)
|
|
|
|
# Convenient top-level target
|
|
add_custom_target(build_z3_dotnet_bindings ALL DEPENDS BUILD_Microsoft.Z3)
|
|
|
|
# Register the local nupkg repo
|
|
set(Z3_DOTNET_LOCALREPO_NAME "Microsoft Z3 Local Repository")
|
|
DOTNET_REGISTER_LOCAL_REPOSITORY(${Z3_DOTNET_LOCALREPO_NAME} ${PROJECT_BINARY_DIR})
|
|
|
|
###############################################################################
|
|
# Install: register a local nuget repo and install our package.
|
|
# the build step depends on the 'purge' target, making sure that
|
|
# a user will always restore the freshly-built package.
|
|
###############################################################################
|
|
option(Z3_INSTALL_DOTNET_BINDINGS "Install .NET bindings when invoking install target" ON)
|
|
|
|
if(Z3_INSTALL_DOTNET_BINDINGS)
|
|
install(FILES "${PROJECT_BINARY_DIR}/Microsoft.Z3/Microsoft.Z3.${Z3_DOTNET_NUPKG_VERSION}.nupkg" DESTINATION "${CMAKE_INSTALL_LIBDIR}/z3.nuget")
|
|
# move the local repo to the installation directory (cancel the build-time repo)
|
|
install(CODE "include(${CMAKE_CURRENT_LIST_DIR}/../../../cmake/modules/FindDotnet.cmake)\n DOTNET_REGISTER_LOCAL_REPOSITORY(\"${Z3_DOTNET_LOCALREPO_NAME}\" \"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/z3.nuget\")")
|
|
install(FILES "${PROJECT_BINARY_DIR}/Microsoft.Z3/Microsoft.Z3.xml" DESTINATION "${CMAKE_INSTALL_LIBDIR}/z3.nuget")
|
|
# TODO GAC?
|
|
# set(GAC_PKG_NAME "Microsoft.Z3.Sharp")
|
|
# set(PREFIX "${CMAKE_INSTALL_PREFIX}")
|
|
# set(VERSION "${Z3_VERSION}")
|
|
endif()
|
|
|