1a4bd5210SJason Evans#!/bin/sh 2a4bd5210SJason Evans# 3a4bd5210SJason Evans# Usage: cd /usr/src/contrib/jemalloc 4a4bd5210SJason Evans# ./FREEBSD-upgrade <command> [args] 5a4bd5210SJason Evans# 6a4bd5210SJason Evans# At least the following ports are required when importing jemalloc: 7a4bd5210SJason Evans# - devel/autoconf 8a4bd5210SJason Evans# - devel/git 9a4bd5210SJason Evans# - devel/gmake 10a4bd5210SJason Evans# - textproc/docbook-xsl 1170fabd84SJason Evans# - textproc/libxslt 12a4bd5210SJason Evans# 13a4bd5210SJason Evans# The normal workflow for importing a new release is: 14a4bd5210SJason Evans# 15a4bd5210SJason Evans# cd /usr/src/contrib/jemalloc 16a4bd5210SJason Evans# 17a4bd5210SJason Evans# Merge local changes that were made since the previous import: 18a4bd5210SJason Evans# 19a4bd5210SJason Evans# ./FREEBSD-upgrade merge-changes 20a4bd5210SJason Evans# ./FREEBSD-upgrade rediff 21a4bd5210SJason Evans# 22a4bd5210SJason Evans# Extract latest jemalloc release. 23a4bd5210SJason Evans# 24b7eaed25SJason Evans# ./FREEBSD-upgrade extract <rev> 25a4bd5210SJason Evans# 26a4bd5210SJason Evans# Fix patch conflicts as necessary, then regenerate diffs to update line 27a4bd5210SJason Evans# offsets: 28a4bd5210SJason Evans# 29a4bd5210SJason Evans# ./FREEBSD-upgrade rediff 30b7eaed25SJason Evans# ./FREEBSD-upgrade extract <rev> 31a4bd5210SJason Evans# 32a4bd5210SJason Evans# Do multiple buildworld/installworld rounds. If problems arise and patches 33a4bd5210SJason Evans# are needed, edit the code in ${work} as necessary, then: 34a4bd5210SJason Evans# 35a4bd5210SJason Evans# ./FREEBSD-upgrade rediff 36b7eaed25SJason Evans# ./FREEBSD-upgrade extract <rev> 37a4bd5210SJason Evans# 38a4bd5210SJason Evans# The rediff/extract order is important because rediff saves the local 39a4bd5210SJason Evans# changes, then extract blows away the work tree and re-creates it with the 40a4bd5210SJason Evans# diffs applied. 41a4bd5210SJason Evans# 42a4bd5210SJason Evans# Finally, to clean up: 43a4bd5210SJason Evans# 44a4bd5210SJason Evans# ./FREEBSD-upgrade clean 45a4bd5210SJason Evans 46a4bd5210SJason Evansset -e 47b7eaed25SJason Evansset -x 48a4bd5210SJason Evans 49a4bd5210SJason Evansif [ ! -x "FREEBSD-upgrade" ] ; then 50a4bd5210SJason Evans echo "Run from within src/contrib/jemalloc/" >&2 51a4bd5210SJason Evans exit 1 52a4bd5210SJason Evansfi 53a4bd5210SJason Evans 54b7eaed25SJason Evansif [ "x${JEMALLOC_REPO}" = "x" ] ; then 55b7eaed25SJason Evans JEMALLOC_REPO=https://github.com/jemalloc/jemalloc.git 56b7eaed25SJason Evansfi 57b7eaed25SJason Evans 58a4bd5210SJason Evanssrc=`pwd` 59b7eaed25SJason Evans 60b7eaed25SJason Evansjemalloc_tmp="jemalloc.tmp" 61b7eaed25SJason Evanstmpdir="${src}/../${jemalloc_tmp}" 62b7eaed25SJason Evansbare_repo="${tmpdir}/jemalloc_bare.git" 63b7eaed25SJason Evanswork="jemalloc_work.git" 64b7eaed25SJason Evanswork_repo="${tmpdir}/${work}" 65b7eaed25SJason Evansnamespace_repo="${tmpdir}/jemalloc_namespace.git" 66a4bd5210SJason Evanschanges="${src}/FREEBSD-changes" 67a4bd5210SJason Evans 68b7eaed25SJason Evansdo_fetch() { 69a4bd5210SJason Evans local rev=$1 70b7eaed25SJason Evans if [ ! -d "${bare_repo}" ] ; then 71b7eaed25SJason Evans mkdir -p "${bare_repo}" 72b7eaed25SJason Evans git clone --bare ${JEMALLOC_REPO} ${bare_repo} 73b7eaed25SJason Evans fi 74a4bd5210SJason Evans ( 75b7eaed25SJason Evans cd ${bare_repo} 76b7eaed25SJason Evans git fetch origin ${rev} 77b7eaed25SJason Evans ) 78b7eaed25SJason Evans} 79b7eaed25SJason Evans 80b7eaed25SJason Evansdo_extract_helper() { 81b7eaed25SJason Evans local rev=$1 82b7eaed25SJason Evans local repo=$2 83b7eaed25SJason Evans do_fetch ${rev} 84b7eaed25SJason Evans rm -rf ${repo} 85b7eaed25SJason Evans git clone ${bare_repo} ${repo} 86b7eaed25SJason Evans ( 87b7eaed25SJason Evans cd ${repo} 88a4bd5210SJason Evans if [ "x${rev}" != "x" ] ; then 89a4bd5210SJason Evans # Use optional rev argument to check out a revision other than HEAD on 90a4bd5210SJason Evans # master. 91a4bd5210SJason Evans git checkout ${rev} 92a4bd5210SJason Evans fi 93b7eaed25SJason Evans ) 94b7eaed25SJason Evans} 95b7eaed25SJason Evans 96b7eaed25SJason Evansdo_autogen() { 97b7eaed25SJason Evans ./autogen.sh --enable-xmalloc --enable-utrace \ 98*1a78ec89SJason Evans --with-malloc-conf=abort_conf:false \ 99b7eaed25SJason Evans --with-xslroot=/usr/local/share/xsl/docbook --with-private-namespace=__ \ 100b7eaed25SJason Evans --with-lg-page-sizes=12,13,14,16 101b7eaed25SJason Evans} 102b7eaed25SJason Evans 103b7eaed25SJason Evansdo_extract_diff() { 104b7eaed25SJason Evans local rev=$1 105b7eaed25SJason Evans local repo=$2 106b7eaed25SJason Evans do_extract_helper ${rev} ${repo} 107b7eaed25SJason Evans ( 108b7eaed25SJason Evans cd ${repo} 109a4bd5210SJason Evans # Apply diffs before generating files. 110a4bd5210SJason Evans patch -p1 < "${src}/FREEBSD-diffs" 111a4bd5210SJason Evans find . -name '*.orig' -delete 112b7eaed25SJason Evans # Generate files. 113b7eaed25SJason Evans do_autogen 114a4bd5210SJason Evans gmake dist 115a4bd5210SJason Evans ) 116a4bd5210SJason Evans} 117a4bd5210SJason Evans 118b7eaed25SJason Evansdo_extract_namespace() { 119b7eaed25SJason Evans local rev=$1 120b7eaed25SJason Evans local repo=$2 121b7eaed25SJason Evans do_extract_helper ${rev} ${repo} 122b7eaed25SJason Evans ( 123b7eaed25SJason Evans cd ${repo} 124b7eaed25SJason Evans # Generate files. 125b7eaed25SJason Evans do_autogen 126b7eaed25SJason Evans gmake include/jemalloc/internal/private_namespace.h 127b7eaed25SJason Evans ) 128b7eaed25SJason Evans} 129b7eaed25SJason Evans 130b7eaed25SJason Evansdo_extract() { 131b7eaed25SJason Evans local rev=$1 132b7eaed25SJason Evans do_fetch ${rev} 133b7eaed25SJason Evans do_extract_diff ${rev} ${work_repo} 134b7eaed25SJason Evans do_extract_namespace ${rev} ${namespace_repo} 135b7eaed25SJason Evans} 136b7eaed25SJason Evans 137a4bd5210SJason Evansdo_diff() { 138d0e79aa3SJason Evans ( 139b7eaed25SJason Evans cd ${work_repo} 140d0e79aa3SJason Evans find . -name '*.orig' -delete 141d0e79aa3SJason Evans find . -name '*.rej' -delete 142d0e79aa3SJason Evans git add -A 143d0e79aa3SJason Evans git diff --cached 144d0e79aa3SJason Evans ) > FREEBSD-diffs 145a4bd5210SJason Evans} 146a4bd5210SJason Evans 147a4bd5210SJason Evanscommand=$1 148a4bd5210SJason Evansshift 149a4bd5210SJason Evanscase "${command}" in 150a4bd5210SJason Evans merge-changes) # Merge local changes that were made since the previous import. 151a4bd5210SJason Evans rev=`cat VERSION |tr 'g' ' ' |awk '{print $2}'` 152a4bd5210SJason Evans # Extract code corresponding to most recent import. 153a4bd5210SJason Evans do_extract ${rev} 154a4bd5210SJason Evans # Compute local differences to the upstream+patches and apply them. 155a4bd5210SJason Evans ( 156b7eaed25SJason Evans cd ${tmpdir} 157b7eaed25SJason Evans diff -ru -X ${src}/FREEBSD-Xlist ${work} ../jemalloc > ${changes} || true 158a4bd5210SJason Evans ) 159a4bd5210SJason Evans ( 160b7eaed25SJason Evans cd ${work_repo} 161b7eaed25SJason Evans patch -p1 < ${changes} || true 162a4bd5210SJason Evans find . -name '*.orig' -delete 163a4bd5210SJason Evans ) 164a4bd5210SJason Evans # Update diff. 165a4bd5210SJason Evans do_diff 166a4bd5210SJason Evans ;; 167a4bd5210SJason Evans extract) # Extract upstream sources, apply patches, copy to contrib/jemalloc. 168a4bd5210SJason Evans rev=$1 169a4bd5210SJason Evans do_extract ${rev} 170a4bd5210SJason Evans # Delete existing files so that cruft doesn't silently remain. 171a4bd5210SJason Evans rm -rf ChangeLog COPYING VERSION doc include src 172a4bd5210SJason Evans # Copy files over. 173b7eaed25SJason Evans tar cf - -C ${work_repo} -X FREEBSD-Xlist . |tar xvf - 174b7eaed25SJason Evans internal_dir="include/jemalloc/internal" 175b7eaed25SJason Evans grep -v ' isthreaded ' \ 176b7eaed25SJason Evans "${namespace_repo}/${internal_dir}/private_namespace.h" \ 177b7eaed25SJason Evans > "${internal_dir}/private_namespace.h" 178a4bd5210SJason Evans ;; 179a4bd5210SJason Evans rediff) # Regenerate diffs based on working tree. 180a4bd5210SJason Evans do_diff 181a4bd5210SJason Evans ;; 182a4bd5210SJason Evans clean) # Remove working tree and temporary files. 183b7eaed25SJason Evans rm -rf ${tmpdir} ${changes} 184a4bd5210SJason Evans ;; 185a4bd5210SJason Evans *) 186a4bd5210SJason Evans echo "Unsupported command: \"${command}\"" >&2 187a4bd5210SJason Evans exit 1 188a4bd5210SJason Evans ;; 189a4bd5210SJason Evansesac 190