| #!/usr/bin/env bash | |
| # | |
| # Use this script to update libexpat | |
| set -e | |
| set -o pipefail | |
| if [[ "${BASH_VERSINFO[0]}" -lt 4 ]]; then | |
| echo "A bash version >= 4 required. Got: $BASH_VERSION" >&2 | |
| exit 1 | |
| fi | |
| # Update this when updating to a new version after verifying that the changes | |
| # the update brings in are good. These values are used for verifying the SBOM, too. | |
| expected_libexpat_tag="R_2_8_5" | |
| expected_libexpat_version="2.8.5" | |
| expected_libexpat_sha256="920dde485e15eda0cce8d2310b41d492c534e5e3d89ad407a0b4176dd2ff88fe" | |
| expat_dir="$(realpath "$(dirname -- "${BASH_SOURCE[0]}")")" | |
| cd ${expat_dir} | |
| # Step 1: download and copy files | |
| curl --location "https://github.com/libexpat/libexpat/releases/download/${expected_libexpat_tag}/expat-${expected_libexpat_version}.tar.gz" > libexpat.tar.gz | |
| echo "${expected_libexpat_sha256} libexpat.tar.gz" | sha256sum --check | |
| # Step 2: Pull files from the libexpat distribution | |
| tar xzvf libexpat.tar.gz "expat-${expected_libexpat_version}/COPYING" --strip-components 2 | |
| declare -a lib_files | |
| lib_files=( | |
| ascii.h | |
| asciitab.h | |
| expat.h | |
| expat_external.h | |
| fallthrough.h | |
| hash_table.h | |
| iasciitab.h | |
| internal.h | |
| latin1tab.h | |
| memory_sanitizer.h | |
| nametab.h | |
| siphash.h | |
| utf8tab.h | |
| winconfig.h | |
| xcsinc.c | |
| xmlparse.c | |
| xmlrole.c | |
| xmlrole.h | |
| xmltok.c | |
| xmltok.h | |
| xmltok_impl.c | |
| xmltok_impl.h | |
| xmltok_ns.c | |
| ) | |
| for f in "${lib_files[@]}"; do | |
| tar xzvf libexpat.tar.gz "expat-${expected_libexpat_version}/lib/${f}" --strip-components 2 | |
| done | |
| rm libexpat.tar.gz | |
| # Step 3: Add the namespacing include to expat_external.h | |
| sed -i 's/# define Expat_External_INCLUDED 1/&\n\/* Namespace external symbols to allow multiple libexpat version to\n co-exist. \*\/\n#include "pyexpatns.h"/' expat_external.h | |
| if ! grep -q '#include "pyexpatns\.h"' expat_external.h; then | |
| echo " | |
| Error: namespacing include not found in expat_external.h; | |
| This may be due to source changes and will require updating this script" >&2 | |
| exit 1 | |
| fi | |
| # Step 4: Skip the Windows rand_s entropy path in xmlparse.c when | |
| # XML_POOR_ENTROPY is set. | |
| sed -z -i 's|#if defined(_WIN32)\n# include "random_rand_s\.h"\n#endif /\* defined(_WIN32) \*/|#if defined(_WIN32) \&\& ! defined(XML_POOR_ENTROPY)\n# include "random_rand_s.h"\n#endif /* defined(_WIN32) \&\& ! defined(XML_POOR_ENTROPY) */|' xmlparse.c | |
| sed -z -i 's|# ifdef _WIN32\n if (writeRandomBytes_rand_s|# if defined(_WIN32) \&\& ! defined(XML_POOR_ENTROPY)\n if (writeRandomBytes_rand_s|' xmlparse.c | |
| if ! grep -q '#if defined(_WIN32) && ! defined(XML_POOR_ENTROPY)' xmlparse.c; then | |
| echo " | |
| Error: rand_s gate not patched in xmlparse.c; | |
| This may be due to source changes and will require updating this script" >&2 | |
| exit 1 | |
| fi | |
| echo ' | |
| Updated! next steps: | |
| - Verify all is okay: | |
| git diff | |
| git status | |
| - Update the sbom file: | |
| Under the package "SPDXRef-PACKAGE-expat", update the "checksumValue", | |
| "downloadLocation", "referenceLocator", and "versionInfo" fields. | |
| - Regenerate the sbom file: | |
| make regen-sbom | |
| - Update the warning count in Tools/build/.warningignore_macos: | |
| (use info from CI if not on a Mac) | |
| ' |