119 lines
4.1 KiB
Bash
119 lines
4.1 KiB
Bash
#!/bin/bash
|
|
|
|
set -ex
|
|
|
|
install_ubuntu() {
|
|
echo "Preparing to build sccache from source"
|
|
apt-get update
|
|
# libssl-dev will not work as it is upgraded to libssl3 in Ubuntu-22.04.
|
|
# Instead use lib and headers from OpenSSL1.1 installed in `install_openssl.sh``
|
|
apt-get install -y cargo
|
|
echo "Checking out sccache repo"
|
|
git clone https://github.com/pytorch/sccache
|
|
cd sccache
|
|
echo "Building sccache"
|
|
cargo build --release
|
|
cp target/release/sccache /opt/cache/bin
|
|
echo "Cleaning up"
|
|
cd ..
|
|
rm -rf sccache
|
|
apt-get remove -y cargo rustc
|
|
apt-get autoclean && apt-get clean
|
|
}
|
|
|
|
install_binary() {
|
|
echo "Downloading sccache binary from S3 repo"
|
|
curl --retry 3 https://s3.amazonaws.com/ossci-linux/sccache -o /opt/cache/bin/sccache
|
|
}
|
|
|
|
mkdir -p /opt/cache/bin
|
|
mkdir -p /opt/cache/lib
|
|
sed -e 's|PATH="\(.*\)"|PATH="/opt/cache/bin:\1"|g' -i /etc/environment
|
|
export PATH="/opt/cache/bin:$PATH"
|
|
|
|
# Setup compiler cache
|
|
if [ -n "$ROCM_VERSION" ]; then
|
|
curl --retry 3 http://repo.radeon.com/misc/.sccache_amd/sccache -o /opt/cache/bin/sccache
|
|
else
|
|
ID=$(grep -oP '(?<=^ID=).+' /etc/os-release | tr -d '"')
|
|
# TODO: Install the pre-built binary from S3 as building from source
|
|
# https://github.com/pytorch/sccache has started failing mysteriously
|
|
# in which sccache server couldn't start with the following error:
|
|
# sccache: error: Invalid argument (os error 22)
|
|
install_binary
|
|
fi
|
|
chmod a+x /opt/cache/bin/sccache
|
|
|
|
function write_sccache_stub() {
|
|
# Unset LD_PRELOAD for ps because of asan + ps issues
|
|
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90589
|
|
printf "#!/bin/sh\nif [ \$(env -u LD_PRELOAD ps -p \$PPID -o comm=) != sccache ]; then\n exec sccache $(which $1) \"\$@\"\nelse\n exec $(which $1) \"\$@\"\nfi" > "/opt/cache/bin/$1"
|
|
chmod a+x "/opt/cache/bin/$1"
|
|
}
|
|
|
|
write_sccache_stub cc
|
|
write_sccache_stub c++
|
|
write_sccache_stub gcc
|
|
write_sccache_stub g++
|
|
|
|
# NOTE: See specific ROCM_VERSION case below.
|
|
if [ "x$ROCM_VERSION" = x ]; then
|
|
write_sccache_stub clang
|
|
write_sccache_stub clang++
|
|
fi
|
|
|
|
if [ -n "$CUDA_VERSION" ]; then
|
|
# TODO: This is a workaround for the fact that PyTorch's FindCUDA
|
|
# implementation cannot find nvcc if it is setup this way, because it
|
|
# appears to search for the nvcc in PATH, and use its path to infer
|
|
# where CUDA is installed. Instead, we install an nvcc symlink outside
|
|
# of the PATH, and set CUDA_NVCC_EXECUTABLE so that we make use of it.
|
|
|
|
write_sccache_stub nvcc
|
|
mv /opt/cache/bin/nvcc /opt/cache/lib/
|
|
fi
|
|
|
|
if [ -n "$ROCM_VERSION" ]; then
|
|
# ROCm compiler is hcc or clang. However, it is commonly invoked via hipcc wrapper.
|
|
# hipcc will call either hcc or clang using an absolute path starting with /opt/rocm,
|
|
# causing the /opt/cache/bin to be skipped. We must create the sccache wrappers
|
|
# directly under /opt/rocm while also preserving the original compiler names.
|
|
# Note symlinks will chain as follows: [hcc or clang++] -> clang -> clang-??
|
|
# Final link in symlink chain must point back to original directory.
|
|
|
|
# Original compiler is moved one directory deeper. Wrapper replaces it.
|
|
function write_sccache_stub_rocm() {
|
|
OLDCOMP=$1
|
|
COMPNAME=$(basename $OLDCOMP)
|
|
TOPDIR=$(dirname $OLDCOMP)
|
|
WRAPPED="$TOPDIR/original/$COMPNAME"
|
|
mv "$OLDCOMP" "$WRAPPED"
|
|
printf "#!/bin/sh\nexec sccache $WRAPPED \"\$@\"" > "$OLDCOMP"
|
|
chmod a+x "$OLDCOMP"
|
|
}
|
|
|
|
if [[ -e "/opt/rocm/hcc/bin/hcc" ]]; then
|
|
# ROCm 3.3 or earlier.
|
|
mkdir /opt/rocm/hcc/bin/original
|
|
write_sccache_stub_rocm /opt/rocm/hcc/bin/hcc
|
|
write_sccache_stub_rocm /opt/rocm/hcc/bin/clang
|
|
write_sccache_stub_rocm /opt/rocm/hcc/bin/clang++
|
|
# Fix last link in symlink chain, clang points to versioned clang in prior dir
|
|
pushd /opt/rocm/hcc/bin/original
|
|
ln -s ../$(readlink clang)
|
|
popd
|
|
elif [[ -e "/opt/rocm/llvm/bin/clang" ]]; then
|
|
# ROCm 3.5 and beyond.
|
|
mkdir /opt/rocm/llvm/bin/original
|
|
write_sccache_stub_rocm /opt/rocm/llvm/bin/clang
|
|
write_sccache_stub_rocm /opt/rocm/llvm/bin/clang++
|
|
# Fix last link in symlink chain, clang points to versioned clang in prior dir
|
|
pushd /opt/rocm/llvm/bin/original
|
|
ln -s ../$(readlink clang)
|
|
popd
|
|
else
|
|
echo "Cannot find ROCm compiler."
|
|
exit 1
|
|
fi
|
|
fi
|