aba6ec3e52
Motivation: • faster builds (on an Intel Core i9-9900K): ( ../configure --disable-sanitizers && make -j8; ) 19,47s user 2,78s system 395% cpu 5,632 total ( meson .. -Dmans=true -Ddocs=true -Dprefix=/usr && ninja; ) 38,67s user 3,73s system 1095% cpu 3,871 total • more approachable build system configuration in the python-esque meson domain specific language instead of the autotools m4 macro language • built-in language server support thanks to ninja: the required compile_commands.json is built automatically and only needs to be linked from the source dir, e.g.: ln -s build/compile_commands.json . Changes: • the embedded vcs version info format changed from e.g. 4.18-282-gabe46f69 (2020-05-16, branch "next") to: 4.18-282-gabe46f69 I think it’s better to lose a little bit of detail for the gained cleanliness of using meson’s vcs_tag() • Drop unused xcb-event dependency. • We can no longer enable sanitizers and debug options based on whether we are in a release or non-release build, because our new version logic runs at ninja build time, not at meson configure time. The new behavior is probably for the better in terms of what people expect, and we can make the CI use address sanitizer explicitly to ensure it is still exercised. • We lose the AX_EXTEND_SRCDIR behavior, i.e. including the path component of the parent of the source dir in all paths. This was a trick we used for easier debugging, so that stack traces would contain e.g. ../i3-4.18.1/src/main.c, instead of just src/main.c. The other mechanism (_i3_version symbol) that we have for including the version number in the “backtrace full” (but not merely “backtrace”) output of gdb still works. • Release tarballs now use tar.xz. Why not. Migration plan This commit adds the meson build files to the tree, but does not remove autotools yet. For the development phase, we will keep both build systems functional (and built on travis). Then, just before the i3 v4.19 release, we will remove autotools from the tree and the release tarball will require meson to compile. This way, we incentivize maintainers to change, while also offering them an easy way out (if desired) by reverting the most recent commit. In practice, switching a distribution package from autotools to meson should only be a few line change, easier than applying the provided patch :). Take a look at the debian/ changes in this commit for an example. meson is broadly available everywhere that i3 is available: Both xorg-server and systemd gained meson build files in 2017, so we can follow suit: https://anholt.livejournal.com/52574.html https://in.waw.pl/~zbyszek/blog/systemd-meson.html How do I? For producing a coverage report, enable the b_coverage meson base option and run ninja coverage-html: % cd build % meson .. -Db_coverage=true % ninja % ninja test % ninja coverage-html See also https://mesonbuild.com/howtox.html#producing-a-coverage-report For using the address sanitizer, memory sanitizer or undefined behavior sanitizer, use the b_sanitize meson base option: % cd build % meson .. -Db_sanitize=address % ninja See also https://mesonbuild.com/Builtin-options.html#base-options related to #4086
240 lines
8.8 KiB
Bash
Executable File
240 lines
8.8 KiB
Bash
Executable File
#!/bin/zsh
|
||
# This script is used to prepare a new release of i3.
|
||
|
||
export RELEASE_VERSION="4.19"
|
||
export PREVIOUS_VERSION="4.18"
|
||
export RELEASE_BRANCH="next"
|
||
|
||
if [ ! -e "../i3.github.io" ]
|
||
then
|
||
echo "../i3.github.io does not exist."
|
||
echo "Use git clone https://github.com/i3/i3.github.io"
|
||
exit 1
|
||
fi
|
||
|
||
if ! (cd ../i3.github.io && git pull)
|
||
then
|
||
echo "Could not update ../i3.github.io repository"
|
||
exit 1
|
||
fi
|
||
|
||
if [ ! -e "RELEASE-NOTES-${RELEASE_VERSION}" ]
|
||
then
|
||
echo "RELEASE-NOTES-${RELEASE_VERSION} not found."
|
||
exit 1
|
||
fi
|
||
|
||
if git diff-files --quiet --exit-code debian/changelog
|
||
then
|
||
echo "Expected debian/changelog to be changed (containing the changelog for ${RELEASE_VERSION})."
|
||
exit 1
|
||
fi
|
||
|
||
eval $(gpg-agent --daemon)
|
||
export GPG_AGENT_INFO
|
||
|
||
################################################################################
|
||
# Section 1: update git and build the release tarball
|
||
################################################################################
|
||
|
||
STARTDIR=$PWD
|
||
|
||
TMPDIR=$(mktemp -d)
|
||
cd $TMPDIR
|
||
if ! wget https://i3wm.org/downloads/i3-${PREVIOUS_VERSION}.tar.bz2; then
|
||
echo "Could not download i3-${PREVIOUS_VERSION}.tar.bz2 (required for comparing files)."
|
||
exit 1
|
||
fi
|
||
git clone --quiet --branch "${RELEASE_BRANCH}" https://github.com/i3/i3
|
||
cd i3
|
||
if [ ! -e "${STARTDIR}/RELEASE-NOTES-${RELEASE_VERSION}" ]; then
|
||
echo "Required file RELEASE-NOTES-${RELEASE_VERSION} not found."
|
||
exit 1
|
||
fi
|
||
git checkout -b release-${RELEASE_VERSION}
|
||
cp "${STARTDIR}/RELEASE-NOTES-${RELEASE_VERSION}" "RELEASE-NOTES-${RELEASE_VERSION}"
|
||
git add RELEASE-NOTES-${RELEASE_VERSION}
|
||
git rm RELEASE-NOTES-${PREVIOUS_VERSION}
|
||
sed -i "s/^\s*version: '${PREVIOUS_VERSION}'/ version: '${RELEASE_VERSION}'/" meson.build
|
||
git commit -a -m "release i3 ${RELEASE_VERSION}"
|
||
git tag "${RELEASE_VERSION}" -m "release i3 ${RELEASE_VERSION}" --sign --local-user=0x4AC8EE1D
|
||
|
||
mkdir build
|
||
(cd build && meson .. && ninja dist)
|
||
cp build/meson-build/i3-${RELEASE_VERSION}.tar.xz .
|
||
|
||
echo "Differences in the release tarball file lists:"
|
||
|
||
diff --color -u \
|
||
<(tar tf ../i3-${PREVIOUS_VERSION}.tar.xz | sed "s,i3-${PREVIOUS_VERSION}/,,g" | sort) \
|
||
<(tar tf i3-${RELEASE_VERSION}.tar.xz | sed "s,i3-${RELEASE_VERSION}/,,g" | sort)
|
||
|
||
gpg --armor -b i3-${RELEASE_VERSION}.tar.xz
|
||
|
||
echo "${RELEASE_VERSION}-non-git" > I3_VERSION
|
||
git add I3_VERSION
|
||
git commit -a -m "Set non-git version to ${RELEASE_VERSION}-non-git."
|
||
|
||
if [ "${RELEASE_BRANCH}" = "master" ]; then
|
||
git checkout master
|
||
git merge --no-ff release-${RELEASE_VERSION} -m "Merge branch 'release-${RELEASE_VERSION}'"
|
||
git checkout next
|
||
git merge --no-ff -s recursive -X ours -X no-renames master -m "Merge branch 'master' into next"
|
||
else
|
||
git checkout next
|
||
git merge --no-ff release-${RELEASE_VERSION} -m "Merge branch 'release-${RELEASE_VERSION}'"
|
||
git checkout master
|
||
git merge --no-ff -s recursive -X theirs -X no-renames next -m "Merge branch 'next' into master"
|
||
fi
|
||
|
||
git remote remove origin
|
||
git remote add origin git@github.com:i3/i3.git
|
||
git config --add remote.origin.push "+refs/tags/*:refs/tags/*"
|
||
git config --add remote.origin.push "+refs/heads/next:refs/heads/next"
|
||
git config --add remote.origin.push "+refs/heads/master:refs/heads/master"
|
||
|
||
################################################################################
|
||
# Section 2: Debian packaging
|
||
################################################################################
|
||
|
||
cd "${TMPDIR}"
|
||
mkdir debian
|
||
|
||
# Copy over the changelog because we expect it to be locally modified in the
|
||
# start directory.
|
||
cp "${STARTDIR}/debian/changelog" i3/debian/changelog
|
||
(cd i3 && git add debian/changelog && git commit -m 'Update debian/changelog')
|
||
|
||
cat > ${TMPDIR}/Dockerfile <<EOT
|
||
FROM debian:sid
|
||
RUN sed -i 's,^deb \(.*\),deb \1\ndeb-src \1,g' /etc/apt/sources.list
|
||
RUN apt-get update && apt-get install -y dpkg-dev devscripts
|
||
COPY i3/i3-${RELEASE_VERSION}.tar.xz /usr/src/i3-wm_${RELEASE_VERSION}.orig.tar.xz
|
||
WORKDIR /usr/src/
|
||
RUN tar xf i3-wm_${RELEASE_VERSION}.orig.tar.xz
|
||
WORKDIR /usr/src/i3-${RELEASE_VERSION}
|
||
COPY i3/debian /usr/src/i3-${RELEASE_VERSION}/debian/
|
||
RUN mkdir debian/source
|
||
RUN echo '3.0 (quilt)' > debian/source/format
|
||
WORKDIR /usr/src
|
||
RUN mk-build-deps --install --remove --tool 'apt-get --no-install-recommends -y' i3-${RELEASE_VERSION}/debian/control
|
||
WORKDIR /usr/src/i3-${RELEASE_VERSION}
|
||
RUN dpkg-buildpackage -sa -j8
|
||
RUN dpkg-buildpackage -S -sa -j8
|
||
EOT
|
||
|
||
CONTAINER_NAME=$(echo "i3-${TMPDIR}" | sed 's,/,,g')
|
||
docker build --no-cache -t i3 .
|
||
for file in $(docker run --name "${CONTAINER_NAME}" i3 /bin/sh -c "ls /usr/src/i3*_${RELEASE_VERSION}*")
|
||
do
|
||
docker cp "${CONTAINER_NAME}:${file}" ${TMPDIR}/debian/
|
||
done
|
||
|
||
echo "Content of resulting package’s .changes file:"
|
||
cat ${TMPDIR}/debian/*.changes
|
||
|
||
# debsign is in devscripts, which is available in fedora and debian
|
||
debsign --no-re-sign -k4AC8EE1D ${TMPDIR}/debian/*.changes
|
||
|
||
# TODO: docker cleanup
|
||
|
||
################################################################################
|
||
# Section 3: website
|
||
################################################################################
|
||
|
||
# Ensure we are in the correct branch for copying the docs.
|
||
cd ${TMPDIR}/i3
|
||
git checkout ${RELEASE_BRANCH}
|
||
|
||
cd ${TMPDIR}
|
||
git clone --quiet ${STARTDIR}/../i3.github.io
|
||
cd i3.github.io
|
||
|
||
mkdir docs/${PREVIOUS_VERSION}
|
||
tar cf - '--exclude=[0-9]\.[0-9e]*' docs | tar xf - --strip-components=1 -C docs/${PREVIOUS_VERSION}
|
||
git add docs/${PREVIOUS_VERSION}
|
||
git commit -a -m "save docs for ${PREVIOUS_VERSION}"
|
||
|
||
cp ${TMPDIR}/i3/i3-${RELEASE_VERSION}.tar.xz* downloads/
|
||
git add downloads/i3-${RELEASE_VERSION}.tar.xz*
|
||
cp ${TMPDIR}/i3/RELEASE-NOTES-${RELEASE_VERSION} downloads/RELEASE-NOTES-${RELEASE_VERSION}.txt
|
||
git add downloads/RELEASE-NOTES-${RELEASE_VERSION}.txt
|
||
sed -i "s,<h2>Documentation for i3 v[^<]*</h2>,<h2>Documentation for i3 v${RELEASE_VERSION}</h2>,g" docs/index.html
|
||
sed -i "s,<span style=\"margin-left: 2em; color: #c0c0c0\">[^<]*</span>,<span style=\"margin-left: 2em; color: #c0c0c0\">${RELEASE_VERSION}</span>,g" index.html
|
||
sed -i "s,The current stable version is .*$,The current stable version is ${RELEASE_VERSION}.,g" downloads/index.html
|
||
sed -i "s,<tbody>,<tbody>\n <tr>\n <td>${RELEASE_VERSION}</td>\n <td><a href=\"/downloads/i3-${RELEASE_VERSION}.tar.xz\">i3-${RELEASE_VERSION}.tar.xz</a></td>\n <td>$(LC_ALL=en_US.UTF-8 ls -lh ../i3/i3-${RELEASE_VERSION}.tar.xz | awk -F " " {'print $5'} | sed 's/K$/ KiB/g' | sed 's/M$/ MiB/g')</td>\n <td><a href=\"/downloads/i3-${RELEASE_VERSION}.tar.xz.asc\">signature</a></td>\n <td>$(date +'%Y-%m-%d')</td>\n <td><a href=\"/downloads/RELEASE-NOTES-${RELEASE_VERSION}.txt\">release notes</a></td>\n </tr>\n,g" downloads/index.html
|
||
|
||
git commit -a -m "add ${RELEASE_VERSION} release"
|
||
|
||
for i in $(find _docs -maxdepth 1 -and -type f -and \! -regex ".*\.\(html\|man\)$" -and \! -name "Makefile")
|
||
do
|
||
base="$(basename $i)"
|
||
[ -e "${TMPDIR}/i3/docs/${base}" ] && cp "${TMPDIR}/i3/docs/${base}" "_docs/${base}"
|
||
done
|
||
|
||
sed -i "s,Verify you are using i3 ≥ .*,Verify you are using i3 ≥ ${RELEASE_VERSION},g" _docs/debugging
|
||
|
||
(cd _docs && make)
|
||
|
||
for i in $(find _docs -maxdepth 1 -and -type f -and \! -regex ".*\.\(html\|man\)$" -and \! -name "Makefile")
|
||
do
|
||
base="$(basename $i)"
|
||
[ -e "${TMPDIR}/i3/docs/${base}" ] && cp "_docs/${base}.html" docs/
|
||
done
|
||
|
||
git commit -a -m "update docs for ${RELEASE_VERSION}"
|
||
|
||
git remote remove origin
|
||
git remote add origin git@github.com:i3/i3.github.io.git
|
||
git config --add remote.origin.push "+refs/heads/master:refs/heads/master"
|
||
|
||
################################################################################
|
||
# Section 4: prepare release announcement email
|
||
################################################################################
|
||
|
||
cd ${TMPDIR}
|
||
cat >email.txt <<EOT
|
||
From: Michael Stapelberg <michael@i3wm.org>
|
||
To: i3-announce@freelists.org
|
||
Subject: i3 v${RELEASE_VERSION} released
|
||
Content-Type: text/plain; charset=utf-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
Hi,
|
||
|
||
I just released i3 v${RELEASE_VERSION}. Release notes follow:
|
||
EOT
|
||
cat ${TMPDIR}/i3/RELEASE-NOTES-${RELEASE_VERSION} >>email.txt
|
||
|
||
################################################################################
|
||
# Section 5: final push instructions
|
||
################################################################################
|
||
|
||
echo "As a final sanity check, install the debian package and see whether i3 works."
|
||
|
||
echo "When satisfied, run:"
|
||
echo " cd ${TMPDIR}/i3"
|
||
echo " git checkout next"
|
||
echo " vi debian/changelog"
|
||
echo " git commit -a -m \"debian: update changelog\""
|
||
echo " git push"
|
||
echo ""
|
||
echo " cd ${TMPDIR}/i3.github.io"
|
||
echo " git push"
|
||
echo ""
|
||
echo " cd ${TMPDIR}/debian"
|
||
echo " dput"
|
||
echo ""
|
||
echo " cd ${TMPDIR}"
|
||
echo " sendmail -t < email.txt"
|
||
echo ""
|
||
echo "Update milestones on GitHub (only for new major versions):"
|
||
echo " Set due date of ${RELEASE_VERSION} to $(date +'%Y-%m-%d') and close the milestone"
|
||
echo " Create milestone for the next major version with unset due date"
|
||
echo ""
|
||
echo "Announce on:"
|
||
echo " twitter"
|
||
echo " google+"
|
||
echo " #i3 topic"
|
||
echo " reddit /r/i3wm"
|