# $Id$ PNAME="rust" PVER="1.28.0" PBUILD="r1" SPLIT_PACKAGES="rust cargo rustfmt rust-rls" PCAT="dev-lang" DESCRIPTION="Systems programming language focused on safety, speed and concurrency." HOMEPAGE="https://www.rust-lang.org/" # enable bootstrap of rust with prebuild binary rust # 0=no, 1=yes BOOTSTRAP=1 # provided rust pver RUST_PVER="${PVER}" # provided pver of cargo, see src/tools/cargo/Cargo.toml CARGO_PVER="0.29.0" # provided pver of rls, see src/tools/rustfmt/Cargo.toml RUSTFMT_PVER="0.8.2" # provided pver of rls, see src/tools/rls/Cargo.toml RLS_PVER="0.128.0" # required pver of llvm and gcc GCC_PVER="8.2.0" LLVM_PVER="6.0.1" COMMON_DEPEND=">= net-misc/curl-7 >= dev-libs/openssl-1.1 >= sys-libs/zlib-1.2 >= net-libs/libssh2-1.8" RUST_DEPEND=">= sys-libs/llvm-libs-${LLVM_PVER} >= sys-libs/libstdc++-${GCC_PVER}" CARGO_DEPEND="${COMMON_DEPEND}" RUSTFMT_DEPEND=">= virtual/glibc >= sys-libs/libgcc-${GCC_PVER}" RUSTRLS_DEPEND="${COMMON_DEPEND}" SDEPEND=">= sys-dev/llvm-${LLVM_PVER} >= sys-dev/clang-${LLVM_PVER} >= dev-lang/perl-5.26 >= dev-lang/python-2.7 >= dev-libs/libffi-3.2 >= dev-libs/jemalloc-5.1 >= dev-util/cmake-3.12 >= dev-util/ninja-1.8 ${RUST_DEPEND} ${CARGO_DEPEND} ${RUSTFMT_DEPEND} ${RUSTRLS_DEPEND} >= net-misc/curl-dev-7 >= app-arch/xz-utils-dev-5 >= dev-libs/libffi-dev-3.2 >= dev-libs/jemalloc-dev-5.1 >= dev-libs/openssl-dev-1.1 >= net-libs/libssh2-dev-1.8 >= sys-libs/zlib-dev-1.2" if [[ ${BOOTSTRAP} = 0 ]] then # see src/stage0.txt SDEPEND+=" >= dev-lang/rust-1.27 >= dev-lang/cargo-0.28" fi SRCFILE="${PNAME}c-${PVER}-src.tar.gz" SRCDIR="${BUILDDIR}/${PNAME}c-${PVER}-src" msetfeature "!check" sminclude mbuild mtools SRC_URI=( https://static.rust-lang.org/dist/${SRCFILE} mirror://${PNAME}/${SRCFILE} ) UP2DATE="updatecmd https://www.rust-lang.org/en-US/other-installers.html | grep 'rustc-.*-src.*' | sed 's:-src::g' | highesttarball gz" if [[ ${BOOTSTRAP} = 1 ]] then # see src/stage0.txt RUSTBIN_PVER="1.27.2" RUSTBIN_DATE="2018-07-20" RUSTBIN_SRCFILE_x86_64="rustc-${RUSTBIN_PVER}-x86_64-unknown-linux-gnu.tar.gz" RUSTBIN_SRCFILE_x86="rustc-${RUSTBIN_PVER}-i686-unknown-linux-gnu.tar.gz" RUSTBIN_SRCFILE="$(marchsrcfile RUSTBIN_SRCFILE)" RUSTSTD_SRCFILE_x86_64="rust-std-${RUSTBIN_PVER}-x86_64-unknown-linux-gnu.tar.gz" RUSTSTD_SRCFILE_x86="rust-std-${RUSTBIN_PVER}-i686-unknown-linux-gnu.tar.gz" RUSTSTD_SRCFILE="$(marchsrcfile RUSTSTD_SRCFILE)" CARGOBIN_PVER="0.28.0" CARGOBIN_SRCFILE_x86_64="cargo-${CARGOBIN_PVER}-x86_64-unknown-linux-gnu.tar.gz" CARGOBIN_SRCFILE_x86="cargo-${CARGOBIN_PVER}-i686-unknown-linux-gnu.tar.gz" CARGOBIN_SRCFILE="$(marchsrcfile CARGOBIN_SRCFILE)" SRC_URI+=( https://static.rust-lang.org/dist/${RUSTBIN_DATE}/${RUSTBIN_SRCFILE_x86_64} https://static.rust-lang.org/dist/${RUSTBIN_DATE}/${RUSTBIN_SRCFILE_x86} https://static.rust-lang.org/dist/${RUSTBIN_DATE}/${RUSTSTD_SRCFILE_x86_64} https://static.rust-lang.org/dist/${RUSTBIN_DATE}/${RUSTSTD_SRCFILE_x86} https://static.rust-lang.org/dist/${RUSTBIN_DATE}/${CARGOBIN_SRCFILE_x86_64} https://static.rust-lang.org/dist/${RUSTBIN_DATE}/${CARGOBIN_SRCFILE_x86} ) fi split_info_rust() { DESCRIPTION="Systems programming language focused on safety, speed and concurrency." DEPEND="${RUST_DEPEND}" } split_info_cargo() { DESCRIPTION="Rust's package manager and build tool." DEPEND="== dev-lang/rust-${RUST_PVER} ${CARGO_DEPEND}" PCAT="dev-util" PVER="${CARGO_PVER}" } split_info_rustfmt() { DESCRIPTION="Tool to find and fix Rust formatting issues." DEPEND="== dev-lang/rust-${RUST_PVER} == dev-util/cargo-${CARGO_PVER} ${RUSTFMT_DEPEND}" PCAT="dev-util" PVER="${RUSTFMT_PVER}" } split_info_rust-rls() { DESCRIPTION="Rust Language Server for IDE integration." DEPEND="== dev-lang/rust-${RUST_PVER} ${RUSTRLS_DEPEND}" PCAT="dev-util" PVER="${RLS_PVER}" } src_prepare() { munpack ${SRCFILE} || die if [[ ${BOOTSTRAP} = 1 ]] then install -d ${SRCDIR}/build/cache/${RUSTBIN_DATE} || die ln -snf ${SOURCEDIR}/${PNAME}/${RUSTBIN_SRCFILE} ${SRCDIR}/build/cache/${RUSTBIN_DATE}/ || die ln -snf ${SOURCEDIR}/${PNAME}/${RUSTSTD_SRCFILE} ${SRCDIR}/build/cache/${RUSTBIN_DATE}/ || die ln -snf ${SOURCEDIR}/${PNAME}/${CARGOBIN_SRCFILE} ${SRCDIR}/build/cache/${RUSTBIN_DATE}/ || die fi } src_compile() { cd ${SRCDIR} local myARCH local myRUSTHOST myARCH="${ARCH}" [[ ${ARCH} = i*86 ]] && myARCH="i686" myRUSTCHOST="${myARCH}-unknown-linux-gnu" # create a custom build config cat <<- EOF > ${SRCDIR}/config.toml [llvm] # enable ninja ninja = true # prefer shared libraries link-shared = true [build] EOF if [[ ${BOOTSTRAP} = 0 ]] then # use local rust if no bootstrap was requested cat <<- EOF >> ${SRCDIR}/config.toml cargo = "/usr/bin/cargo" rustc = "/usr/bin/rustc" EOF fi cat <<- EOF >> ${SRCDIR}/config.toml submodules = false python = "python2" # build cargo too extended = true [install] prefix = "/usr" libdir = "$(mlibdir)" docdir = "share/doc/${PNAME}-${PVER}" mandir = "share/man" [rust] channel = "stable" rpath = false # disable codegen tests codegen-tests = false use-jemalloc = true # Work around https://github.com/rust-lang/rust/issues/51650 deny-warnings = false [target.${myRUSTCHOST}] llvm-config = "/usr/bin/llvm-config" EOF ## missing llvm link deps export RUSTFLAGS="$RUSTFLAGS -C link-args=-lffi" python2 ./x.py build --verbose || die } src_install_rust() { cd ${SRCDIR} DESTDIR=${BINDIR} python2 ./x.py install || die # remove unnecessary files mdelete /usr/$(mlibdir)/rustlib/components || die mdelete /usr/$(mlibdir)/rustlib/manifest-rustc || die mdelete /usr/$(mlibdir)/rustlib/rust-installer-version || die # overwrite duplicate solibs with symlinks to safe space local myARCH local myRUSTHOST myARCH="${ARCH}" [[ ${ARCH} = i*86 ]] && myARCH="i686" myRUSTCHOST="${myARCH}-unknown-linux-gnu" local i for i in ${BINDIR}/usr/$(mlibdir)/rustlib/${myRUSTCHOST}/lib/*.so do mlink rustlib/${myRUSTCHOST}/lib/$(basename ${i}) /usr/$(mlibdir)/ || die done # move split packages out of the way install -d ${SRCDIR}/rust-split-packages/rls/usr/bin || die install -d ${SRCDIR}/rust-split-packages/fmt/usr/bin || die install -d ${SRCDIR}/rust-split-packages/cargo/usr/bin || die install -d ${SRCDIR}/rust-split-packages/cargo/usr/share/man/man1 || die install -d ${SRCDIR}/rust-split-packages/cargo/usr/share/doc/${PNAME}-${PVER}/html || die mv ${BINDIR}/usr/bin/rls ${SRCDIR}/rust-split-packages/rls/usr/bin/ || die mv ${BINDIR}/usr/bin/cargo-fmt ${SRCDIR}/rust-split-packages/fmt/usr/bin/ || die mv ${BINDIR}/usr/bin/rustfmt ${SRCDIR}/rust-split-packages/fmt/usr/bin/ || die mv ${BINDIR}/usr/bin/cargo ${SRCDIR}/rust-split-packages/cargo/usr/bin/ || die mv ${BINDIR}/etc ${SRCDIR}/rust-split-packages/cargo/ || die mv ${BINDIR}/usr/share/doc/${PNAME}-${PVER}/html/cargo ${SRCDIR}/rust-split-packages/cargo/usr/share/doc/${PNAME}-${PVER}/html/ || die mv ${BINDIR}/usr/share/man/man1/cargo*.1 ${SRCDIR}/rust-split-packages/cargo/usr/share/man/man1/ || die minstalldocs COPYRIGHT LICENSE-* ChangeLog README* || die } src_install_cargo() { install -d ${BINDIR} || die mv ${SRCDIR}/rust-split-packages/cargo/* ${BINDIR}/ || die local docsubdir="src/tools/cargo" minstalldocs ${docsubdir}/COPYRIGHT* ${docsubdir}/CHANGELOG* ${docsubdir}/LICENSE* ${docsubdir}/README* || die } src_install_rustfmt() { install -d ${BINDIR} || die mv ${SRCDIR}/rust-split-packages/fmt/* ${BINDIR}/ || die local docsubdir="src/tools/rustfmt" minstalldocs ${docsubdir}/COPYRIGHT* ${docsubdir}/CHANGELOG* ${docsubdir}/LICENSE* ${docsubdir}/README* || die } src_install_rust-rls() { install -d ${BINDIR} || die mv ${SRCDIR}/rust-split-packages/rls/* ${BINDIR}/ || die local docsubdir="src/tools/rls" minstalldocs ${docsubdir}/COPYRIGHT* ${docsubdir}/CHANGELOG* ${docsubdir}/LICENSE* ${docsubdir}/README* || die }