| #!/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 |