1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
|
#!/bin/bash
#===-- 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=""
yyyymmdd=$(date +'%Y%m%d')
snapshot=""
template='${PROJECT}-${RELEASE}${RC}.src.tar.xz'
usage() {
cat <<EOF
Export the Git sources and build tarballs from them.
Usage: $(basename $0) [-release|--release <major>.<minor>.<patch>]
[-rc|--rc <num>]
[-final|--final]
[-git-ref|--git-ref <git-ref>]
[-template|--template <template>]
Flags:
-release | --release <major>.<minor>.<patch> The version number of the release
-rc | --rc <num> The release candidate number
-final | --final When provided, this option will disable the rc flag
-git-ref | --git-ref <git-ref> (optional) Use <git-ref> to determine the release and don't export the test-suite files
-template | --template <template> (optional) Possible placeholders: \$PROJECT \$YYYYMMDD \$GIT_REF \$RELEASE \$RC.
Defaults to '${template}'.
The following list shows the filenames (with <placeholders>) for the artifacts
that are being generated (given that you don't touch --template).
$(echo "$projects "| sed 's/\([a-z-]\+\) / * \1-<RELEASE><RC>.src.tar.xz \n/g')
Additional files being generated:
* llvm-project-<RELEASE><RC>.src.tar.xz (the complete LLVM source project)
* test-suite-<RELEASE><RC>.src.tar.xz (only when not using --git-ref)
To ease the creation of snapshot builds, we also provide these files
* llvm-release-<YYYYMMDD>.txt (contains the <RELEASE> as a text)
* llvm-rc-<YYYYMMDD>.txt (contains the rc version passed to the invocation of $(basename $0))
* llvm-git-revision-<YYYYMMDD>.txt (contains the current git revision sha1)
Example values for the placeholders:
* <RELEASE> -> 13.0.0
* <YYYYMMDD> -> 20210414 (the date when executing this script)
* <RC> -> rc4 (will be empty when using --git-ref)
In order to generate snapshots of the upstream main branch you could do this for example:
$(basename $0) --git-ref upstream/main --template '\${PROJECT}-\${YYYYMMDD}.src.tar.xz'
EOF
}
template_file() {
export PROJECT=$1 YYYYMMDD=$yyyymmdd RC=$rc RELEASE=$release GIT_REF=$git_rev
basename $(echo $template | envsubst '$PROJECT $RELEASE $RC $YYYYMMDD $GIT_REF')
unset PROJECT YYYYMMDD RC RELEASE GIT_REF
}
export_sources() {
local tag="llvmorg-$release"
llvm_src_dir=$(readlink -f $(dirname "$(readlink -f "$0")")/../../..)
[ -d $llvm_src_dir/.git ] || ( echo "No git repository at $llvm_src_dir" ; exit 1 )
# Determine the release by fetching the version from LLVM's CMakeLists.txt
# in the specified git ref.
if [ -n "$snapshot" ]; then
release=$(git -C $llvm_src_dir show $snapshot:llvm/CMakeLists.txt | grep -ioP 'set\(\s*LLVM_VERSION_(MAJOR|MINOR|PATCH)\s\K[0-9]+' | paste -sd '.')
fi
tag="llvmorg-$release"
if [ "$rc" = "final" ]; then
rc=""
else
tag="$tag-$rc"
fi
target_dir=$(pwd)
echo "Creating tarball for llvm-project ..."
pushd $llvm_src_dir/
tree_id=$tag
[ -n "$snapshot" ] && tree_id="$snapshot"
echo "Tree ID to archive: $tree_id"
# This might be a surprise but a package like clang or compiler-rt don't
# know about the LLVM version itself. That's why we also export a the
# llvm-version*-<YYYYMMDD> and llvm-git*-<YYYYMMDD> files.
git_rev=$(git rev-parse $tree_id)
echo "git revision: $git_rev"
echo "$release" > $target_dir/llvm-release-$yyyymmdd.txt
echo "$rc" > $target_dir/llvm-rc-$yyyymmdd.txt
echo "$git_rev" > $target_dir/llvm-git-revision-$yyyymmdd.txt
git archive --prefix=llvm-project-$release$rc.src/ $tree_id . | xz >$target_dir/$(template_file llvm-project)
popd
if [ -z "$snapshot" ]; then
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
fi
# Package up top-level cmake directory so that we can append it to all projects.
tmp_dir=$(mktemp -d)
cmake_archive_file=$tmp_dir/cmake.tar
trap "rm -rv $tmp_dir" EXIT
pushd $llvm_src_dir
git archive -o $cmake_archive_file $tree_id cmake/
popd
for proj in $projects; do
echo "Creating tarball for $proj ..."
pushd $llvm_src_dir/$proj
tmp_archive_file=$tmp_dir/$proj.tar
git archive --prefix=$proj-$release$rc.src/ -o $tmp_archive_file $tree_id .
tar -Af $tmp_archive_file $cmake_archive_file
xz < $tmp_archive_file > $target_dir/$(template_file $proj)
popd
done
}
while [ $# -gt 0 ]; do
case $1 in
-release | --release )
shift
release=$1
;;
-rc | --rc )
shift
rc="rc$1"
;;
-final | --final )
rc="final"
;;
-git-ref | --git-ref )
shift
snapshot="$1"
;;
-template | --template )
shift
template="$1"
;;
-h | -help | --help )
usage
exit 0
;;
* )
echo "unknown option: $1"
usage
exit 1
;;
esac
shift
done
if [ -n "$snapshot" ]; then
if [[ "$rc" != "" || "$release" != "" ]]; then
echo "error: must not specify -rc or -release when creating a snapshot"
exit 1
fi
elif [ -z "$release" ]; 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
|