1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00
llvm-mirror/utils/release/export.sh
Aaron Puchert 643761a9d5 Build reproducible tarballs for releases
Currently the tarballs contain superfluous metadata, like the user name
of the packager and via Pax headers even the PID of the tar process that
packaged the files. We build the monorepo projects directly from the git
repo using "git archive" and for the test-suite we add some flags as
recommended by https://reproducible-builds.org/docs/archives/. We don't
use numeric owners though to be compatible with "git archive".

The advantage of "git archive" is that the releaser doesn't have to
download the tar ball and extract it, rather the archive is built
directly from the repository. This is probably what GitHub uses
internally to produce the tarballs, so I wouldn't expect a difference.

Reviewed By: tstellar

Differential Revision: https://reviews.llvm.org/D91494
2020-11-22 20:51:58 +01:00

107 lines
2.9 KiB
Bash
Executable File

#!/bin/sh
#===-- tag.sh - Tag the LLVM release candidates ----------------------------===#
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
#===------------------------------------------------------------------------===#
#
# Create branches and release candidates for the LLVM release.
#
#===------------------------------------------------------------------------===#
set -e
projects="llvm clang compiler-rt libcxx libcxxabi libclc clang-tools-extra polly lldb lld openmp libunwind flang"
release=""
rc=""
usage() {
echo "Export the Git sources and build tarballs from them"
echo "usage: `basename $0`"
echo " "
echo " -release <num> The version number of the release"
echo " -rc <num> The release candidate number"
echo " -final The final tag"
}
export_sources() {
release_no_dot=`echo $release | sed -e 's,\.,,g'`
tag="llvmorg-$release"
if [ "$rc" = "final" ]; then
rc=""
else
tag="$tag-$rc"
fi
llvm_src_dir=$(readlink -f $(dirname "$(readlink -f "$0")")/../../..)
[ -d $llvm_src_dir/.git ] || ( echo "No git repository at $llvm_src_dir" ; exit 1 )
echo $tag
target_dir=$(pwd)
echo "Creating tarball for llvm-project ..."
pushd $llvm_src_dir/
git archive --prefix=llvm-project-$release$rc.src/ $tag . | xz >$target_dir/llvm-project-$release$rc.src.tar.xz
popd
if [ ! -d test-suite-$release$rc.src ]
then
echo "Fetching LLVM test-suite source ..."
mkdir -p test-suite-$release$rc.src
curl -L https://github.com/llvm/test-suite/archive/$tag.tar.gz | \
tar -C test-suite-$release$rc.src --strip-components=1 -xzf -
fi
echo "Creating tarball for test-suite ..."
tar --sort=name --owner=0 --group=0 \
--pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \
-cJf test-suite-$release$rc.src.tar.xz test-suite-$release$rc.src
for proj in $projects; do
echo "Creating tarball for $proj ..."
pushd $llvm_src_dir/$proj
git archive --prefix=$proj-$release$rc.src/ $tag . | xz >$target_dir/$proj-$release$rc.src.tar.xz
popd
done
}
while [ $# -gt 0 ]; do
case $1 in
-release | --release )
shift
release=$1
;;
-rc | --rc )
shift
rc="rc$1"
;;
-final | --final )
rc="final"
;;
-h | -help | --help )
usage
exit 0
;;
* )
echo "unknown option: $1"
usage
exit 1
;;
esac
shift
done
if [ "x$release" = "x" ]; then
echo "error: need to specify a release version"
exit 1
fi
# Make sure umask is not overly restrictive.
umask 0022
export_sources
exit 0