xref: /freebsd/contrib/jemalloc/FREEBSD-upgrade (revision d37eb51047221dc3322b34db1038ff3aa533883f)
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