Skip to content

Commit cf08d43

Browse files
authored
Migrate to zlib-ng, part 2: consume it in runtime (second attempt) (#104454)
* Reapply "Migrate to zlib-ng, part 2: consume it in runtime (#102403)" (#104414) * Apply jkotas comment suggestion in configureplatform.cmake * Delete unnecessary comment in zlib-ng.cmake * Fix windows nativeaot failure happening when executing: build.cmd -ci -arch x64 -os windows -s clr.nativeaotlibs+clr.nativeaotruntime+libs+packs -c Release /p:BuildNativeAOTRuntimePack=true /p:SkipLibrariesNativeRuntimePackages=true
1 parent 21cde69 commit cf08d43

33 files changed

+269
-183
lines changed

Directory.Build.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@
324324
<NoTargetFrameworkFiltering>true</NoTargetFrameworkFiltering>
325325

326326
<NativeBuildPartitionPropertiesToRemove>ClrFullNativeBuild;ClrRuntimeSubset;ClrJitSubset;ClrPalTestsSubset;ClrAllJitsSubset;ClrILToolsSubset;ClrNativeAotSubset;ClrSpmiSubset;ClrCrossComponentsSubset;ClrDebugSubset;HostArchitecture;PgoInstrument;NativeOptimizationDataSupported;CMakeArgs;CxxStandardLibrary;CxxStandardLibraryStatic;CxxAbiLibrary</NativeBuildPartitionPropertiesToRemove>
327+
<UseSystemZlib Condition="'$(TargetsAppleMobile)' == 'true' or '$(TargetOS)' == 'android' or '$(TargetArchitecture)' == 'armv6'">true</UseSystemZlib>
327328
</PropertyGroup>
328329

329330
<!-- RepositoryEngineeringDir isn't set when Installer tests import this file. -->

eng/native/configurecompiler.cmake

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
1212
set(CMAKE_CXX_STANDARD 11)
1313
set(CMAKE_CXX_STANDARD_REQUIRED ON)
1414

15+
# We need to set this to Release as there's no way to intercept configuration-specific linker flags
16+
# for try_compile-style tests (like check_c_source_compiles) and some of the default Debug flags
17+
# (ie. /INCREMENTAL) conflict with our own flags.
18+
set(CMAKE_TRY_COMPILE_CONFIGURATION Release)
19+
1520
include(CheckCCompilerFlag)
1621
include(CheckCXXCompilerFlag)
1722
include(CheckLinkerFlag)
@@ -58,6 +63,7 @@ if (MSVC)
5863
define_property(TARGET PROPERTY CLR_CONTROL_FLOW_GUARD INHERITED BRIEF_DOCS "Controls the /guard:cf flag presence" FULL_DOCS "Set this property to ON or OFF to indicate if the /guard:cf compiler and linker flag should be present")
5964
define_property(TARGET PROPERTY CLR_EH_CONTINUATION INHERITED BRIEF_DOCS "Controls the /guard:ehcont flag presence" FULL_DOCS "Set this property to ON or OFF to indicate if the /guard:ehcont compiler flag should be present")
6065
define_property(TARGET PROPERTY CLR_EH_OPTION INHERITED BRIEF_DOCS "Defines the value of the /EH option" FULL_DOCS "Set this property to one of the valid /EHxx options (/EHa, /EHsc, /EHa-, ...)")
66+
define_property(TARGET PROPERTY MSVC_WARNING_LEVEL INHERITED BRIEF_DOCS "Define the warning level for the /Wn option" FULL_DOCS "Set this property to one of the valid /Wn options (/W0, /W1, /W2, /W3, /W4)")
6167

6268
set_property(GLOBAL PROPERTY CLR_CONTROL_FLOW_GUARD ON)
6369

@@ -779,7 +785,8 @@ if (MSVC)
779785

780786
# [[! Microsoft.Security.SystemsADM.10086 !]] - SDL required warnings
781787
# set default warning level to 4 but allow targets to override it.
782-
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/W$<GENEX_EVAL:$<IF:$<BOOL:$<TARGET_PROPERTY:MSVC_WARNING_LEVEL>>,$<TARGET_PROPERTY:MSVC_WARNING_LEVEL>,4>>>)
788+
set_property(GLOBAL PROPERTY MSVC_WARNING_LEVEL 4)
789+
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/W$<TARGET_PROPERTY:MSVC_WARNING_LEVEL>>)
783790
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/WX>) # treat warnings as errors
784791
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/Oi>) # enable intrinsics
785792
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/Oy->) # disable suppressing of the creation of frame pointers on the call stack for quicker function calls

eng/native/configureplatform.cmake

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,3 +500,10 @@ if(LOWERCASE_CMAKE_BUILD_TYPE STREQUAL debug)
500500
string(REPLACE "-D_FORTIFY_SOURCE=2 " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
501501
string(REPLACE "-D_FORTIFY_SOURCE=2 " "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
502502
endif()
503+
504+
if (CLR_CMAKE_TARGET_ANDROID OR CLR_CMAKE_TARGET_MACCATALYST OR CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS OR CLR_CMAKE_HOST_ARCH_ARMV6)
505+
# Some platforms are opted-out from using the in-tree zlib-ng by default:
506+
# - Android and iOS-like platforms: concerns about extra binary size
507+
# - Armv6: zlib-ng has build breaks
508+
set(CLR_CMAKE_USE_SYSTEM_ZLIB 1)
509+
endif()

eng/native/functions.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ function(preprocess_file inputFilename outputFilename)
221221
get_compile_definitions(PREPROCESS_DEFINITIONS)
222222
get_include_directories(PREPROCESS_INCLUDE_DIRECTORIES)
223223
get_source_file_property(SOURCE_FILE_DEFINITIONS ${inputFilename} COMPILE_DEFINITIONS)
224-
224+
225225
foreach(DEFINITION IN LISTS SOURCE_FILE_DEFINITIONS)
226226
list(APPEND PREPROCESS_DEFINITIONS -D${DEFINITION})
227227
endforeach()
@@ -508,7 +508,7 @@ function(install_static_library targetName destination component)
508508
if (WIN32)
509509
set_target_properties(${targetName} PROPERTIES
510510
COMPILE_PDB_NAME "${targetName}"
511-
COMPILE_PDB_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}"
511+
COMPILE_PDB_OUTPUT_DIRECTORY "$<TARGET_FILE_DIR:${targetName}>"
512512
)
513513
install (FILES "$<TARGET_FILE_DIR:${targetName}>/${targetName}.pdb" DESTINATION ${destination} COMPONENT ${component})
514514
endif()

src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ The .NET Foundation licenses this file to you under the MIT license.
2424
<LinkerFlavor Condition="'$(LinkerFlavor)' == '' and '$(_linuxLibcFlavor)' == 'bionic'">lld</LinkerFlavor>
2525
<LinkerFlavor Condition="'$(LinkerFlavor)' == '' and '$(_targetOS)' == 'linux'">bfd</LinkerFlavor>
2626
<IlcDefaultStackSize Condition="'$(IlcDefaultStackSize)' == '' and '$(_linuxLibcFlavor)' == 'musl'">1572864</IlcDefaultStackSize>
27+
<UseSystemZlib Condition="!Exists('$(IlcSdkPath)libz.a')">true</UseSystemZlib>
2728
</PropertyGroup>
2829

2930
<Target Name="SetupOSSpecificProps" DependsOnTargets="$(IlcDynamicBuildPropertyDependencies)">
@@ -129,6 +130,7 @@ The .NET Foundation licenses this file to you under the MIT license.
129130
<NativeLibrary Condition="'$(_targetArchitecture)' == 'x64'" Include="$(IlcSdkPath)$(VxSortSupportName)$(LibFileExt)" />
130131
<NativeLibrary Include="$(IlcSdkPath)$(StandaloneGCSupportName)$(LibFileExt)" />
131132
<NativeLibrary Condition="'$(LinkStandardCPlusPlusLibrary)' != 'true' and '$(StaticICULinking)' != 'true'" Include="$(IlcSdkPath)libstdc++compat.a" />
133+
<NativeLibrary Condition="'$(UseSystemZlib)' != 'true'" Include="$(IlcSdkPath)libz.a" />
132134
</ItemGroup>
133135

134136
<ItemGroup>
@@ -188,7 +190,7 @@ The .NET Foundation licenses this file to you under the MIT license.
188190
<NativeSystemLibrary Include="objc" Condition="'$(_IsApplePlatform)' == 'true'" />
189191
<NativeSystemLibrary Include="swiftCore" Condition="'$(_targetOS)' == 'osx'" />
190192
<NativeSystemLibrary Include="swiftFoundation" Condition="'$(_targetOS)' == 'osx'" />
191-
<NativeSystemLibrary Include="z" />
193+
<NativeSystemLibrary Include="z" Condition="'$(UseSystemZlib)' == 'true'" />
192194
<NativeSystemLibrary Include="rt" Condition="'$(_IsApplePlatform)' != 'true' and '$(_linuxLibcFlavor)' != 'bionic'" />
193195
<NativeSystemLibrary Include="log" Condition="'$(_linuxLibcFlavor)' == 'bionic'" />
194196
<NativeSystemLibrary Include="icucore" Condition="'$(_IsApplePlatform)' == 'true'" />

src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Windows.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ The .NET Foundation licenses this file to you under the MIT license.
4646
<NativeLibrary Condition="'$(_targetArchitecture)' == 'x64'" Include="$(IlcSdkPath)$(VxSortSupportName)$(LibrarySuffix)" />
4747
<NativeLibrary Condition="'$(IlcMultiModule)' == 'true'" Include="$(SharedLibrary)" />
4848
<NativeLibrary Include="$(IlcSdkPath)$(StandaloneGCSupportName)$(LibrarySuffix)" />
49+
<NativeLibrary Include="$(IlcSdkPath)zlibstatic$(LibFileExt)" />
4950
</ItemGroup>
5051

5152
<ItemGroup>

src/installer/pkg/sfx/Microsoft.NETCore.App/Directory.Build.props

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,9 @@
277277
<PlatformManifestFileEntry Include="libicudata.a" IsNative="true" />
278278
<PlatformManifestFileEntry Include="libicui18n.a" IsNative="true" />
279279
<PlatformManifestFileEntry Include="libicuuc.a" IsNative="true" />
280+
<!-- zlib-specific files -->
281+
<PlatformManifestFileEntry Include="libz.a" IsNative="true" />
282+
<PlatformManifestFileEntry Include="zlibstatic.lib" IsNative="true" />
280283
</ItemGroup>
281284

282285
<ItemGroup>

src/mono/CMakeLists.txt

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,6 @@ elseif(CLR_CMAKE_HOST_OS STREQUAL "emscripten")
249249
set(DISABLE_SHARED_LIBS 1)
250250
# sys/random.h exists, but its not found
251251
set(HAVE_SYS_RANDOM_H 1)
252-
set(INTERNAL_ZLIB 1)
253252
elseif(CLR_CMAKE_HOST_OS STREQUAL "wasi")
254253
set(HOST_WASI 1)
255254
add_definitions(-D_WASI_EMULATED_PROCESS_CLOCKS -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_MMAN -DHOST_WASI)
@@ -261,7 +260,6 @@ elseif(CLR_CMAKE_HOST_OS STREQUAL "wasi")
261260
add_compile_options(-Wno-unused-but-set-variable)
262261
set(ENABLE_PERFTRACING 0)
263262
set(DISABLE_SHARED_LIBS 1)
264-
set(INTERNAL_ZLIB 1)
265263
set(DISABLE_EXECUTABLES 1)
266264
set(STATIC_COMPONENTS 1)
267265
elseif(CLR_CMAKE_HOST_OS STREQUAL "windows")
@@ -270,7 +268,6 @@ elseif(CLR_CMAKE_HOST_OS STREQUAL "windows")
270268
set(HOST_NO_SYMLINKS 1)
271269
set(MONO_KEYWORD_THREAD "__declspec (thread)")
272270
set(MONO_ZERO_LEN_ARRAY 1)
273-
set(INTERNAL_ZLIB 1)
274271
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") # statically link VC runtime library
275272
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/W4>) # set warning level 4
276273
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/WX>) # treat warnings as errors
@@ -511,16 +508,15 @@ if ((HOST_MACCAT AND HOST_ARM64) OR (TARGET_MACCAT AND TARGET_ARM64))
511508
set(TARGET_APPLE_MOBILE 1)
512509
endif()
513510

514-
# Decide if we need zlib, and if so whether we want the system zlib or the in-tree copy.
511+
# Decide if we need zlib-ng.
515512
if(NOT DISABLE_EMBEDDED_PDB OR NOT DISABLE_LOG_PROFILER_GZ)
516-
if(INTERNAL_ZLIB)
517-
# defines ZLIB_SOURCES
518-
include(${CLR_SRC_NATIVE_DIR}/external/zlib.cmake)
519-
else()
520-
# if we're not on a platform where we use the in-tree zlib, require system zlib
513+
if (CLR_CMAKE_USE_SYSTEM_ZLIB)
514+
# if we're not on a platform where we use the in-tree zlib-ng, require system zlib
521515
include(${CLR_SRC_NATIVE_DIR}/libs/System.IO.Compression.Native/extra_libs.cmake)
522516
set(Z_LIBS)
523517
append_extra_compression_libs(Z_LIBS)
518+
else()
519+
include(${CLR_SRC_NATIVE_DIR}/external/zlib-ng.cmake)
524520
endif()
525521
endif()
526522

@@ -664,12 +660,17 @@ if(LLVM_PREFIX)
664660
endif()
665661
set(llvm_includedir "${LLVM_PREFIX}/include")
666662

663+
set(llvm_system_libs "")
667664
if(HOST_LINUX)
668665
# llvm-config --system-libs
669-
set(llvm_system_libs ${MONO_cxx_lib} "-lz" "-lrt" "-ldl" "-lpthread" "-lm")
666+
list(APPEND llvm_system_libs ${MONO_cxx_lib} "-lrt" "-ldl" "-lpthread" "-lm")
670667
elseif(HOST_OSX)
671668
# llvm-config --system-libs
672-
set(llvm_system_libs "-lz" "-lm")
669+
list(APPEND llvm_system_libs "-lm")
670+
endif()
671+
672+
if (CLR_CMAKE_USE_SYSTEM_ZLIB AND (HOST_LINUX OR HOST_OSX))
673+
list(APPEND llvm_system_libs "-lz")
673674
endif()
674675

675676
# llvm-config --libs analysis core bitwriter mcjit orcjit

src/mono/browser/browser.proj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
<WasmPInvokeModule Include="libSystem.Native" />
6464
<WasmPInvokeModule Include="libSystem.IO.Compression.Native" />
6565
<WasmPInvokeModule Include="libSystem.Globalization.Native" />
66+
<WasmPInvokeModule Include="libz" />
6667
<WasmPInvokeAssembly Include="@(LibrariesRuntimeFiles)" Condition="'%(Extension)' == '.dll' and '%(IsNative)' != 'true'" />
6768
</ItemGroup>
6869

src/mono/browser/runtime/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ target_link_libraries(dotnet.native
2828
${MONO_ARTIFACTS_DIR}/libmono-wasm-${CONFIGURATION_INTERPSIMDTABLES_LIB}.a
2929
${MONO_ARTIFACTS_DIR}/libmono-profiler-aot.a
3030
${MONO_ARTIFACTS_DIR}/libmono-profiler-browser.a
31+
${MONO_ARTIFACTS_DIR}/libz.a
3132
${NATIVE_BIN_DIR}/wasm-bundled-timezones.a
3233
${NATIVE_BIN_DIR}/libSystem.Native.a
3334
${NATIVE_BIN_DIR}/libSystem.Globalization.Native.a

src/mono/cmake/config.h.in

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,6 @@
168168
/* Define to 1 if you have the <unwind.h> header file. */
169169
#cmakedefine HAVE_UNWIND_H 1
170170

171-
/* Use in-tree zlib */
172-
#cmakedefine INTERNAL_ZLIB 1
173-
174171
/* Define to 1 if you have the <poll.h> header file. */
175172
#cmakedefine HAVE_POLL_H 1
176173

src/mono/mono.proj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,6 +1189,9 @@ JS_ENGINES = [NODE_JS]
11891189
<_MonoRuntimeArtifacts Condition="('$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true') and '$(BuildMonoAOTCrossCompilerOnly)' != 'true'" Include="$(MonoObjDir)out\lib\libmono-wasm-nosimd.a">
11901190
<Destination>$(RuntimeBinDir)libmono-wasm-nosimd.a</Destination>
11911191
</_MonoRuntimeArtifacts>
1192+
<_MonoRuntimeArtifacts Condition="('$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true') and '$(BuildMonoAOTCrossCompilerOnly)' != 'true'" Include="$(MonoObjDir)_deps\fetchzlibng-build\libz.a">
1193+
<Destination>$(RuntimeBinDir)libz.a</Destination>
1194+
</_MonoRuntimeArtifacts>
11921195
<_MonoICorDebugArtifacts Condition="'$(MonoMsCorDbi)' == 'true'" Include="$(MonoObjDir)out\lib\$(LibPrefix)mscordbi$(LibSuffix)">
11931196
<Destination>$(RuntimeBinDir)$(LibPrefix)mscordbi$(LibSuffix)</Destination>
11941197
</_MonoICorDebugArtifacts>

src/mono/mono/eventpipe/test/CMakeLists.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,16 @@ if(ENABLE_PERFTRACING)
3939
set(CMAKE_SKIP_RPATH 1)
4040
add_executable(ep-test ${EVENTPIPE_TEST_SOURCES} ${EVENTPIPE_TEST_HEADERS})
4141
target_sources(ep-test PRIVATE "${mono-components-objects}")
42-
target_link_libraries(ep-test PRIVATE eglib_api monosgen-static ${OS_LIBS} ${LLVM_LIBS} ${Z_LIBS} monoapi)
42+
43+
set(EPTEST_LINKABLE_LIBS "")
44+
list(APPEND EPTEST_LINKABLE_LIBS eglib_api monosgen-static ${OS_LIBS} ${LLVM_LIBS} monoapi)
45+
if (CLR_CMAKE_USE_SYSTEM_ZLIB)
46+
list(APPEND EPTEST_LINKABLE_LIBS ${EPTEST_LINKABLE_LIBS} ${Z_LIBS})
47+
else()
48+
list(APPEND EPTEST_LINKABLE_LIBS ${EPTEST_LINKABLE_LIBS} zlib)
49+
endif()
50+
target_link_libraries(ep-test PRIVATE ${EPTEST_LINKABLE_LIBS})
51+
4352
install_with_stripped_symbols(ep-test TARGETS bin)
4453
else(ENABLE_EVENTPIPE_TEST AND STATIC_COMPONENTS AND (NOT DISABLE_COMPONENTS) AND (NOT DISABLE_LIBS) AND (NOT DISABLE_EXECUTABLES))
4554
message(VERBOSE "Skip building native EventPipe library test runner.")

src/mono/mono/metadata/CMakeLists.txt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,14 @@ set(metadata_sources "${metadata_platform_sources};${metadata_common_sources};${
200200
if(HOST_WIN32 AND NOT DISABLE_SHARED_LIBS)
201201
add_library(metadata_objects_shared OBJECT ${metadata_sources})
202202
target_compile_definitions(metadata_objects_shared PRIVATE ${metadata_compile_definitions})
203-
target_link_libraries(metadata_objects_shared PRIVATE monoapi eglib_api utils_objects_shared)
203+
204+
set(METADATAOBJECTSSHARED_LINKABLE_LIBS "")
205+
list(APPEND METADATAOBJECTSSHARED_LINKABLE_LIBS monoapi eglib_api utils_objects_shared)
206+
if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
207+
list(APPEND METADATAOBJECTSSHARED_LINKABLE_LIBS zlib)
208+
endif()
209+
target_link_libraries(metadata_objects_shared PRIVATE ${METADATAOBJECTSSHARED_LINKABLE_LIBS})
210+
204211
# note: metadata_objects is an object library, so this doesn't force linking with sgen,
205212
# it just adds the relevant include directories - which we need even with Boehm
206213
target_link_libraries(metadata_objects_shared PRIVATE sgen_objects_shared)
@@ -212,7 +219,14 @@ endif()
212219

213220
add_library(metadata_objects OBJECT ${metadata_sources})
214221
target_compile_definitions(metadata_objects PRIVATE ${metadata_compile_definitions})
215-
target_link_libraries(metadata_objects PRIVATE monoapi eglib_api utils_objects)
222+
223+
set(METADATAOBJECTS_LINKABLE_LIBS "")
224+
list(APPEND METADATAOBJECTS_LINKABLE_LIBS monoapi eglib_api utils_objects)
225+
if (NOT CLR_CMAKE_USE_SYSTEM_ZLIB)
226+
list(APPEND METADATAOBJECTS_LINKABLE_LIBS zlib)
227+
endif()
228+
target_link_libraries(metadata_objects PRIVATE ${METADATAOBJECTS_LINKABLE_LIBS})
229+
216230
# note: metadata_objects is an object library, so this doesn't force linking with sgen,
217231
# it just adds the relevant include directories - which we need even with Boehm
218232
target_link_libraries(metadata_objects PRIVATE sgen_objects)

src/mono/mono/metadata/debug-mono-ppdb.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,8 @@
3030
#include <mono/utils/mono-logger-internals.h>
3131

3232
#ifndef DISABLE_EMBEDDED_PDB
33-
#ifdef INTERNAL_ZLIB
34-
#include <external/zlib/zlib.h>
35-
#else
3633
#include <zlib.h>
37-
#endif
38-
#endif
34+
#endif // DISABLE_EMBEDDED_PDB
3935

4036
#include "debug-mono-ppdb.h"
4137

0 commit comments

Comments
 (0)