Skip to content

Define TARGET_LINUX for Android native builds and preserve Android-specific exclusions#128826

Merged
jkotas merged 6 commits into
mainfrom
copilot/fix-targets-linux-definition
Jun 2, 2026
Merged

Define TARGET_LINUX for Android native builds and preserve Android-specific exclusions#128826
jkotas merged 6 commits into
mainfrom
copilot/fix-targets-linux-definition

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Jun 1, 2026

Android was treated as Linux in managed constants (TargetsLinux) but not consistently in native C/C++ compile-time defines. This change aligns the native side by defining TARGET_LINUX on Android and simplifying call sites that previously special-cased TARGET_ANDROID, while preserving Android-specific exclusions where Linux-only native behavior does not apply.

  • Build-definition alignment

    • eng/native/configurecompiler.cmake: Android now emits both TARGET_ANDROID and TARGET_LINUX.
    • src/mono/CMakeLists.txt: Android target setup now sets TARGET_LINUX (alongside existing Android/Bionic defines).
  • Conditional cleanup

    • Replaced defined(TARGET_LINUX) || defined(TARGET_ANDROID) with defined(TARGET_LINUX) where behavior is shared.
    • Updated corresponding negated conditions/comments to match the new invariant.
    • Applied across affected native/runtime files (System.Native, CoreCLR minipal/pal/gc, NativeAOT PAL, and related headers).
  • Android-specific corrections

    • Restored an explicit !defined(TARGET_ANDROID) exclusion in src/native/corehost/corehost.cpp for static createdump initialization.
    • Excluded Android from CoreCLR GC's Linux NUMA syscall paths in src/coreclr/gc/unix/numasupport.cpp and related call sites in src/coreclr/gc/unix/gcenv.unix.cpp.
    • These exclusions preserve existing Android behavior and avoid widening Linux-only paths through the new TARGET_LINUX define.
// Shared behavior
// Before
#if defined(TARGET_LINUX) || defined(TARGET_ANDROID)

// After
#if defined(TARGET_LINUX)
// Android-specific static host path remains excluded
#if defined(FEATURE_STATIC_HOST) && (defined(TARGET_OSX) || (defined(TARGET_LINUX) && !defined(TARGET_ANDROID))) && !defined(TARGET_X86)
// Android remains excluded from Linux-only NUMA syscall paths
#if defined(TARGET_LINUX) && !defined(TARGET_ANDROID)

Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 1, 2026 01:46
Copilot AI review requested due to automatic review settings June 1, 2026 01:46
Comment thread eng/native/configurecompiler.cmake Outdated
@jkotas
Copy link
Copy Markdown
Member

jkotas commented Jun 1, 2026

@copilot Are there any TARGET_LINUX uses that need to be modified to exclude TARGET_ANDROID with this change?

@github-actions github-actions Bot added the area-PAL-coreclr only for closed issues label Jun 1, 2026
Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
Copilot AI requested review from Copilot and jkotas and removed request for Copilot June 1, 2026 01:53
Copilot finished work on behalf of jkotas June 1, 2026 01:54
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Jun 1, 2026

@copilot Are there any TARGET_LINUX uses that need to be modified to exclude TARGET_ANDROID with this change?

I audited the affected native files for this PR and did not find any TARGET_LINUX sites that need an added !TARGET_ANDROID exclusion. The places changed were all previously TARGET_LINUX || TARGET_ANDROID (so behavior stays aligned), and existing Android-specific differences are still explicitly guarded by TARGET_ANDROID where needed.

Copilot finished work on behalf of jkotas June 1, 2026 02:00
Comment thread eng/native/configurecompiler.cmake Outdated
Copilot AI review requested due to automatic review settings June 1, 2026 03:45
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR standardizes native build-time OS macros so Android also defines TARGET_LINUX, and then simplifies a set of native #if guards that previously treated Linux and Android as separate-but-equivalent cases.

Changes:

  • Define TARGET_LINUX for Android native builds (CoreCLR/native CMake + Mono CMake).
  • Collapse redundant defined(TARGET_LINUX) || defined(TARGET_ANDROID) checks to defined(TARGET_LINUX) in several native components.
  • Update related #else / #endif comments and negated conditions to match the new invariant.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated no comments.

Show a summary per file
File Description
eng/native/configurecompiler.cmake Ensures Android emits TARGET_LINUX (via Linux target path) while still defining TARGET_ANDROID.
src/mono/CMakeLists.txt Sets TARGET_LINUX for Android in Mono’s CMake configuration.
src/native/libs/System.Native/pal_time.c Uses TARGET_LINUX as the single guard for the Linux/Android boot-time clock path.
src/native/libs/System.Native/pal_io.c Simplifies Linux/Android filesystem-type guarding to TARGET_LINUX.
src/coreclr/pal/src/misc/cgroup.cpp Collapses Linux/Android cgroup implementation guard to TARGET_LINUX and updates guard comments.
src/coreclr/gc/unix/cgroup.cpp Collapses Linux/Android GC cgroup implementation guard to TARGET_LINUX and updates guard comments.
src/coreclr/nativeaot/Runtime/unix/PalUnix.cpp Simplifies Linux/Android TLS-key guarding to TARGET_LINUX (with corresponding negated guard update).
src/coreclr/nativeaot/Runtime/unix/cgroupcpu.cpp Collapses Linux/Android NativeAOT cgroup CPU guard to TARGET_LINUX and updates guard comments.
src/coreclr/minipal/Unix/doublemapping.cpp Uses TARGET_LINUX as the single guard for the Linux/Android memfd_create path.
src/coreclr/inc/crosscomp.h Simplifies Linux/Android DAC mutex sizing guard to TARGET_LINUX.

@jkotas
Copy link
Copy Markdown
Member

jkotas commented Jun 1, 2026

@copilot Build break

FAILED: Corehost.Static/singlefilehost
: && /usr/local/android-sdk/ndk/27.2.12479018/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=armv7-none-linux-androideabi24 --sysroot=/usr/local/android-sdk/ndk/27.2.12479018/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-rtti -O3 -DNDEBUG -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,--build-id=sha1 -Wl,-z,relro,-z,now -Wl,--gc-sections -Wl,--gc-sections -Wl,--export-dynamic -Wl,--version-script=/w/1/s/artifacts/obj/coreclr/android.arm.Release/Corehost.Static/singlefilehost.exports -Wl,-u,DotNetRuntimeInfo -Wl,-u,g_dacTable -Wl,-u,MetaDataGetDispenser -Wl,-u,DotNetRuntimeContractDescriptor vm/eventing/eventpipe/CMakeFiles/eventpipe_gen_objs.dir/eventpipe/eventpipehelpers.cpp.o vm/eventing/eventpipe/CMakeFiles/eventpipe_gen_objs.dir/eventpipe/dotnetruntime.cpp.o vm/eventing/eventpipe/CMakeFiles/eventpipe_gen_objs.dir/eventpipe/dotnetruntimerundown.cpp.o vm/eventing/eventpipe/CMakeFiles/eventpipe_gen_objs.dir/eventpipe/dotnetruntimestress.cpp.o vm/eventing/eventpipe/CMakeFiles/eventpipe_gen_objs.dir/eventpipe/dotnetruntimeprivate.cpp.o vm/eventing/eventpipe/CMakeFiles/eventpipe_objs.dir/Unity/unity_0_cxx.cxx.o containers/CMakeFiles/dn-containers.dir/dn-allocator.c.o containers/CMakeFiles/dn-containers.dir/dn-fwd-list.c.o containers/CMakeFiles/dn-containers.dir/dn-list.c.o containers/CMakeFiles/dn-containers.dir/dn-queue.c.o containers/CMakeFiles/dn-containers.dir/dn-umap.c.o containers/CMakeFiles/dn-containers.dir/dn-vector.c.o containers/CMakeFiles/dn-containers.dir/dn-simdhash.c.o containers/CMakeFiles/dn-containers.dir/dn-simdhash-string-ptr.c.o containers/CMakeFiles/dn-containers.dir/dn-simdhash-u32-ptr.c.o containers/CMakeFiles/dn-containers.dir/dn-simdhash-ptr-ptr.c.o containers/CMakeFiles/dn-containers.dir/dn-simdhash-ght-compatible.c.o containers/CMakeFiles/dn-containers.dir/dn-simdhash-ptrpair-ptr.c.o containers/CMakeFiles/dn-containers.dir/dn-simdhash-utils.c.o inc/CMakeFiles/corguids.dir//pal/prebuilt/idl/cordebug_i.cpp.o inc/CMakeFiles/corguids.dir//pal/prebuilt/idl/xcordebug_i.cpp.o inc/CMakeFiles/corguids.dir//pal/prebuilt/idl/clrdata_i.cpp.o inc/CMakeFiles/corguids.dir//pal/prebuilt/idl/clrinternal_i.cpp.o inc/CMakeFiles/corguids.dir//pal/prebuilt/idl/xclrdata_i.cpp.o inc/CMakeFiles/corguids.dir//pal/prebuilt/idl/corprof_i.cpp.o inc/CMakeFiles/corguids.dir//pal/prebuilt/idl/corsym_i.cpp.o inc/CMakeFiles/corguids.dir//pal/prebuilt/idl/sospriv_i.cpp.o inc/CMakeFiles/corguids.dir//pal/prebuilt/idl/dacdbi_i.cpp.o gcinfo/CMakeFiles/gcinfo.dir/arraylist.cpp.o gcinfo/CMakeFiles/gcinfo.dir/gcinfoencoder.cpp.o gcinfo/CMakeFiles/gcinfo.dir/simplerhash.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/apphost/bundle_marker.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/hostfxr_resolver.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/hostpolicy_resolver.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/static/coreclr_resolver.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr_resolver.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/corehost.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr/command_line.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr/corehost_init.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr/hostfxr.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr/fx_muxer.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr/fx_resolver.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr/fx_resolver.messages.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr/framework_info.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr/host_context.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr/install_info.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr/sdk_info.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fxr/sdk_resolver.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/args.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/breadcrumbs.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/coreclr.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/deps_entry.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/deps_format.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/deps_resolver.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/hostpolicy_context.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/hostpolicy.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/hostpolicy_init.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/shared_store.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/hostpolicy/version.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/bundle/dir_utils.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/bundle/extractor.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/bundle/file_entry.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/bundle/manifest.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/bundle/runner.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/json_parser.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/host_startup_info.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/roll_forward_option.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fx_definition.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/fx_reference.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/version_compatibility_range.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/runtime_config.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/bundle/info.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/bundle/reader.cpp.o Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/bundle/header.cpp.o -o Corehost.Static/singlefilehost dlls/mscoree/coreclr/libcoreclr_static.a libs-native/System.Globalization.Native/libSystem.Globalization.Native.a libs-native/System.IO.Compression.Native/libSystem.IO.Compression.Native.a libs-native/System.Native/libSystem.Native.a libs-native/System.Security.Cryptography.Native.Android/libSystem.Security.Cryptography.Native.Android.a pal/src/libcoreclrpal_dac.a debug/dbgutil/libdbgutil.a nativeresources/libnativeresourcestring.a -lz -Xlinker --push-state -Xlinker --whole-archive debug/runtimeinfo/libruntimeinfo.a -Xlinker --pop-state Corehost.Static/hostmisc/libhostmisc.a nativeresources/libnativeresourcestring.a minipal/Unix/libcoreclrminipal.a shared_minipal/libminipal.a pal/src/eventprovider/dummyprovider/libeventprovider.a -llog _deps/zstd-build/lib/libzstd.a _deps/brotli-build/libbrotlienc.a _deps/brotli-build/libbrotlidec.a _deps/brotli-build/libbrotlicommon.a -ldl -latomic -lm && cd /__w/1/s/artifacts/obj/coreclr/android.arm.Release/Corehost.Static && sh -c "echo Stripping symbols from $(basename '/__w/1/s/artifacts/obj/coreclr/android.arm.Release/Corehost.Static/singlefilehost') into $(basename '/__w/1/s/artifacts/obj/coreclr/android.arm.Release/Corehost.Static/singlefilehost.dbg')" && /usr/local/android-sdk/ndk/27.2.12479018/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objcopy --only-keep-debug /__w/1/s/artifacts/obj/coreclr/android.arm.Release/Corehost.Static/singlefilehost /__w/1/s/artifacts/obj/coreclr/android.arm.Release/Corehost.Static/singlefilehost.dbg && /usr/local/android-sdk/ndk/27.2.12479018/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objcopy --strip-debug --strip-unneeded /__w/1/s/artifacts/obj/coreclr/android.arm.Release/Corehost.Static/singlefilehost && /usr/local/android-sdk/ndk/27.2.12479018/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objcopy --add-gnu-debuglink=/__w/1/s/artifacts/obj/coreclr/android.arm.Release/Corehost.Static/singlefilehost.dbg /__w/1/s/artifacts/obj/coreclr/android.arm.Release/Corehost.Static/singlefilehost
ld.lld: error: undefined symbol: initialize_static_createdump()

referenced by corehost.cpp:125 (/__w/1/s/src/native/corehost/corehost.cpp:125)
Corehost.Static/CMakeFiles/singlefilehost.dir/__w/1/s/src/native/corehost/corehost.cpp.o:(exe_start(int, char const**))

Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Jun 1, 2026

@copilot Build break

FAILED: Corehost.Static/singlefilehost
...

Fixed in f9e3214. corehost.cpp's static createdump initialization was unintentionally widened to Android by the new TARGET_LINUX define, so I restored the Android exclusion on that path. I also validated it with ./src/native/corehost/build.sh -os android -arch arm -c Release -ninja.

Copilot AI changed the title Define TARGET_LINUX for Android native builds and collapse redundant Linux/Android guards Define TARGET_LINUX for Android native builds, simplify shared Linux/Android guards, and preserve Android-specific static host behavior Jun 1, 2026
Copilot finished work on behalf of jkotas June 1, 2026 05:12
Copilot AI requested a review from jkotas June 1, 2026 05:12
@jkotas jkotas changed the title Define TARGET_LINUX for Android native builds, simplify shared Linux/Android guards, and preserve Android-specific static host behavior Define TARGET_LINUX for Android native builds Jun 1, 2026
@jkotas
Copy link
Copy Markdown
Member

jkotas commented Jun 1, 2026

@copilot Tests are failing on Android

                 06-01 07:15:54.842  3495  3514 D DOTNET  : Calling coreclr_initialize
[07:16:04] dbug: Executing command: '/datadisks/disk1/work/A34008FE/p/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26204.1/runtimes/any/native/adb/linux/adb -s emulator-5556 bugreport /datadisks/disk1/work/A34008FE/w/A89F0902/uploads/adb-bugreport-net.dot.System.Runtime.Tests.zip'
[07:18:13] info: Wrote ADB bugreport to /datadisks/disk1/work/A34008FE/w/A89F0902/uploads/adb-bugreport-net.dot.System.Runtime.Tests.zip
[07:18:13] info: <<XHARNESS_RESULT_START>>

Please double check that there are no other ifdefs condition that need adjusting for this change.

Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
Copilot AI requested review from Copilot and removed request for Copilot June 1, 2026 20:50
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Jun 1, 2026

@copilot Tests are failing on Android

                 06-01 07:15:54.842  3495  3514 D DOTNET  : Calling coreclr_initialize

...

Fixed in 2d0161a. Android was entering CoreCLR's Linux NUMA path after TARGET_LINUX started being defined there, and coreclr_initialize then hit seccomp-blocked get_mempolicy/mbind syscalls. I excluded Android from the NUMA-only guards in src/coreclr/gc/unix/numasupport.cpp and the related GC call sites in gcenv.unix.cpp.

Validated with:

  • ./src/coreclr/build-runtime.sh x64 -release -component runtime -ninja -numproc 4
  • ./build.sh clr.runtime -os android -arch arm64 -c Release -ninja

AI-generated comment posted by Copilot.

Copilot AI changed the title Define TARGET_LINUX for Android native builds Define TARGET_LINUX for Android native builds and preserve Android-specific exclusions Jun 1, 2026
Copilot finished work on behalf of jkotas June 1, 2026 20:51
@jkotas
Copy link
Copy Markdown
Member

jkotas commented Jun 1, 2026

TARGET_LINUX and TARGET_ANDROID

CLR_CMAKE_TARGET_LINUX is defined on Android
TARGET_LINUX is defined on Android in CoreLib
TARGET_LINUX is not defined on Android for C/C++ code <- this is inconsistency that I got confused by and that I am trying to fix

TARGET_OSX and TARGET_IOS

I do not think that this is same relationship as Linux vs. Android. In RID graph:

@jkotas jkotas marked this pull request as ready for review June 1, 2026 22:18
Copilot AI review requested due to automatic review settings June 1, 2026 22:18
@jkotas jkotas requested a review from MichalStrehovsky as a code owner June 1, 2026 22:18
@jkotas jkotas requested a review from VSadov June 1, 2026 22:18
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 13 out of 13 changed files in this pull request and generated no new comments.

@jkotas
Copy link
Copy Markdown
Member

jkotas commented Jun 1, 2026

@VSadov Noticed while reviewing #128606

@VSadov
Copy link
Copy Markdown
Member

VSadov commented Jun 2, 2026

@VSadov Noticed while reviewing #128606

I noticed as well, but was not sure if native/managed difference was intentional.

There is also something called “bionic”. It is defined for android and not used much. I suspect there is a conceptual distinction, but practically it is not very different.

@jkotas
Copy link
Copy Markdown
Member

jkotas commented Jun 2, 2026

There is also something called “bionic”

bionic is name libc used by Android. It is sibling of glibc and musl.

Android in our build system means Android apps. it implies bionic libc, crypto via Java interop, and disables use of OS features that are blocked for Android apps.

Copy link
Copy Markdown
Member

@VSadov VSadov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@jkotas
Copy link
Copy Markdown
Member

jkotas commented Jun 2, 2026

/ba-g infrastructure timeout

@jkotas jkotas merged commit 98d2d53 into main Jun 2, 2026
181 of 183 checks passed
@jkotas jkotas deleted the copilot/fix-targets-linux-definition branch June 2, 2026 05:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-PAL-coreclr only for closed issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants