@@ -227,3 +227,109 @@ run_test_groups() {
227227 fi
228228 set -e
229229}
230+
231+ # Retag wheels with manylinux platform tags
232+ #
233+ # When building wheels with `setup.py bdist_wheel`, the wheel is tagged with the
234+ # generic platform tag (e.g., "linux_x86_64", "linux_aarch64"). However, PyPI
235+ # requires proper manylinux tags (e.g., "manylinux2014_x86_64") to indicate
236+ # compatibility with the manylinux standard. Simply renaming the .whl file is
237+ # insufficient because the platform tag is also stored in the WHEEL metadata file
238+ # inside the wheel archive.
239+ #
240+ # This function properly retags wheels by:
241+ # 1. Unpacking the wheel archive
242+ # 2. Modifying the "Tag:" field in the .dist-info/WHEEL metadata file
243+ # 3. Repacking the wheel with the updated metadata and correct filename
244+ #
245+ # The `wheel pack` command automatically regenerates the RECORD file with updated
246+ # hashes, ensuring wheel integrity. This is similar to how PyTorch does it in their
247+ # manywheel build scripts (see pytorch/.ci/manywheel/build_common.sh).
248+ #
249+ # Usage: retag_wheel_platform <platform_tag> [wheel_dir]
250+ # platform_tag: Target platform (e.g., "manylinux2014_x86_64", "manylinux2014_aarch64")
251+ # wheel_dir: Directory containing wheels (defaults to "dist")
252+ #
253+ # Example:
254+ # retag_wheel_platform "manylinux2014_x86_64"
255+ # retag_wheel_platform "manylinux2014_aarch64" "build/wheels"
256+ retag_wheel_platform () {
257+ local platform_tag=" ${1} "
258+ local wheel_dir=" ${2:- dist} "
259+
260+ if [[ -z " $platform_tag " ]]; then
261+ echo " Error: platform_tag is required"
262+ echo " Usage: retag_wheel_platform <platform_tag> [wheel_dir]"
263+ return 1
264+ fi
265+
266+ if [[ ! -d " $wheel_dir " ]]; then
267+ echo " Error: wheel directory '$wheel_dir ' does not exist"
268+ return 1
269+ fi
270+
271+ echo " Retagging wheels in '$wheel_dir ' with platform tag: $platform_tag "
272+
273+ # Install wheel tool if not present
274+ pip install -q wheel
275+
276+ local wheel_count=0
277+ for whl in " $wheel_dir " /* .whl; do
278+ if [[ ! -f " $whl " ]]; then
279+ continue
280+ fi
281+
282+ wheel_count=$(( wheel_count + 1 ))
283+ echo " Processing: $( basename " $whl " ) "
284+
285+ # Unpack the wheel
286+ wheel unpack " $whl " -d " $wheel_dir "
287+ local whl_dir=$( find " $wheel_dir " -maxdepth 1 -type d -name " $( basename " $whl " .whl) " -print -quit)
288+
289+ if [[ -n " $whl_dir " && -d " $whl_dir " ]]; then
290+ # Find and modify the WHEEL metadata file
291+ local wheel_file=$( find " $whl_dir " -name " WHEEL" -type f)
292+
293+ if [[ -f " $wheel_file " ]]; then
294+ echo " Updating WHEEL metadata: $wheel_file "
295+
296+ # Replace platform tag based on target
297+ case " $platform_tag " in
298+ manylinux* _x86_64)
299+ sed -i ' s/Tag:.*linux_x86_64/Tag: py3-none-' " $platform_tag " ' /g' " $wheel_file "
300+ ;;
301+ manylinux* _aarch64)
302+ sed -i ' s/Tag:.*linux_aarch64/Tag: py3-none-' " $platform_tag " ' /g' " $wheel_file "
303+ ;;
304+ * )
305+ echo " Warning: Unknown platform tag pattern '$platform_tag ', attempting generic replacement"
306+ sed -i ' s/Tag: \(.*\)-linux_[^-]*/Tag: \1-' " $platform_tag " ' /g' " $wheel_file "
307+ ;;
308+ esac
309+ else
310+ echo " Warning: WHEEL file not found in unpacked wheel"
311+ fi
312+
313+ # Repack the wheel with new platform tag
314+ echo " Repacking wheel..."
315+ wheel pack " $whl_dir " -d " $wheel_dir " > /dev/null
316+
317+ # Clean up unpacked directory
318+ rm -rf " $whl_dir "
319+ fi
320+
321+ # Remove original wheel
322+ rm " $whl "
323+ echo " ✓ Retagged: $( basename " $whl " ) "
324+ done
325+
326+ if [[ $wheel_count -eq 0 ]]; then
327+ echo " Warning: No wheels found in '$wheel_dir '"
328+ return 1
329+ fi
330+
331+ echo " ✓ Successfully retagged $wheel_count wheel(s)"
332+ echo " Final wheels:"
333+ ls -lh " $wheel_dir " /* .whl
334+ }
335+
0 commit comments