# $Id$ PNAME="rust" PVER="1.31.0" PBUILD="r2" SPLIT_PACKAGES="rust cargo rustfmt rust-rls rust-src rust-docs cargo-docs" 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.32.0" # provided pver of rls, see src/tools/rustfmt/Cargo.toml RUSTFMT_PVER="1.0.0" # provided pver of rls, see src/tools/rls/Cargo.toml RLS_PVER="1.31.6" # required pver of llvm and gcc GCC_PVER="8.2.0" LLVM_PVER="7.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}" SRC_DEPEND="" # both cargo and rust DOCS_DEPEND="" SDEPEND=">= sys-dev/llvm-${LLVM_PVER} >= sys-dev/clang-${LLVM_PVER} >= dev-lang/perl-5.28 >= 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} ${SRC_DEPEND} ${DOCS_DEPEND}" if [[ ${BOOTSTRAP} = 0 ]] then # see src/stage0.txt SDEPEND+=" >= dev-lang/rust-1.30 >= dev-lang/cargo-0.31" fi SRCFILE="${PNAME}c-${PVER}-src.tar.gz" SRCDIR="${BUILDDIR}/${PNAME}c-${PVER}-src" msetfeature "!check" sminclude mtools SRC_URI=( https://static.rust-lang.org/dist/${SRCFILE} mirror://${PNAME}/${SRCFILE} ) UP2SEPERATOR="\/" UP2DATE="updatecmd https://github.com/rust-lang/rust/releases | highesttarball gz" if [[ ${BOOTSTRAP} = 1 ]] then # see src/stage0.txt RUSTBIN_PVER="1.30.0" RUSTBIN_DATE="2018-10-25" 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.31.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}" } split_info_rust-src() { DESCRIPTION="Rust standard library sources." DEPEND="${SRC_DEPEND}" } split_info_rust-docs() { DESCRIPTION="HTML documentation for the Rust programming language." DEPEND="${DOCS_DEPEND}" } split_info_cargo-docs() { DESCRIPTION="HTML documentation for Cargo." DEPEND="== dev-lang/rust-docs-${PVER} ${DOCS_DEPEND}" } 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 # support multilib on x86_64 if [[ ${ARCH} = x86_64 ]] then cat <<- EOF >> ${SRCDIR}/config.toml target = ["${myRUSTCHOST}","i686-unknown-linux-gnu"] EOF fi 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 # honor multilib gcc setups if [[ ${ARCH} = x86_64 ]] then cat <<- EOF >> ${SRCDIR}/config.toml [target.i686-unknown-linux-gnu] llvm-config = "/usr/bin/llvm-config" EOF fi ## 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 # create missing 32-bit links on multilib systems if [[ ${ARCH} = x86_64 ]] then minstalldir /usr/lib || die for i in ${BINDIR}/usr/$(mlibdir)/rustlib/i686-unknown-linux-gnu/lib/*.so do mlink rustlib/i686-unknown-linux-gnu/lib/$(basename ${i}) /usr/lib/ || die done fi # 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/rust-src/usr/$(mlibdir)/rustlib || die install -d ${SRCDIR}/rust-split-packages/cargo-docs/usr/share/doc/${PNAME}-${PVER}/html || die install -d ${SRCDIR}/rust-split-packages/rust-docs/usr/share/doc/${PNAME}-${PVER} || 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/man/man1/cargo*.1 ${SRCDIR}/rust-split-packages/cargo/usr/share/man/man1/ || die mv ${BINDIR}/usr/$(mlibdir)/rustlib/src ${SRCDIR}/rust-split-packages/rust-src/usr/$(mlibdir)/rustlib/ || die # move cargo first, then the rest of the documentation mv ${BINDIR}/usr/share/doc/${PNAME}-${PVER}/html/cargo ${SRCDIR}/rust-split-packages/cargo-docs/usr/share/doc/${PNAME}-${PVER}/html/ || die mv ${BINDIR}/usr/share/doc/${PNAME}-${PVER}/html ${SRCDIR}/rust-split-packages/rust-docs/usr/share/doc/${PNAME}-${PVER}/ || 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 } src_install_rust-src() { install -d ${BINDIR} || die mv ${SRCDIR}/rust-split-packages/rust-src/* ${BINDIR}/ || die } src_install_rust-docs() { install -d ${BINDIR} || die mv ${SRCDIR}/rust-split-packages/rust-docs/* ${BINDIR}/ || die } src_install_cargo-docs() { install -d ${BINDIR} || die mv ${SRCDIR}/rust-split-packages/cargo-docs/* ${BINDIR}/ || die }