Repository: microsoft/vcpkg
Pull request #44953: [iausofa] Add new port
Author: login: longzhmm
Labels: name: category:new-port
description: The issue is requesting a new library to be added; consider making a PR!
name: info:needs-maintainer-attention
description: Lets the current 'on rotation' vcpkg maintainer know they need to look at this.
Created: 2025-04-10T08:19:11Z | Merged: 2025-04-25T05:22:21Z

- [√] Changes comply with the [maintainer guide](https://github.com/microsoft/vcpkg-docs/blob/main/vcpkg/contributing/maintainer-guide.md).
- [ √] The name of the port matches an existing name for this component on https://repology.org/ if possible, and/or is strongly associated with that component on search engines.
- [ √] Optional dependencies are resolved in exactly one way. For example, if the component is built with CMake, all `find_package` calls are REQUIRED, are satisfied by `vcpkg.json`'s declared dependencies, or disabled with [CMAKE_DISABLE_FIND_PACKAGE_Xxx](https://cmake.org/cmake/help/latest/variable/CMAKE_DISABLE_FIND_PACKAGE_PackageName.html).
- [√ ] The versioning scheme in `vcpkg.json` matches what upstream says.
- [ √] The license declaration in `vcpkg.json` matches what upstream says.
- [ √] The installed as the "copyright" file matches what upstream says.
- [ √] The source code of the component installed comes from an authoritative source.
- [√ ] The generated "usage text" is accurate. See [adding-usage](https://github.com/microsoft/vcpkg-docs/blob/main/vcpkg/examples/adding-usage.md) for context.
- [ √] The version database is fixed by rerunning `./vcpkg x-add-version --all` and committing the result.
- [ √] Only one version is in the new port's versions file.
- [ √] Only one version is added to each modified port's versions file.


Diff:
diff --git a/ports/iausofa/CMakeLists.txt b/ports/iausofa/CMakeLists.txt
new file mode 100644
index 00000000000000..e0db6241545c8c
--- /dev/null
+++ b/ports/iausofa/CMakeLists.txt
@@ -0,0 +1,55 @@
+cmake_minimum_required(VERSION 3.15)
+
+# Sets the name of the <PROJECT-NAME>
+project(iausofa LANGUAGES C)
+
+include(GNUInstallDirs)
+
+# set SOURCE dir
+set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
+
+# set .c files except for test_sofa.c
+file(GLOB_RECURSE SOURCES "${SOURCE_DIR}/*.c")
+list(REMOVE_ITEM SOURCES "${SOURCE_DIR}/test_sofa.c")
+
+# set .h files
+file(GLOB_RECURSE HEADERS "${SOURCE_DIR}/*.h")
+
+# Add a library target called <name>, eg. <name>.lib
+add_library(iausofa ${SOURCES})
+
+# Sets properties on <targets>
+if(LINUX)
+        target_link_libraries(iausofa PRIVATE m)
+endif()
+
+# Specifies include directories to use when compiling a given <target>
+target_include_directories(iausofa PUBLIC
+        $<BUILD_INTERFACE:${SOURCE_DIR}> # for headers when building
+        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> # for client in install mode
+)
+
+# Install target <target> <export-name> Output Artifacts and associated files
+install(TARGETS iausofa
+        EXPORT iausofa_targets
+        ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+        LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+        RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
+
+install(FILES ${HEADERS} DESTINATION include/iausofa)
+
+# Install <export-name> for dependent projects:
+install(EXPORT iausofa_targets
+        FILE unofficial-iausofa-targets.cmake
+        NAMESPACE unofficial::iausofa::
+        DESTINATION share/unofficial-iausofa)
+
+# Generate the config file in the current binary dir (this ensures it's not placed directly in source)
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/unofficial-iausofa-config.cmake"
+        "include(CMakeFindDependencyMacro)\n"
+        "include(\"\${CMAKE_CURRENT_LIST_DIR}/unofficial-iausofa-targets.cmake\")\n"
+)
+
+# Install the generated config file
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/unofficial-iausofa-config.cmake"
+        DESTINATION share/unofficial-iausofa)
diff --git a/ports/iausofa/LICENSE b/ports/iausofa/LICENSE
new file mode 100644
index 00000000000000..671aa9c5a00fff
--- /dev/null
+++ b/ports/iausofa/LICENSE
@@ -0,0 +1,7 @@
+=====================
+SOFA License
+=====================
+
+The license content can be found at [SOFA Terms and Conditions](https://iausofa.org/tandc.html)
+or by downloading the source code from [SOFA Home Page](https://iausofa.org) and checking the end
+of any code file.
diff --git a/ports/iausofa/portfile.cmake b/ports/iausofa/portfile.cmake
new file mode 100644
index 00000000000000..681c6feb2acf0e
--- /dev/null
+++ b/ports/iausofa/portfile.cmake
@@ -0,0 +1,29 @@
+if(VCPKG_TARGET_IS_WINDOWS)
+    vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
+endif()
+
+vcpkg_download_distfile(
+    ARCHIVE
+    URLS "http://iausofa.org/2023_1011_C/sofa_c-${VERSION}.tar.gz"
+    FILENAME "sofa_c-${VERSION}.tar.gz"
+    SHA512 8e7d67f7ac7a285a96160c96d16b1921ccb7a9324b83280b1594efcbbd7eb78c4d41898c1e5acfa5081842e4aeee15a96572d21b466bfda7ef7582c58624d376
+)
+
+vcpkg_extract_source_archive(SOURCE_PATH ARCHIVE "${ARCHIVE}")
+
+set(SOURCE_SUBDIR "${SOURCE_PATH}/${VERSION}/c")
+
+file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt" DESTINATION "${SOURCE_SUBDIR}")
+
+vcpkg_cmake_configure(SOURCE_PATH "${SOURCE_SUBDIR}")
+
+vcpkg_cmake_install()
+
+vcpkg_cmake_config_fixup(PACKAGE_NAME "unofficial-iausofa")
+
+vcpkg_copy_pdbs()
+
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
+
+file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/usage" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")
+vcpkg_install_copyright(FILE_LIST "${CMAKE_CURRENT_LIST_DIR}/LICENSE")
diff --git a/ports/iausofa/usage b/ports/iausofa/usage
new file mode 100644
index 00000000000000..dc90595bf9726b
--- /dev/null
+++ b/ports/iausofa/usage
@@ -0,0 +1,4 @@
+iausofa provides CMake targets:
+
+  find_package(unofficial-iausofa CONFIG REQUIRED)
+  target_link_libraries(main PRIVATE unofficial::iausofa::iausofa)
diff --git a/ports/iausofa/vcpkg.json b/ports/iausofa/vcpkg.json
new file mode 100644
index 00000000000000..861a1a346c4e06
--- /dev/null
+++ b/ports/iausofa/vcpkg.json
@@ -0,0 +1,17 @@
+{
+  "name": "iausofa",
+  "version": "20231011",
+  "description": "This is C version of IAU sofa software.",
+  "homepage": "https://iausofa.org",
+  "license": "MIT",
+  "dependencies": [
+    {
+      "name": "vcpkg-cmake",
+      "host": true
+    },
+    {
+      "name": "vcpkg-cmake-config",
+      "host": true
+    }
+  ]
+}
diff --git a/versions/baseline.json b/versions/baseline.json
index 92da980c26fad7..510bbb2d9c89de 100644
--- a/versions/baseline.json
+++ b/versions/baseline.json
@@ -3700,6 +3700,10 @@
       "baseline": "2.32.0",
       "port-version": 0
     },
+    "iausofa": {
+      "baseline": "20231011",
+      "port-version": 0
+    },
     "icecream-cpp": {
       "baseline": "1.0.0",
       "port-version": 0
diff --git a/versions/i-/iausofa.json b/versions/i-/iausofa.json
new file mode 100644
index 00000000000000..de500e904d567f
--- /dev/null
+++ b/versions/i-/iausofa.json
@@ -0,0 +1,9 @@
+{
+  "versions": [
+    {
+      "git-tree": "371e62c22adb14ce9cc44b57e3e2e66173d8c130",
+      "version": "20231011",
+      "port-version": 0
+    }
+  ]
+}


Reviews:
user: login: LilyWangLL
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T08:26:49Z
user: login: LilyWangLL
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T02:20:53Z
user: login: dg0yt
body: The chosen repo is a not the official upstream.
Upstream doesn't offer a CMake build system.
https://iausofa.org/current_C.html 
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T04:04:09Z
user: login: longzhmm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-19T23:42:27Z
user: login: longzhmm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-19T23:45:06Z
user: login: LilyWangLL
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T06:25:16Z
user: login: BillyONeal
body: Can you explain why we are supplying a custom build script rather than using their existing makefile?

(To be clear, I am not saying we can't do this, I just think we need on record why)
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-04-22T19:53:29Z
user: login: longzhmm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T01:07:06Z
user: login: longzhmm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T01:50:07Z
user: login: BillyONeal
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-24T22:26:51Z
user: login: BillyONeal
body: Thanks for the new port!
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-25T03:53:44Z
user: login: BillyONeal
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-25T05:09:06Z
user: login: vicroms
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-25T05:22:19Z

Review comments:
diff_hunk: @@ -0,0 +1,26 @@
+vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
+
+# https://github.com/${REPO}/archive/${REF}.tar.gz
path: ports/iausofa/portfile.cmake
user: login: LilyWangLL
body: ```suggestion
```
created_at: 2025-04-14T07:59:49Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,26 @@
+vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
+
+# https://github.com/${REPO}/archive/${REF}.tar.gz
+vcpkg_from_github(
+    OUT_SOURCE_PATH SOURCE_PATH
+    REPO longzhmm/vcpkg_iausofa
+    REF 8058fedf19ae2563dc643c04fde1d5f2b1057176
+    SHA512 de13bb1786e1c4b7556e8b53ac42c2b6a466c960ee69f85714e6f33aee72cfa9804edf43595f43bb660274c88ad2cd3a88f8675705bfdfb73cd08e3d6d5a93e4  # This is a temporary value. We will modify this value in the next section.
path: ports/iausofa/portfile.cmake
user: login: LilyWangLL
body: ```suggestion
    SHA512 de13bb1786e1c4b7556e8b53ac42c2b6a466c960ee69f85714e6f33aee72cfa9804edf43595f43bb660274c88ad2cd3a88f8675705bfdfb73cd08e3d6d5a93e4
```
created_at: 2025-04-14T08:00:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,4 @@
+iausofa provides CMake targets:
+
+find_package(iausofa CONFIG REQUIRED)
+target_link_libraries(main PRIVATE iausofa::iausofa)
path: ports/iausofa/usage
user: login: LilyWangLL
body: ```suggestion
  find_package(iausofa CONFIG REQUIRED)
  target_link_libraries(main PRIVATE iausofa::iausofa)
```
created_at: 2025-04-14T08:26:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,25 @@
+vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
path: ports/iausofa/portfile.cmake
user: login: dg0yt
body: Is there a reason for this restriction?
created_at: 2025-04-15T03:59:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,25 @@
+vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
+
+vcpkg_from_github(
+    OUT_SOURCE_PATH SOURCE_PATH
+    REPO longzhmm/vcpkg_iausofa
+    REF 8058fedf19ae2563dc643c04fde1d5f2b1057176
+    SHA512 de13bb1786e1c4b7556e8b53ac42c2b6a466c960ee69f85714e6f33aee72cfa9804edf43595f43bb660274c88ad2cd3a88f8675705bfdfb73cd08e3d6d5a93e4  
+    HEAD_REF main
+)
+
+
+vcpkg_cmake_configure(
+    SOURCE_PATH "${SOURCE_PATH}"
+)
+
+vcpkg_cmake_install()
+
+vcpkg_cmake_config_fixup(PACKAGE_NAME "iausofa")
+
+vcpkg_copy_pdbs()
+
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
+
+file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)
+configure_file("${CMAKE_CURRENT_LIST_DIR}/usage" "${CURRENT_PACKAGES_DIR}/share/${PORT}/usage" COPYONLY)
path: ports/iausofa/portfile.cmake
user: login: dg0yt
body: ```suggestion
file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/usage" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")
vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE")
```
created_at: 2025-04-15T04:00:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,25 @@
+vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
+
+vcpkg_from_github(
+    OUT_SOURCE_PATH SOURCE_PATH
+    REPO longzhmm/vcpkg_iausofa
+    REF 8058fedf19ae2563dc643c04fde1d5f2b1057176
+    SHA512 de13bb1786e1c4b7556e8b53ac42c2b6a466c960ee69f85714e6f33aee72cfa9804edf43595f43bb660274c88ad2cd3a88f8675705bfdfb73cd08e3d6d5a93e4  
+    HEAD_REF main
+)
+
+
+vcpkg_cmake_configure(
+    SOURCE_PATH "${SOURCE_PATH}"
+)
+
+vcpkg_cmake_install()
+
+vcpkg_cmake_config_fixup(PACKAGE_NAME "iausofa")
path: ports/iausofa/portfile.cmake
user: login: dg0yt
body: Default package name is the port name.
```suggestion
vcpkg_cmake_config_fixup()
```
created_at: 2025-04-15T04:01:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,4 @@
+iausofa provides CMake targets:
+
+  find_package(iausofa CONFIG REQUIRED)
+  target_link_libraries(main PRIVATE iausofa::iausofa)
path: ports/iausofa/usage
user: login: dg0yt
body: I wonder if this shouldn't use the `unofficial` prefix which the maintainer guide requests for CMake config which is not provided by upstream. (This port doesn't use the official upstream sources.)
created_at: 2025-04-15T04:02:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,25 @@
+vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
path: ports/iausofa/portfile.cmake
user: login: longzhmm
body: Since the official Makefile generates a static library, it's configured as ONLY_STATIC_LIBRARY. Now, after adding the unofficial prefix to the port, the restriction is removed.
created_at: 2025-04-19T23:42:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,4 @@
+iausofa provides CMake targets:
+
+  find_package(iausofa CONFIG REQUIRED)
+  target_link_libraries(main PRIVATE iausofa::iausofa)
path: ports/iausofa/usage
user: login: longzhmm
body: Now, the source code is directly downloaded from the official upstream http://iausofa.org/current_C.html and an unofficial prefix has been added to customize the CMake configuration.
created_at: 2025-04-19T23:45:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -10421,4 +10425,4 @@
       "port-version": 0
     }
   }
-}
+}
path: versions/baseline.json
user: login: BillyONeal
body: Looks like `x-add-version` didn't do this edit?
created_at: 2025-04-22T18:18:26Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,114 @@
+/*----------------------------------------------------------------------
path: ports/iausofa/LICENSE
user: login: BillyONeal
body: The license file needs to come from the source text so that it can't accidentally be 'wrong' should it change in an update. vcpkg is not licensing the thing, the copyright holders are. If they do not provide the license in their own distributions, then we need to explain to users where they can get that.
created_at: 2025-04-22T18:18:30Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,114 @@
+/*----------------------------------------------------------------------
path: ports/iausofa/LICENSE
user: login: longzhmm
body: The official distribution of SOFA does not include a separate license file. Instead, the license details are specified in the Terms and Conditions on the official SOFA website. To address this, I have created a custom license file that directs users to the official SOFA Terms and Conditions page where the license information is provided. The license content can be found at [SOFA Terms and Conditions](https://iausofa.org/tandc.html) or by downloading the source code from [SOFA Home Page](https://iausofa.org/) and checking the end of any code file.
created_at: 2025-04-23T01:07:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -10421,4 +10425,4 @@
       "port-version": 0
     }
   }
-}
+}
path: versions/baseline.json
user: login: longzhmm
body: Thanks. I will double-check the file format and make sure my changes align with the latest version.
created_at: 2025-04-23T01:50:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,57 @@
+cmake_minimum_required(VERSION 3.15)
+
+# Sets the name of the <PROJECT-NAME>
+project(sofa LANGUAGES C)
+
+include(GNUInstallDirs)
+
+# set SOURCE dir
+set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
+
+# set .c files except for test_sofa.c
+file(GLOB_RECURSE SOURCES "${SOURCE_DIR}/*.c")
+list(REMOVE_ITEM SOURCES "${SOURCE_DIR}/test_sofa.c")
+
+# set .h files
+file(GLOB_RECURSE HEADERS "${SOURCE_DIR}/*.h")
+
+# Add a library target called <name>, eg. <name>.lib
+add_library(sofa ${SOURCES})
+
+# Sets properties on <targets>
+if(BUILD_SHARED_LIBS AND WIN32)
+        set_target_properties(sofa PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
path: ports/sofa/CMakeLists.txt
user: login: BillyONeal
body: This needs to comply with https://learn.microsoft.com/vcpkg/contributing/maintainer-guide#do-not-add-cmake_windows_export_all_symbols
created_at: 2025-04-24T22:26:51Z
author_association: MEMBER

PR comments:
user: login: longzhmm
created_at: 2025-04-10T09:22:43Z
body: @microsoft-github-policy-service agree
author_association: CONTRIBUTOR
user: login: longzhmm
created_at: 2025-04-13T12:43:35Z
body: @LilyWangLL

The page says "1 workflow awaiting approval" ... "Check Expected — Waiting for status to be reported"

What do I need to do?

author_association: CONTRIBUTOR
user: login: LilyWangLL
created_at: 2025-04-14T08:27:09Z
body: Usage passed on `x64-windows`.
author_association: CONTRIBUTOR
user: login: longzhmm
created_at: 2025-04-22T01:43:06Z
body: The selected repository is now the official upstream. However, since the upstream does not provide a CMake build system, I have added an unofficial prefix to my configuration.
author_association: CONTRIBUTOR
user: login: BillyONeal
created_at: 2025-04-22T19:58:09Z
body: Also for the record I like `iausofa` as a name but https://repology.org/project/iausofa/versions suggests that this is usually called '`sofa`' or '`iausofa-c`' by package managers. Going to confirm with others that this is OK.
author_association: MEMBER
user: login: longzhmm
created_at: 2025-04-23T01:07:55Z
body: The official SOFA makefile is only intended for Unix users and generates static libraries. It doesn't define how to build dynamic or static libraries for Windows or macOS. I'm not very familiar with vcpkg's makefile handling. I'm not sure if it's possible to use the official makefile with vcpkg to create libraries for all these platforms. So, I prioritized creating a custom CMake configuration to better integrate with vcpkg and support different library types across platforms.

> Can you explain why we are supplying a custom build script rather than using their existing makefile?
> 
> (To be clear, I am not saying we can't do this, I just think we need on record why)


author_association: CONTRIBUTOR
user: login: longzhmm
created_at: 2025-04-23T01:41:40Z
body: > Also for the record I like `iausofa` as a name but https://repology.org/project/iausofa/versions suggests that this is usually called '`sofa`' or '`iausofa-c`' by package managers. Going to confirm with others that this is OK.

The name 'iausofa' (and not 'sofa') makes it clear that it is connected to the International Astronomical Union. vcpkg is a C++ package manager. I think 'iausofa' is more appropriate than 'iausofa-c' because it has fewer unnecessary letters at the end. But I respect everyone's opinion and I'm happy to wait for feedback from the other team members to make sure that we all agree on the name. If it's not suitable, I will rename the port.

author_association: CONTRIBUTOR
user: login: BillyONeal
created_at: 2025-04-23T06:33:39Z
body: To be clear, I'm not *unhappy* with the name as proposed here, I just think it's borderline enough that I'm making sure the other maintainers also think so.
author_association: MEMBER
user: login: longzhmm
created_at: 2025-04-23T13:50:54Z
body: > To be clear, I'm not _unhappy_ with the name as proposed here, I just think it's borderline enough that I'm making sure the other maintainers also think so.

I understand your point. To ensure clarity and consistency with the naming on [repology](https://repology.org/project/iausofa/versions), I've changed the port name to "sofa". If you and the other maintainers agree that this name is more appropriate, then this change should be fine.
author_association: CONTRIBUTOR
user: login: BillyONeal
created_at: 2025-04-23T18:32:38Z
body: OK; when I get the others to comment I'm still going to be assuming your vote is for 'iausofa' since that's the original submission.
author_association: MEMBER
user: login: BillyONeal
created_at: 2025-04-24T22:28:29Z
body: @vicroms @ras0219-msft @JavierMatosD @AugP and I discussed the name today.

@ras0219-msft "I also prefer iausofa"

We observe that "sofa c++" finds https://repology.org/project/sofa-framework/ which is a good reason to keep the originally submitted name "iausofa".

Thanks for the new library and sorry for the conflicting advice!
author_association: MEMBER
user: login: longzhmm
created_at: 2025-04-25T04:38:16Z
body: > Thanks for the new port!

Thanks for your review and the modifications! I'm grateful for your help in enhancing the port. I'll keep this in mind for my next contributions.
author_association: CONTRIBUTOR
user: login: BillyONeal
created_at: 2025-04-25T05:09:38Z
body: Looks like merging didn't work and I still need a review from someone else :)
author_association: MEMBER
user: login: longzhmm
created_at: 2025-04-25T05:20:52Z
body: @LilyWangLL 

Could you please review and approve the PR again? I've made some changes based on others' feedback and would appreciate your re-confirmation. Thanks for your help!
author_association: CONTRIBUTOR