Skip to content

Commit

Permalink
Add Tcl/Tk 8.6 to manylinux2014 (#1365)
Browse files Browse the repository at this point in the history
* Add Tcl/Tk 8.6 to manylinux2014

* remove default tcl/tk runtime and devel packages

* Update Tcl/Tk on patch releases
  • Loading branch information
marcelotduarte committed Aug 28, 2022
1 parent 92d3131 commit f738f28
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 2 deletions.
8 changes: 8 additions & 0 deletions docker/Dockerfile
Expand Up @@ -95,6 +95,14 @@ RUN export OPENSSL_ROOT=openssl-1.1.1q && \
export OPENSSL_DOWNLOAD_URL=https://www.openssl.org/source && \
manylinux-entrypoint /build_scripts/build-openssl.sh

COPY build_scripts/build-tcltk.sh /build_scripts/
RUN export TCL_ROOT=tcl8.6.12 && \
export TCL_HASH=26c995dd0f167e48b11961d891ee555f680c175f7173ff8cb829f4ebcde4c1a6 && \
export TCL_DOWNLOAD_URL=https://prdownloads.sourceforge.net/tcl && \
export TK_ROOT=tk8.6.12 && \
export TK_HASH=12395c1f3fcb6bed2938689f797ea3cdf41ed5cb6c4766eec8ac949560310630 && \
manylinux-entrypoint /build_scripts/build-tcltk.sh

COPY build_scripts/build-cpython.sh /build_scripts/


Expand Down
62 changes: 62 additions & 0 deletions docker/build_scripts/build-tcltk.sh
@@ -0,0 +1,62 @@
#!/bin/bash
# Top-level build script called from Dockerfile

# Stop at any error, show all commands
set -exuo pipefail

# Get script directory
MY_DIR=$(dirname "${BASH_SOURCE[0]}")

# Get build utilities
source $MY_DIR/build_utils.sh

# Install a more recent Tcl/Tk 8.6
# https://www.tcl.tk/software/tcltk/download.html
check_var ${TCL_ROOT}
check_var ${TCL_HASH}
check_var ${TCL_DOWNLOAD_URL}
check_var ${TK_ROOT}
check_var ${TK_HASH}

if [ "${AUDITWHEEL_POLICY}" == "manylinux2014" ] ; then
yum erase -y tcl tk
else
exit 0
fi

fetch_source ${TCL_ROOT}-src.tar.gz ${TCL_DOWNLOAD_URL}
check_sha256sum ${TCL_ROOT}-src.tar.gz ${TCL_HASH}
fetch_source ${TK_ROOT}-src.tar.gz ${TCL_DOWNLOAD_URL}
check_sha256sum ${TK_ROOT}-src.tar.gz ${TK_HASH}

tar xfz ${TCL_ROOT}-src.tar.gz
pushd ${TCL_ROOT}/unix
DESTDIR=/manylinux-rootfs do_standard_install
popd

tar xfz ${TK_ROOT}-src.tar.gz
pushd ${TK_ROOT}/unix
DESTDIR=/manylinux-rootfs do_standard_install
popd

# Remove only after building is complete
rm -rf ${TCL_ROOT} ${TCL_ROOT}-src.tar.gz
rm -rf ${TK_ROOT} ${TK_ROOT}-src.tar.gz

# Static library is unused, remove it
rm /manylinux-rootfs/usr/local/lib/libtclstub8.6.a
rm /manylinux-rootfs/usr/local/lib/libtkstub8.6.a

# Strip what we can
strip_ /manylinux-rootfs

# Install
cp -rlf /manylinux-rootfs/* /
if [ "${BASE_POLICY}" == "musllinux" ]; then
ldconfig /
elif [ "${BASE_POLICY}" == "manylinux" ]; then
ldconfig
fi

# Clean-up for runtime
rm -rf /manylinux-rootfs/usr/local/share
5 changes: 4 additions & 1 deletion docker/build_scripts/install-build-packages.sh
Expand Up @@ -14,7 +14,10 @@ if [ "${AUDITWHEEL_POLICY}" == "manylinux2014" ] || [ "${AUDITWHEEL_POLICY}" ==
else
PACKAGE_MANAGER=dnf
fi
COMPILE_DEPS="bzip2-devel ncurses-devel readline-devel tk-devel gdbm-devel libpcap-devel xz-devel openssl openssl-devel keyutils-libs-devel krb5-devel libcom_err-devel libidn-devel curl-devel uuid-devel libffi-devel kernel-headers libdb-devel"
COMPILE_DEPS="bzip2-devel ncurses-devel readline-devel gdbm-devel libpcap-devel xz-devel openssl openssl-devel keyutils-libs-devel krb5-devel libcom_err-devel libidn-devel curl-devel uuid-devel libffi-devel kernel-headers libdb-devel"
if [ "${AUDITWHEEL_POLICY}" == "manylinux_2_28" ]; then
COMPILE_DEPS="${COMPILE_DEPS} tk-devel"
fi
elif [ "${AUDITWHEEL_POLICY}" == "manylinux_2_24" ]; then
PACKAGE_MANAGER=apt
COMPILE_DEPS="libbz2-dev libncurses5-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev liblzma-dev openssl libssl-dev libkeyutils-dev libkrb5-dev comerr-dev libidn2-0-dev libcurl4-openssl-dev uuid-dev libffi-dev linux-kernel-headers"
Expand Down
5 changes: 4 additions & 1 deletion docker/build_scripts/install-runtime-packages.sh
Expand Up @@ -45,7 +45,10 @@ fi

# RUNTIME_DEPS: Runtime dependencies. c.f. install-build-packages.sh
if [ "${AUDITWHEEL_POLICY}" == "manylinux2014" ] || [ "${AUDITWHEEL_POLICY}" == "manylinux_2_28" ]; then
RUNTIME_DEPS="zlib bzip2 expat ncurses readline tk gdbm libpcap xz openssl keyutils-libs libkadm5 libcom_err libidn libcurl uuid libffi libdb"
RUNTIME_DEPS="zlib bzip2 expat ncurses readline gdbm libpcap xz openssl keyutils-libs libkadm5 libcom_err libidn libcurl uuid libffi libdb"
if [ "${AUDITWHEEL_POLICY}" == "manylinux_2_28" ]; then
RUNTIME_DEPS="${RUNTIME_DEPS} tk"
fi
elif [ "${AUDITWHEEL_POLICY}" == "manylinux_2_24" ]; then
RUNTIME_DEPS="zlib1g libbz2-1.0 libexpat1 libncurses5 libreadline7 tk libgdbm3 libdb5.3 libpcap0.8 liblzma5 libssl1.1 libkeyutils1 libkrb5-3 libcomerr2 libidn2-0 libcurl3 uuid libffi6"
elif [ "${AUDITWHEEL_POLICY}" == "musllinux_1_1" ]; then
Expand Down
29 changes: 29 additions & 0 deletions update_native_dependencies.py
Expand Up @@ -141,12 +141,41 @@ def _update_with_gh(tool, dry_run):
break


def _update_tcltk(dry_run):
dockerfile = Path(__file__).parent / "docker" / "Dockerfile"
lines = dockerfile.read_text().splitlines()
re_ = re.compile("^RUN export TCL_ROOT=tcl(?P<version>\\S+) && \\\\$")
for i in range(len(lines)):
match = re_.match(lines[i])
if match is None:
continue
current_version = Version(match["version"])
latest_version = latest("tcltk/tcl", only="core-8-6-")
if latest_version > current_version:
root = f"tcl{latest_version}"
url = re.match("^ export TCL_DOWNLOAD_URL=(?P<url>\\S+) && \\\\$", lines[i + 2])["url"]
sha256 = _sha256(f"{url}/{root}-src.tar.gz")
lines[i + 0] = f"RUN export TCL_ROOT={root} && \\"
lines[i + 1] = f" export TCL_HASH={sha256} && \\"
root = f"tk{latest_version}"
sha256 = _sha256(f"{url}/{root}-src.tar.gz")
lines[i + 3] = f" export TK_ROOT={root} && \\"
lines[i + 4] = f" export TK_HASH={sha256} && \\"
message = f"Bump Tcl/Tk {current_version}{latest_version}"
print(message)
if not dry_run:
dockerfile.write_text("\n".join(lines) + "\n")
subprocess.check_call(["git", "commit", "-am", message])
break


def main():
parser = argparse.ArgumentParser()
parser.add_argument("--dry-run", dest="dry_run", action="store_true", help="dry run")
args = parser.parse_args()
_update_cpython(args.dry_run)
_update_sqlite(args.dry_run)
_update_tcltk(args.dry_run)
for tool in ["autoconf", "automake", "libtool", "git", "openssl"]:
_update_with_root(tool, args.dry_run)
for tool in ["libxcrypt"]:
Expand Down

0 comments on commit f738f28

Please sign in to comment.