diff --git a/llvm/utils/release/export.sh b/llvm/utils/release/export.sh --- a/llvm/utils/release/export.sh +++ b/llvm/utils/release/export.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash #===-- tag.sh - Tag the LLVM release candidates ----------------------------===# # # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -17,18 +17,63 @@ release="" rc="" +yyyymmdd=$(date +'%Y%m%d') +snapshot="" + +indent() { + local indentSize=2 + local indent=1 + if [ -n "$1" ]; then indent=$1; fi + pr -to $(($indent * $indentSize)) +} usage() { - echo "Export the Git sources and build tarballs from them" - echo "usage: `basename $0`" - echo " " - echo " -release The version number of the release" - echo " -rc The release candidate number" - echo " -final The final tag" +cat <..] + [-rc|--rc ] + [-final|--final] + [-snapshot|--snapshot ] + +Flags: + + -release | --release .. The version number of the release + -rc | --rc The release candidate number + -final | --final When provided, this option will disable the rc flag + -snapshot | --snapshot (optional) Use to determine the release and don't export the test-suite files + +The following list shows the filenames (with ) for the artifacts and +hard links for each LLVM component created by this script. Notice, the hard links +are only created when you give --snapshot . + +$(\ + echo "$projects " \ + | sed 's/\([a-z-]\+\) /\1-.src.tar.xz \1-.src.tar.xz \n/g' \ + | column -t -o " <- "\ + | indent 2 + ) + +Additional files being generated: + + * llvm-project-.src.tar.xz (the complete LLVM source project) + * test-suite-.src.tar.xz (only when not using --snapshot) + +To ease the creation of snapshot builds, we also provide these files + + * llvm-release-.txt (contains the as a text) + * llvm-rc-.txt (contains the rc version passed to the invocation of $(basename $0)) + * llvm-git-revision-.txt (contains the current git revision sha1) + +Example values for the placeholders: + + * -> 13.0.0 + * -> 20210414 + * -> rc4 (will be empty when using --snapshot) +EOF } export_sources() { - release_no_dot=`echo $release | sed -e 's,\.,,g'` tag="llvmorg-$release" if [ "$rc" = "final" ]; then @@ -40,30 +85,56 @@ 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 + # Determine the release by fetching the version from LLVM's CMakeLists.txt. + [ -n "$snapshot" ] && release=$(grep -ioP 'set\(\s*LLVM_VERSION_(MAJOR|MINOR|PATCH)\s\K[0-9]+' $llvm_src_dir/llvm/CMakeLists.txt | paste -sd '.') + + 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/ - git archive --prefix=llvm-project-$release$rc.src/ $tag . | xz >$target_dir/llvm-project-$release$rc.src.tar.xz + 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*- and llvm-git*- 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/llvm-project-$release$rc.src.tar.xz + [ -n "$snapshot" ] && ln -fv $target_dir/llvm-project-$release$rc.src.tar.xz $target_dir/llvm-project-$yyyymmdd.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 - + 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 - 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 + git archive --prefix=$proj-$release$rc.src/ $tree_id . | xz >$target_dir/$proj-$release$rc.src.tar.xz + [ -n "$snapshot" ] && ln -fv $target_dir/$proj-$release$rc.src.tar.xz $target_dir/$proj-$yyyymmdd.src.tar.xz popd done } @@ -81,6 +152,10 @@ -final | --final ) rc="final" ;; + -snapshot | --snapshot ) + shift + snapshot="$1" + ;; -h | -help | --help ) usage exit 0 @@ -94,7 +169,12 @@ shift done -if [ "x$release" = "x" ]; then +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