diff --git a/Mk/Uses/cargo.mk b/Mk/Uses/cargo.mk index 1636f2da320f..a1508a9831aa 100644 --- a/Mk/Uses/cargo.mk +++ b/Mk/Uses/cargo.mk @@ -1,390 +1,391 @@ # This file contains logic to ease porting of Rust packages or # binaries using the `cargo` command. # # Feature: cargo # Usage: USES=cargo # Valid ARGS: none # # MAINTAINER: rust@FreeBSD.org .if !defined(_INCLUDE_USES_CARGO_MK) _INCLUDE_USES_CARGO_MK= yes .if !empty(cargo_ARGS) IGNORE+= USES=cargo takes no arguments .endif .sinclude "${MASTERDIR}/Makefile.crates" # List of static dependencies. The format is cratename-version. # CARGO_CRATES will be downloaded from MASTER_SITE_CRATESIO. CARGO_CRATES?= # List of features to build (space separated list). # Use special token --no-default-features to disable default # features by passing it to cargo build/install/test. CARGO_FEATURES?= # Name of the local directory for vendoring crates. CARGO_VENDOR_DIR?= ${WRKSRC}/cargo-crates # Default path for cargo manifest. CARGO_CARGOTOML?= ${WRKSRC}/Cargo.toml CARGO_CARGOLOCK?= ${WRKSRC}/Cargo.lock # Save crates inside ${DISTDIR}/rust/crates by default. CARGO_DIST_SUBDIR?= rust/crates # Generate list of DISTFILES. # Prefer canonical file extension .crate going forward .if make(makesum) CARGO_CRATE_EXT= .crate .else # If there is a rust/crates/*.tar.gz in distinfo keep using the old # extension. We need to delay eval until the last moment for # DISTINFO_FILE. We cache the command output to avoid multiple # slow grep runs for every CARGO_CRATE_EXT access. CARGO_CRATE_EXT= ${defined(_CARGO_CRATE_EXT_CACHE):?${_CARGO_CRATE_EXT_CACHE}:${:!if ${GREP} -q '\(${CARGO_DIST_SUBDIR}/.*\.tar\.gz\)' "${DISTINFO_FILE}" 2>/dev/null; then ${ECHO_CMD} .tar.gz; else ${ECHO_CMD} .crate; fi!:_=_CARGO_CRATE_EXT_CACHE}} .endif _CARGO_CRATES:= ${CARGO_CRATES:N*@git+*} _CARGO_GIT_SOURCES:= ${CARGO_CRATES:M*@git+*} # enumerate crates for unqiue and sane distfile group names _CARGO_CRATES:= ${empty(_CARGO_CRATES):?:${_CARGO_CRATES:range:@i@$i ${_CARGO_CRATES:[$i]}@}} # split up crates into (index, crate, name, version) 4-tuples _CARGO_CRATES:= ${_CARGO_CRATES:C/^([-_a-zA-Z0-9]+)-([0-9].*)/\0 \1 \2/} .for _index _crate _name _version in ${_CARGO_CRATES} # Resolving CRATESIO alias is very inefficient with many MASTER_SITES, consume MASTER_SITE_CRATESIO directly MASTER_SITES+= ${MASTER_SITE_CRATESIO:S,%SUBDIR%,${_name}/${_version},:S,$,:_cargo_${_index},} DISTFILES+= ${CARGO_DIST_SUBDIR}/${_crate}${CARGO_CRATE_EXT}:_cargo_${_index} # Provide pointer to the crate's extraction dir WRKSRC_crate_${_name}= ${CARGO_VENDOR_DIR}/${_crate} # ... also with version suffix in case of multiple versions of the # same crate WRKSRC_crate_${_crate}= ${CARGO_VENDOR_DIR}/${_crate} .endfor _CARGO_AWK= ${AWK} -vCP="${CP}" -vFIND="${FIND}" -vGREP="${GREP}" \ -vCARGO_VENDOR_DIR="${CARGO_VENDOR_DIR}" \ -vGIT_SOURCES="${_CARGO_GIT_SOURCES}" \ -vWRKDIR="${WRKDIR}" -vWRKSRC="${WRKSRC}" \ -f${SCRIPTSDIR}/split-url.awk \ -f${SCRIPTSDIR}/cargo-crates-git-common.awk -f .if !empty(_CARGO_GIT_SOURCES) . for _index _site _filename _wrksrc _crates in ${:!${_CARGO_AWK} ${SCRIPTSDIR}/cargo-crates-git-fetch.awk /dev/null!} MASTER_SITES+= ${_site}:_cargo_git${_index} DISTFILES+= ${_filename}:_cargo_git${_index} . for _crate in ${_crates:S/,/ /g} # Make sure the build dependencies checks below can work for git sourced crates too _CARGO_CRATES+= @git ${_crate} ${_crate} @git # Provide pointer to the crate's extraction dir # # This might not point to the actual crate's sources since a # single git source can contain multiple crates. We cannot collect # subdir information until after the full extraction is done and we # cannot set make variables at that point. This is better than # nothing. WRKSRC_crate_${_crate}= ${WRKDIR}/${_wrksrc} . endfor . endfor .endif # Build dependencies. CARGO_BUILDDEP?= yes .if ${CARGO_BUILDDEP:tl} == "yes" BUILD_DEPENDS+= ${RUST_DEFAULT}>=1.57.0:lang/${RUST_DEFAULT} .endif # Location of toolchain (default to lang/rust's toolchain) CARGO?= ${LOCALBASE}/bin/cargo RUSTC?= ${LOCALBASE}/bin/rustc RUSTDOC?= ${LOCALBASE}/bin/rustdoc # Location of the cargo output directory. CARGO_TARGET_DIR?= ${WRKDIR}/target # Default target platform (affects some RUSTFLAGS if passed) CARGO_BUILD_TARGET?= ${_CARGO_RUST_ARCH_${ARCH}:U${ARCH}}-unknown-${OPSYS:tl} _CARGO_RUST_ARCH_amd64= x86_64 _CARGO_RUST_ARCH_i386= i686 +_CARGO_RUST_ARCH_riscv64= riscv64gc # Environment for cargo # - CARGO_HOME: local cache of the registry index # - CARGO_BUILD_JOBS: configure number of jobs to run # - CARGO_TARGET_DIR: location of where to place all generated artifacts # - RUST_BACKTRACE: produce backtraces when something in the build panics # - RUSTC: path of rustc binary (default to lang/rust) # - RUSTDOC: path of rustdoc binary (default to lang/rust) # - RUSTFLAGS: custom flags to pass to all compiler invocations that Cargo performs CARGO_ENV+= \ CARGO_HOME=${WRKDIR}/cargo-home \ CARGO_BUILD_JOBS=${MAKE_JOBS_NUMBER} \ CARGO_BUILD_TARGET=${CARGO_BUILD_TARGET} \ CARGO_TARGET_DIR=${CARGO_TARGET_DIR} \ CARGO_TARGET_${CARGO_BUILD_TARGET:S/-/_/g:tu}_LINKER="${CC}" \ RUST_BACKTRACE=1 \ RUSTC=${RUSTC} \ RUSTDOC=${RUSTDOC} \ RUSTFLAGS="${RUSTFLAGS} ${LDFLAGS:C/.+/-C link-arg=&/}" # Adjust -C target-cpu if -march/-mcpu is set by bsd.cpu.mk .if ${ARCH} == amd64 || ${ARCH} == i386 RUSTFLAGS+= ${CFLAGS:M-march=*:S/-march=/-C target-cpu=/} .elif ${ARCH:Mpowerpc64*} RUSTFLAGS+= ${CFLAGS:M-mcpu=*:S/-mcpu=/-C target-cpu=/:S/power/pwr/} .else RUSTFLAGS+= ${CFLAGS:M-mcpu=*:S/-mcpu=/-C target-cpu=/} .endif .if defined(PPC_ABI) && ${PPC_ABI} == ELFv1 USE_GCC?= yes STRIP_CMD= ${LOCALBASE}/bin/strip # unsupported e_type with base strip .endif # Helper to shorten cargo calls. _CARGO_RUN= ${SETENV} ${MAKE_ENV} ${CARGO_ENV} ${CARGO} CARGO_CARGO_RUN= cd ${WRKSRC}; ${SETENV} CARGO_FREEBSD_PORTS_SKIP_GIT_UPDATE=1 ${_CARGO_RUN} # User arguments for cargo targets. CARGO_BUILD_ARGS?= CARGO_INSTALL_ARGS?= CARGO_INSTALL_PATH?= . CARGO_TEST_ARGS?= CARGO_UPDATE_ARGS?= # Use module targets ? CARGO_BUILD?= yes CARGO_CONFIGURE?= yes CARGO_INSTALL?= yes CARGO_TEST?= yes # rustc stashes intermediary files in TMPDIR (default /tmp) which # might cause issues for users that for some reason space limit # their /tmp. WRKDIR should have plenty of space. # Allow users and ports to still overwrite it. .if ${TMPDIR:U/tmp} == /tmp TMPDIR= ${WRKDIR} .endif # Manage crate features. .if !empty(CARGO_FEATURES:M--no-default-features) CARGO_BUILD_ARGS+= --no-default-features CARGO_INSTALL_ARGS+= --no-default-features CARGO_TEST_ARGS+= --no-default-features .endif .if !empty(CARGO_FEATURES:N--no-default-features) CARGO_BUILD_ARGS+= --features='${CARGO_FEATURES:N--no-default-features}' CARGO_INSTALL_ARGS+= --features='${CARGO_FEATURES:N--no-default-features}' CARGO_TEST_ARGS+= --features='${CARGO_FEATURES:N--no-default-features}' .endif .if !defined(WITH_DEBUG) CARGO_BUILD_ARGS+= --release CARGO_TEST_ARGS+= --release .else CARGO_INSTALL_ARGS+= --debug .endif .if ${_CARGO_CRATES:Mcmake} BUILD_DEPENDS+= cmake:devel/cmake .endif .if ${_CARGO_CRATES:Mgettext-sys} CARGO_ENV+= GETTEXT_BIN_DIR=${LOCALBASE}/bin \ GETTEXT_INCLUDE_DIR=${LOCALBASE}/include \ GETTEXT_LIB_DIR=${LOCALBASE}/lib .endif .if ${_CARGO_CRATES:Mjemalloc-sys} BUILD_DEPENDS+= gmake:devel/gmake .endif .if ${_CARGO_CRATES:Mlibgit2-sys} # Use the system's libgit2 instead of building the bundled version CARGO_ENV+= LIBGIT2_SYS_USE_PKG_CONFIG=1 .endif .if ${_CARGO_CRATES:Mlibssh2-sys} # Use the system's libssh2 instead of building the bundled version CARGO_ENV+= LIBSSH2_SYS_USE_PKG_CONFIG=1 .endif .if ${_CARGO_CRATES:Monig_sys} # onig_sys always prefers the system library but will try to link # statically with it. Since devel/oniguruma doesn't provide a static # library it'll link to libonig.so instead. Strictly speaking setting # RUSTONIG_SYSTEM_LIBONIG is not necessary, but will force onig_sys to # always use the system's libonig as returned by `pkg-config oniguruma`. CARGO_ENV+= RUSTONIG_SYSTEM_LIBONIG=1 .endif .if ${_CARGO_CRATES:Mopenssl-src} DEV_WARNING+= "Please make sure this port uses the system OpenSSL and consider removing CARGO_CRATES=${CARGO_CRATES:Mopenssl-src-[0-9]*} (a vendored copy of OpenSSL) from the build, e.g., by patching Cargo.toml appropriately." .endif .if ${_CARGO_CRATES:Mopenssl-sys} # Make sure that openssl-sys can find the correct version of OpenSSL CARGO_ENV+= OPENSSL_LIB_DIR=${OPENSSLLIB} \ OPENSSL_INCLUDE_DIR=${OPENSSLINC} .endif .if ${_CARGO_CRATES:Mpkg-config} .include "${USESDIR}/pkgconfig.mk" .endif .for _index _crate _name _version in ${_CARGO_CRATES} # Split up semantic version and try to sanitize it by removing # pre-release identifier (-) or build metadata (+) . if ${_version:S/./ /:S/./ /:C/[-+].*//:_:[#]} == 3 . for _major _minor _patch in $_ # FreeBSD 12.0 changed ABI: r318736 and r320043 # https://github.com/rust-lang/libc/commit/78f93220d70e # https://github.com/rust-lang/libc/commit/969ad2b73cdc . if ${_name} == libc && ${_major} == 0 && (${_minor} < 2 || (${_minor} == 2 && ${_patch} < 38)) DEV_ERROR+= "CARGO_CRATES=${_crate} may be unstable on FreeBSD 12.0. Consider updating to the latest version \(higher than 0.2.37\)." . endif . if ${_name} == libc && ${_major} == 0 && (${_minor} < 2 || (${_minor} == 2 && ${_patch} < 49)) DEV_ERROR+= "CARGO_CRATES=${_crate} may be unstable on aarch64 or not build on armv6, armv7, powerpc64. Consider updating to the latest version \(higher than 0.2.49\)." . endif # FreeBSD 12.0 updated base OpenSSL in r339270: # https://github.com/sfackler/rust-openssl/commit/276577553501 . if ${_name} == openssl && !exists(${PATCHDIR}/patch-openssl-1.1.1) && ${_major} == 0 && (${_minor} < 10 || (${_minor} == 10 && ${_patch} < 4)) DEV_WARNING+= "CARGO_CRATES=${_crate} does not support OpenSSL 1.1.1. Consider updating to the latest version \(higher than 0.10.3\)." . endif . endfor . endif .endfor _USES_extract+= 600:cargo-extract cargo-extract: # target for preparing crates directory. It will put all crates in # the local crates directory. @${ECHO_MSG} "===> Moving crates to ${CARGO_VENDOR_DIR}" @${MKDIR} ${CARGO_VENDOR_DIR} .for _index _crate _name _version in ${_CARGO_CRATES} . if ${_index} != @git @${MV} ${WRKDIR}/${_crate} ${CARGO_VENDOR_DIR}/${_crate} @${PRINTF} '{"package":"%s","files":{}}' \ $$(${SHA256} -q ${DISTDIR}/${CARGO_DIST_SUBDIR}/${_crate}${CARGO_CRATE_EXT}) \ > ${CARGO_VENDOR_DIR}/${_crate}/.cargo-checksum.json @if [ -r ${CARGO_VENDOR_DIR}/${_crate}/Cargo.toml.orig ]; then \ ${MV} ${CARGO_VENDOR_DIR}/${_crate}/Cargo.toml.orig \ ${CARGO_VENDOR_DIR}/${_crate}/Cargo.toml.orig-cargo; \ fi . endif .endfor .if ${CARGO_CONFIGURE:tl} == "yes" _USES_configure+= 250:cargo-configure # configure hook. Place a config file for overriding crates-io index # by local source directory. cargo-configure: # Check that the running kernel has COMPAT_FREEBSD11 required by lang/rust post-ino64 @${SETENV} CC="${CC}" OPSYS="${OPSYS}" OSVERSION="${OSVERSION}" WRKDIR="${WRKDIR}" \ ${SH} ${SCRIPTSDIR}/rust-compat11-canary.sh @${ECHO_MSG} "===> Cargo config:" @${MKDIR} ${WRKDIR}/.cargo @: > ${WRKDIR}/.cargo/config.toml @${ECHO_CMD} "[source.cargo]" >> ${WRKDIR}/.cargo/config.toml @${ECHO_CMD} "directory = '${CARGO_VENDOR_DIR}'" >> ${WRKDIR}/.cargo/config.toml @${ECHO_CMD} "[source.crates-io]" >> ${WRKDIR}/.cargo/config.toml @${ECHO_CMD} "replace-with = 'cargo'" >> ${WRKDIR}/.cargo/config.toml .if !empty(_CARGO_GIT_SOURCES) @${_CARGO_AWK} ${SCRIPTSDIR}/cargo-crates-git-configure.awk \ /dev/null >> ${WRKDIR}/.cargo/config.toml .endif @${CAT} ${WRKDIR}/.cargo/config.toml @if ! ${GREP} -qF '[profile.release]' ${CARGO_CARGOTOML}; then \ ${ECHO_CMD} "" >> ${CARGO_CARGOTOML}; \ ${ECHO_CMD} "[profile.release]" >> ${CARGO_CARGOTOML}; \ ${ECHO_CMD} "opt-level = 2" >> ${CARGO_CARGOTOML}; \ ${ECHO_CMD} "debug = false" >> ${CARGO_CARGOTOML}; \ fi @${ECHO_MSG} "===> Updating Cargo.lock" @${CARGO_CARGO_RUN} update \ --manifest-path ${CARGO_CARGOTOML} \ --verbose \ --verbose \ ${CARGO_UPDATE_ARGS} .endif .if !target(do-build) && ${CARGO_BUILD:tl} == "yes" do-build: @${CARGO_CARGO_RUN} build \ --manifest-path ${CARGO_CARGOTOML} \ --verbose \ --verbose \ ${CARGO_BUILD_ARGS} .endif .if !target(do-install) && ${CARGO_INSTALL:tl} == "yes" do-install: . for path in ${CARGO_INSTALL_PATH} @${CARGO_CARGO_RUN} install \ --no-track \ --path "${path}" \ --root "${STAGEDIR}${PREFIX}" \ --verbose \ --verbose \ ${CARGO_INSTALL_ARGS} . endfor .endif .if !target(do-test) && ${CARGO_TEST:tl} == "yes" do-test: @${CARGO_CARGO_RUN} test \ --manifest-path ${CARGO_CARGOTOML} \ --verbose \ --verbose \ ${CARGO_TEST_ARGS} .endif # # Helper targets for port maintainers # # cargo-crates will output the crates list from Cargo.lock. If there # is no Cargo.lock for some reason, try and generate it first. cargo-crates: cargo-crates-generate-lockfile @${_CARGO_AWK} ${SCRIPTSDIR}/cargo-crates.awk ${CARGO_CARGOLOCK} # cargo-crates-generate-lockfile will try to generate a Cargo.lock file # if it does not exist. cargo-crates-generate-lockfile: extract @if [ ! -r "${CARGO_CARGOLOCK}" ]; then \ ${ECHO_MSG} "===> ${CARGO_CARGOLOCK} not found. Trying to generate it..."; \ cd ${WRKSRC}; ${_CARGO_RUN} generate-lockfile \ --manifest-path ${CARGO_CARGOTOML} \ --verbose; \ fi # cargo-crates-licenses will try to grab license information from # all downloaded crates. cargo-crates-licenses: configure @${FIND} ${CARGO_VENDOR_DIR} -name 'Cargo.toml' -maxdepth 2 \ -exec ${GREP} -H '^license' {} \; \ | ${SED} \ -e 's@^${CARGO_VENDOR_DIR}/@@' \ -e 's@/Cargo.toml:license.*= *"@|@' \ -e 's@"$$@@g' | sort | /usr/bin/column -t -s '|' # cargo-crates-merge will in-place update CARGO_CRATES in the port # based on the crates list from Cargo.lock. If there is no Cargo.lock # for some reason, try and generate it first. cargo-crates-merge: cargo-crates-generate-lockfile @if ! type portedit > /dev/null 2>&1; then \ ${ECHO_MSG} "===> Please install \"ports-mgmt/portfmt\""; exit 1; \ fi @f="${MASTERDIR}/Makefile"; [ -r "${MASTERDIR}/Makefile.crates" ] && f="${MASTERDIR}/Makefile.crates"; \ ${_CARGO_AWK} ${SCRIPTSDIR}/cargo-crates.awk ${CARGO_CARGOLOCK} | \ portedit merge -i $$f; \ ${ECHO_MSG} "CARGO_CRATES in $$f was updated" .endif diff --git a/lang/rust-bootstrap/Makefile b/lang/rust-bootstrap/Makefile index 4dae6430264f..115fb7fe206c 100644 --- a/lang/rust-bootstrap/Makefile +++ b/lang/rust-bootstrap/Makefile @@ -1,165 +1,170 @@ # Once the bootstraps are available on pkg.FreeBSD.org run sync.sh # to upload them to ~/public_distfiles on freefall in preparation # for the next lang/rust update. PORTNAME= rust PORTVERSION= 1.57.0 CATEGORIES= lang MASTER_SITES= https://static.rust-lang.org/dist/ PKGNAMEPREFIX= ${FLAVOR:S/_/-/g}- PKGNAMESUFFIX= -bootstrap DISTNAME= ${PORTNAME}c-${PORTVERSION}-src DIST_SUBDIR= rust MAINTAINER= rust@FreeBSD.org COMMENT= Create bootstrap compilers for building lang/rust LICENSE= APACHE20 MIT LICENSE_COMB= dual LICENSE_FILE_APACHE20= ${WRKSRC}/LICENSE-APACHE LICENSE_FILE_MIT= ${WRKSRC}/LICENSE-MIT ONLY_FOR_ARCHS= amd64 powerpc64le ONLY_FOR_ARCHS_REASON= untested on other architectures BUILD_DEPENDS= ${FLAVOR:S/_/-/g}-freebsd-sysroot>=a2021.09.14:devel/freebsd-sysroot@${FLAVOR} \ cmake:devel/cmake \ gmake:devel/gmake \ rust>=${PORTVERSION}:lang/rust FLAVORS= aarch64 amd64 armv6 armv7 i386 powerpc64_elfv1 powerpc64_elfv2 \ - powerpc64le powerpc + powerpc64le powerpc riscv64 FLAVOR?= ${FLAVORS:[1]} USES= cpe ninja:build perl5 python:3.6+,build tar:xz CPE_VENDOR= ${PORTNAME}-lang .if ${FLAVOR} == powerpc64_elfv1 USE_GCC= 9:build .endif # for openssl-src crate USE_PERL5= build PATCHDIR= ${.CURDIR}/../rust/files # rustc stashes intermediary files in TMPDIR (default /tmp) which # might cause issues for users that for some reason space limit # their /tmp. WRKDIR should have plenty of space. # ?= to allow users to still overwrite it in make.conf. TMPDIR?= ${WRKDIR} # Resulting packages are not specific to amd64 NO_ARCH= yes _CARGO_VENDOR_DIR= ${WRKSRC}/vendor _RUST_ARCH_amd64= x86_64 _RUST_ARCH_i386= i686 _RUST_ARCH_powerpc64_elfv1= powerpc64 _RUST_ARCH_powerpc64_elfv2= powerpc64 +_RUST_ARCH_riscv64= riscv64gc _RUST_HOST= ${_RUST_ARCH_${ARCH}:U${ARCH}}-unknown-${OPSYS:tl} _RUST_TARGET= ${_RUST_ARCH_${FLAVOR}:U${FLAVOR}}-unknown-${OPSYS:tl} _RUST_LLVM_TARGET= ${_RUST_LLVM_TARGET_${FLAVOR}} _RUST_LLVM_TARGET_aarch64= AArch64 _RUST_LLVM_TARGET_amd64= X86 _RUST_LLVM_TARGET_armv6= ARM _RUST_LLVM_TARGET_armv7= ARM _RUST_LLVM_TARGET_i386= X86 _RUST_LLVM_TARGET_powerpc64_elfv1= PowerPC _RUST_LLVM_TARGET_powerpc64_elfv2= PowerPC _RUST_LLVM_TARGET_powerpc64le= PowerPC _RUST_LLVM_TARGET_powerpc= PowerPC +_RUST_LLVM_TARGET_riscv64= RISCV .include .if ${OPSYS} != FreeBSD IGNORE= is only for FreeBSD .endif -.if ${FLAVOR} == powerpc64le && ${OSVERSION} < 1300116 +.if (${FLAVOR} == powerpc64le || ${FLAVOR} == riscv64) && ${OSVERSION} < 1300116 IGNORE= will not build on 12.x due to old system .endif .if exists(${PATCHDIR}/${FLAVOR:S/_/-/}) EXTRA_PATCHES+= ${PATCHDIR}/${FLAVOR:S/_/-/} .endif post-patch: # Disable vendor checksums @${REINPLACE_CMD} 's,"files":{[^}]*},"files":{},' \ ${_CARGO_VENDOR_DIR}/*/.cargo-checksum.json .if ${FLAVOR} == powerpc64_elfv1 @${REINPLACE_CMD} -e 's,"c++","stdc++",g' \ ${WRKSRC}/compiler/rustc_llvm/build.rs @${REINPLACE_CMD} -e 's,%CC%,${CC},g' \ -e 's,%WRKDIR%,${LOCALBASE}/freebsd-sysroot/powerpc64-elfv1,g' \ ${WRKSRC}/compiler/rustc_llvm/build.rs \ ${WRKSRC}/src/bootstrap/native.rs .endif do-configure: # Check that the running kernel has COMPAT_FREEBSD11 required by lang/rust post-ino64 @${SETENV} CC="${CC}" OPSYS="${OPSYS}" OSVERSION="${OSVERSION}" WRKDIR="${WRKDIR}" \ ${SH} ${SCRIPTSDIR}/rust-compat11-canary.sh @${ECHO_CMD} 'changelog-seen=2' > ${WRKSRC}/config.toml @${ECHO_CMD} '[build]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'build-dir="${WRKDIR}/_build"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'vendor=true' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'extended=false' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'python="${PYTHON_CMD}"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'docs=false' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'verbose=2' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'cargo-native-static=true' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'cargo="${LOCALBASE}/bin/cargo"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'rustc="${LOCALBASE}/bin/rustc"' >> ${WRKSRC}/config.toml .if ${_RUST_HOST} != ${_RUST_TARGET} @${ECHO_CMD} 'host=["${_RUST_HOST}","${_RUST_TARGET}"]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'target=["${_RUST_TARGET}"]' >> ${WRKSRC}/config.toml .endif @${ECHO_CMD} '[rust]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'channel="stable"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'default-linker="${CC}"' >> ${WRKSRC}/config.toml +.if ${FLAVOR} == riscv64 + @${ECHO_CMD} 'debug=true' >> ${WRKSRC}/config.toml +.endif @${ECHO_CMD} 'deny-warnings=false' >> ${WRKSRC}/config.toml @${ECHO_CMD} '[llvm]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'link-shared=false' >> ${WRKSRC}/config.toml .if ${FLAVOR} == powerpc64_elfv1 @${ECHO_CMD} 'static-libstdcpp=true' >> ${WRKSRC}/config.toml .endif .if defined(WITH_CCACHE_BUILD) && !defined(NO_CCACHE) @${ECHO_CMD} 'ccache="${CCACHE_BIN}"' >> ${WRKSRC}/config.toml .else @${ECHO_CMD} 'ccache=false' >> ${WRKSRC}/config.toml .endif # https://github.com/rust-lang/rust/pull/72696#issuecomment-641517185 @${ECHO_CMD} 'ldflags="-lz"' >> ${WRKSRC}/config.toml # we need to make sure to always build llvm with host arch support to get a # host compiler that can build the host->target compiler @${ECHO_CMD} 'targets="${_RUST_LLVM_TARGET};${_RUST_LLVM_TARGET_${ARCH}}"' >> ${WRKSRC}/config.toml @${ECHO_CMD} '[target.${_RUST_TARGET}]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'cc="${LOCALBASE}/freebsd-sysroot/${FLAVOR:S/_/-/g}/bin/cc"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'cxx="${LOCALBASE}/freebsd-sysroot/${FLAVOR:S/_/-/g}/bin/c++"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'linker="${LOCALBASE}/freebsd-sysroot/${FLAVOR:S/_/-/g}/bin/cc"' >> ${WRKSRC}/config.toml .for _key _util in ar ${AR} ranlib ${RANLIB} @bin="$$(which ${_util})"; \ ${ECHO_CMD} "${_key}=\"$$bin\"" >> ${WRKSRC}/config.toml .endfor .if ${_RUST_HOST} != ${_RUST_TARGET} @${ECHO_CMD} '[target.${_RUST_HOST}]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'cc="${CC}"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'cxx="${CXX}"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'linker="${CC}"' >> ${WRKSRC}/config.toml .endif @${ECHO_CMD} '[dist]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'src-tarball=false' >> ${WRKSRC}/config.toml do-build: @cd ${WRKSRC} && \ ${SETENV} ${MAKE_ENV} ${PYTHON_CMD} x.py dist --jobs=${MAKE_JOBS_NUMBER} \ cargo src/librustc library/std do-install: @${MKDIR} ${STAGEDIR}${PREFIX}/rust-bootstrap/${FLAVOR} ${INSTALL_DATA} ${WRKDIR}/_build/dist/*-${_RUST_ARCH_${FLAVOR}:U${FLAVOR}}-unknown-${OPSYS:tl}${EXTRACT_SUFX} \ ${STAGEDIR}${PREFIX}/rust-bootstrap/${FLAVOR} .if ${FLAVOR:Mpowerpc64_*} @cd ${STAGEDIR}${PREFIX}/rust-bootstrap/${FLAVOR} && for f in *${EXTRACT_SUFX}; do \ ${MV} $$f $${f%%${EXTRACT_SUFX}}-${FLAVOR:S/_/ /:[2]}${EXTRACT_SUFX}; \ done .endif @cd ${STAGEDIR}${PREFIX} && \ ${FIND} rust-bootstrap -type f >> ${TMPPLIST} .include diff --git a/lang/rust/Makefile b/lang/rust/Makefile index 9b5f0cc0927f..ee8779c2f1e6 100644 --- a/lang/rust/Makefile +++ b/lang/rust/Makefile @@ -1,278 +1,281 @@ # Created by: Jyun-Yan You PORTNAME= rust PORTVERSION?= 1.57.0 PORTREVISION?= 0 CATEGORIES= lang MASTER_SITES= https://static.rust-lang.org/dist/:src \ https://dev-static.rust-lang.org/dist/:src \ LOCAL/tobik/rust:bootstrap \ LOCAL/mikael/rust:bootstrap \ https://static.rust-lang.org/dist/:bootstrap DISTNAME?= ${PORTNAME}c-${PORTVERSION}-src DISTFILES?= ${NIGHTLY_DATE:D${NIGHTLY_DATE}/}${DISTNAME}${EXTRACT_SUFX}:src \ ${_RUSTC_BOOTSTRAP}${BOOTSTRAPS_SUFFIX}${EXTRACT_SUFX}:bootstrap \ ${_RUST_STD_BOOTSTRAP}${BOOTSTRAPS_SUFFIX}${EXTRACT_SUFX}:bootstrap \ ${_CARGO_BOOTSTRAP}${BOOTSTRAPS_SUFFIX}${EXTRACT_SUFX}:bootstrap DIST_SUBDIR?= rust MAINTAINER= rust@FreeBSD.org COMMENT= Language with a focus on memory safety and concurrency LICENSE= APACHE20 MIT LICENSE_COMB= dual LICENSE_FILE_APACHE20= ${WRKSRC}/LICENSE-APACHE LICENSE_FILE_MIT= ${WRKSRC}/LICENSE-MIT IGNORE_FreeBSD_12_powerpc= is missing a bootstrap for FreeBSD 12.x powerpc ONLY_FOR_ARCHS?= aarch64 amd64 armv6 armv7 i386 powerpc64 powerpc64le \ - powerpc + powerpc riscv64 ONLY_FOR_ARCHS_REASON?= requires prebuilt bootstrap compiler BUILD_DEPENDS= cmake:devel/cmake LIB_DEPENDS= libcurl.so:ftp/curl USES= cpe ninja:build pkgconfig python:3.6+,build ssl tar:xz CPE_VENDOR= rust-lang MAKE_ENV= DESTDIR=${STAGEDIR} \ LIBGIT2_NO_PKG_CONFIG=1 \ OPENSSL_DIR="${OPENSSLBASE}" \ RUST_BACKTRACE=1 TEST_ENV= ${MAKE_ENV} \ ALLOW_NONZERO_RLIMIT_CORE=1 CONFLICTS_INSTALL?= rust-nightly # rustc stashes intermediary files in TMPDIR (default /tmp) which # might cause issues for users that for some reason space limit # their /tmp. WRKDIR should have plenty of space. # ?= to allow users to still overwrite it in make.conf. TMPDIR?= ${WRKDIR} OPTIONS_DEFINE= DOCS GDB SOURCES WASM OPTIONS_DEFAULT= SOURCES WASM OPTIONS_EXCLUDE_armv6= DOCS GDB_DESC= Install ports gdb (necessary for debugging rust programs) SOURCES_DESC= Install source files WASM_DESC= Build the WebAssembly target (wasm32-unknown-unknown) DOCS_VARS= _RUST_BUILD_DOCS=true DOCS_VARS_OFF= _RUST_BUILD_DOCS=false GDB_RUN_DEPENDS= ${LOCALBASE}/bin/gdb:devel/gdb SOURCES_VARS= _RUST_TOOLS+=src WASM_VARS= _RUST_BUILD_WASM=true \ _RUST_TARGETS+=wasm32-unknown-unknown WASM_VARS_OFF= _RUST_BUILD_WASM=false # See WRKSRC/src/stage0.json for the date and version values BOOTSTRAPS_DATE?= 2021-10-21 RUST_BOOTSTRAP_VERSION?= 1.56.0 +BOOTSTRAPS_DATE_riscv64= 2021-12-02 +RUST_BOOTSTRAP_VERSION_riscv64= 1.57.0 BOOTSTRAPS_SUFFIX?= ${BOOTSTRAPS_SUFFIX_${ARCH}} BOOTSTRAPS_SUFFIX_powerpc64?= -${PPC_ABI:tl} CARGO_VENDOR_DIR?= ${WRKSRC}/vendor # Rust's target arch string might be different from *BSD arch strings _RUST_ARCH_amd64= x86_64 _RUST_ARCH_i386= i686 +_RUST_ARCH_riscv64= riscv64gc _RUST_TARGET= ${_RUST_ARCH_${ARCH}:U${ARCH}}-unknown-${OPSYS:tl} _RUST_TARGETS= ${_RUST_TARGET} _RUST_TOOLS= analysis cargo clippy rustfmt _RUSTC_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/rustc-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${_RUST_TARGET} _RUST_STD_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/rust-std-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${_RUST_TARGET} _CARGO_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/cargo-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${_RUST_TARGET} .include .if ${OPSYS} != FreeBSD IGNORE= is only for FreeBSD .endif .if ${ARCH} == powerpc # bfd to link rustc_driver; lld currently can't BUILD_DEPENDS+= ld.bfd:devel/binutils .else # rls needs 64-bit atomics _RUST_TOOLS+= rls .endif .if exists(${PATCHDIR}/${ARCH}${BOOTSTRAPS_SUFFIX}) EXTRA_PATCHES+= ${PATCHDIR}/${ARCH}${BOOTSTRAPS_SUFFIX} .endif # If the kernel does not return sane kern.proc.pathname values # for hardlinks then disable hardlinks in the build to avoid # intermittent "can't find crate for `std`" build failures, # c.f. PR248184 # # XXX: Avoiding OSVERSION since it is derived from userland but # the running kernel might still be newer with sane behavior # anyway... .if exists(${PATCHDIR}/no-hardlinks) _KERN_OSRELDATE!= ${SYSCTL} -n kern.osreldate 2>/dev/null || echo 0 . if ${_KERN_OSRELDATE} >= 1400040 . elif ${_KERN_OSRELDATE} >= 1300521 . else EXTRA_PATCHES+= ${PATCHDIR}/no-hardlinks . endif .endif .if defined(PPC_ABI) && ${PPC_ABI} == ELFv1 # The bootstrap is hardcoded to use gcc9 # but we can build with a newer or older compiler as provided by USE_GCC=yes BUILD_DEPENDS+= gcc9:lang/gcc9 USE_GCC= yes STRIP_CMD= ${LOCALBASE}/bin/strip # unsupported e_type with base strip .endif .ifdef QEMU_EMULATING IGNORE= fails to build with qemu-user-static .endif .if make(makesum) DISTFILES:= ${DISTFILES:M*\:src} \ ${ONLY_FOR_ARCHS:O:@_arch@${:!${MAKE} ARCH=${_arch} PPC_ABI=ELFv1 -V'DISTFILES:N*\:src'!}@} \ ${ONLY_FOR_ARCHS:Mpowerpc64:@_arch@${:!${MAKE} ARCH=${_arch} PPC_ABI=ELFv2 -V'DISTFILES:N*\:src'!}@} .endif post-patch: @${REINPLACE_CMD} 's,gdb,${LOCALBASE}/bin/gdb,' ${WRKSRC}/src/etc/rust-gdb .if defined(NIGHTLY_DATE) @${REINPLACE_CMD} 's/"rustfmt"/"nothx"/' ${WRKSRC}/src/stage0.json .endif # Disable vendor checksums @${REINPLACE_CMD} 's,"files":{[^}]*},"files":{},' \ ${CARGO_VENDOR_DIR}/*/.cargo-checksum.json .if defined(PPC_ABI) && ${PPC_ABI} == ELFv1 @${REINPLACE_CMD} 's,%CC%,${CC},g' \ ${WRKSRC}/compiler/rustc_llvm/build.rs \ ${WRKSRC}/src/bootstrap/native.rs .if ${LOCALBASE} != /usr/local @${REINPLACE_CMD} 's,/usr/local/,${LOCALBASE}/,g' \ ${WRKSRC}/compiler/rustc_llvm/build.rs \ ${WRKSRC}/src/bootstrap/native.rs .endif .endif do-configure: # Check that the running kernel has COMPAT_FREEBSD11 required by lang/rust post-ino64 @${SETENV} CC="${CC}" OPSYS="${OPSYS}" OSVERSION="${OSVERSION}" WRKDIR="${WRKDIR}" \ ${SH} ${SCRIPTSDIR}/rust-compat11-canary.sh .for _component in cargo rust-std rustc @cd ${WRKDIR}/${_component}-*-${OPSYS:tl} && \ ${SH} install.sh --prefix=${WRKDIR}/bootstrap --verbose .endfor @${ECHO_CMD} 'changelog-seen=2' > ${WRKSRC}/config.toml @${ECHO_CMD} '[build]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'build-dir="${WRKDIR}/_build"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'build-stage=2' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'doc-stage=2' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'test-stage=2' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'vendor=true' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'extended=true' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'python="${PYTHON_CMD}"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'docs=${_RUST_BUILD_DOCS}' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'verbose=2' >> ${WRKSRC}/config.toml .if defined(NIGHTLY_DATE) @${ECHO_CMD} 'profiler=true' >> ${WRKSRC}/config.toml .endif @${ECHO_CMD} 'target=[${_RUST_TARGETS:@.target.@"${.target.}"@:ts,}]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'cargo="${WRKDIR}/bootstrap/bin/cargo"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'rustc="${WRKDIR}/bootstrap/bin/rustc"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'tools=[${_RUST_TOOLS:@.tool.@"${.tool.}"@:ts,}]' >> ${WRKSRC}/config.toml @${ECHO_CMD} '[install]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'prefix="${PREFIX}"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'sysconfdir="${PREFIX}/etc"' >> ${WRKSRC}/config.toml @${ECHO_CMD} '[rust]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'channel="${PKGNAMESUFFIX:Ustable:S/^-//}"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'default-linker="${CC}"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'deny-warnings=false' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'verbose-tests=true' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'lld=${_RUST_BUILD_WASM}' >> ${WRKSRC}/config.toml @${ECHO_CMD} '[llvm]' >> ${WRKSRC}/config.toml .if defined(WITH_CCACHE_BUILD) && !defined(NO_CCACHE) @${ECHO_CMD} 'ccache="${CCACHE_BIN}"' >> ${WRKSRC}/config.toml .else @${ECHO_CMD} 'ccache=false' >> ${WRKSRC}/config.toml .endif @${ECHO_CMD} 'ninja=true' >> ${WRKSRC}/config.toml .if ${ARCH} == powerpc # Rust doesn't call the system compiler with the full version of the target. # This makes powerpc miscompile due to the secure-plt ABI change. # Additionally, force using ld.bfd to work around a linking problem in rustc_mir @${PRINTF} '#!/bin/sh\nexec ${CC} "$$@" --target=powerpc-unknown-freebsd13.0' > ${WRKDIR}/cc-wrapper @${CHMOD} +x ${WRKDIR}/cc-wrapper @${PRINTF} '#!/bin/sh\nexec ${CXX} "$$@" --target=powerpc-unknown-freebsd13.0' > ${WRKDIR}/cxx-wrapper @${CHMOD} +x ${WRKDIR}/cxx-wrapper @${PRINTF} '#!/bin/sh\nexec ${CC} -fuse-ld=bfd "$$@" --target=powerpc-unknown-freebsd13.0' > ${WRKDIR}/ld-wrapper @${CHMOD} +x ${WRKDIR}/ld-wrapper .endif .for _target in ${_RUST_TARGETS} @${ECHO_CMD} '[target.${_target}]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'ar="${AR}"' >> ${WRKSRC}/config.toml .if ${ARCH} == powerpc @${ECHO_CMD} 'cc="${WRKDIR}/cc-wrapper"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'cxx="${WRKDIR}/cxx-wrapper"' >> ${WRKSRC}/config.toml .else @${ECHO_CMD} 'cc="${CC}"' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'cxx="${CXX}"' >> ${WRKSRC}/config.toml .endif .if ${ARCH} == powerpc @${ECHO_CMD} 'linker="${WRKDIR}/ld-wrapper"' >> ${WRKSRC}/config.toml .else @${ECHO_CMD} 'linker="${CC}"' >> ${WRKSRC}/config.toml .endif .endfor @${ECHO_CMD} '[dist]' >> ${WRKSRC}/config.toml @${ECHO_CMD} 'src-tarball=false' >> ${WRKSRC}/config.toml .if defined(NIGHTLY_DATE) # Don't abort if optional tools fail to build @${ECHO_CMD} 'missing-tools=true' >> ${WRKSRC}/config.toml .endif do-build: @cd ${WRKSRC} && \ ${SETENV} ${MAKE_ENV} ${PYTHON_CMD} x.py build --jobs=${MAKE_JOBS_NUMBER} do-install: @cd ${WRKSRC} && \ ${SETENV} ${MAKE_ENV} ${PYTHON_CMD} x.py install --jobs=${MAKE_JOBS_NUMBER} # We autogenerate the plist file. We do that, instead of the # regular pkg-plist, because several libraries have a computed # filename based on the absolute path of the source files. As it # is user-specific, we cannot know their filename in advance. @${RM} -r ${STAGEDIR}${DOCSDIR}/*.old \ ${STAGEDIR}${DOCSDIR}/html/.lock \ ${STAGEDIR}${DOCSDIR}/html/.stamp \ ${STAGEDIR}${PREFIX}/lib/rustlib/install.log \ ${STAGEDIR}${PREFIX}/lib/rustlib/manifest-* \ ${STAGEDIR}${PREFIX}/lib/rustlib/uninstall.sh @${FIND} ${STAGEDIR}${PREFIX}/bin ${STAGEDIR}${PREFIX}/lib \ ${STAGEDIR}${PREFIX}/libexec -exec ${FILE} -i {} + | \ ${AWK} -F: '/executable|sharedlib/ { print $$1 }' | ${XARGS} ${STRIP_CMD} @${FIND} ${STAGEDIR}${PREFIX} -not -type d | \ ${SED} -E -e 's,^${STAGEDIR}${PREFIX}/,,' \ -e 's,(share/man/man[1-9]/.*\.[0-9]),\1.gz,' >> ${TMPPLIST} post-install-DOCS-on: # Ignore any left behind empty directories in case some docs fail # to build (failures are ignored due to deny-warnings=false). @${FIND} ${STAGEDIR}${DOCSDIR}/html -empty -type d | \ ${SED} 's,^${STAGEDIR},@comment @dir ,' >> ${TMPPLIST} post-install-SOURCES-on: # Silence stage-qa warnings by sanitizing permissions on sources @${FIND} ${STAGEDIR}${PREFIX}/lib/rustlib/src -type f -exec ${CHMOD} \ ${SHAREMODE} {} + # Note that make test does not work when rust is already installed. do-test: @cd ${WRKSRC} && \ ${SETENV} ${TEST_ENV} ${PYTHON_CMD} x.py test --jobs=${MAKE_JOBS_NUMBER} .include diff --git a/lang/rust/distinfo b/lang/rust/distinfo index ec6a829367ad..c698f325589e 100644 --- a/lang/rust/distinfo +++ b/lang/rust/distinfo @@ -1,57 +1,63 @@ TIMESTAMP = 1638276823 SHA256 (rust/rustc-1.57.0-src.tar.xz) = fad07ea1daf9c6195c32e6e9c43ece4565c5f2f1de3c3771574790d6abbc9704 SIZE (rust/rustc-1.57.0-src.tar.xz) = 122681768 SHA256 (rust/2021-10-21/rustc-1.56.0-aarch64-unknown-freebsd.tar.xz) = 82a236e2d72daa16743df13f1099958b57551a4a8ed41eb4b59667caa777080a SIZE (rust/2021-10-21/rustc-1.56.0-aarch64-unknown-freebsd.tar.xz) = 47996592 SHA256 (rust/2021-10-21/rust-std-1.56.0-aarch64-unknown-freebsd.tar.xz) = 8820ad8aed80fcddde255b5fdf6eb7113c9a9e618f785238da0e06ffd56ff16d SIZE (rust/2021-10-21/rust-std-1.56.0-aarch64-unknown-freebsd.tar.xz) = 19678584 SHA256 (rust/2021-10-21/cargo-1.56.0-aarch64-unknown-freebsd.tar.xz) = 3d853f970f0b5eade8e8b3aa6eaba32d00eee08936dd6acd0cf4caae583a019c SIZE (rust/2021-10-21/cargo-1.56.0-aarch64-unknown-freebsd.tar.xz) = 4559904 SHA256 (rust/2021-10-21/rustc-1.56.0-x86_64-unknown-freebsd.tar.xz) = bc423830573a46d8cee0efd848da71be9b36115ecf34747da952fcd045f48047 SIZE (rust/2021-10-21/rustc-1.56.0-x86_64-unknown-freebsd.tar.xz) = 43726460 SHA256 (rust/2021-10-21/rust-std-1.56.0-x86_64-unknown-freebsd.tar.xz) = 47d9a983de22a43187d5bc1b1c14391590a50d3430b5ee6ab55a9d6baa23cd88 SIZE (rust/2021-10-21/rust-std-1.56.0-x86_64-unknown-freebsd.tar.xz) = 20550680 SHA256 (rust/2021-10-21/cargo-1.56.0-x86_64-unknown-freebsd.tar.xz) = 079ae609bd970eb387d3803a91e4fc6628722262cbc8f041a9e5b6848f6684e3 SIZE (rust/2021-10-21/cargo-1.56.0-x86_64-unknown-freebsd.tar.xz) = 5298904 SHA256 (rust/2021-10-21/rustc-1.56.0-armv6-unknown-freebsd.tar.xz) = ae0fc0c317cf7fc3d4efd2a3246e86704111019ef3f2ac62d054b0ae907f2822 SIZE (rust/2021-10-21/rustc-1.56.0-armv6-unknown-freebsd.tar.xz) = 48727792 SHA256 (rust/2021-10-21/rust-std-1.56.0-armv6-unknown-freebsd.tar.xz) = 71f14d1c93cd0c8cdc5e52fe0febae60fcadbe99ed32a80fb12cf73a25249704 SIZE (rust/2021-10-21/rust-std-1.56.0-armv6-unknown-freebsd.tar.xz) = 18669524 SHA256 (rust/2021-10-21/cargo-1.56.0-armv6-unknown-freebsd.tar.xz) = 75494c867ca1f2710edf6b5e43de04a861ffbc01aee7948870c028e5dfba5ca8 SIZE (rust/2021-10-21/cargo-1.56.0-armv6-unknown-freebsd.tar.xz) = 4705020 SHA256 (rust/2021-10-21/rustc-1.56.0-armv7-unknown-freebsd.tar.xz) = 40e174760b9a4360d28d2b3104516176dbb0e3c188c6628d1b2abe56d3cc8e03 SIZE (rust/2021-10-21/rustc-1.56.0-armv7-unknown-freebsd.tar.xz) = 48981152 SHA256 (rust/2021-10-21/rust-std-1.56.0-armv7-unknown-freebsd.tar.xz) = 3b09cfd7d392b6047ac1e9ffff065b3dc803e4afe8b6b41b96111d9f5f9b9ecf SIZE (rust/2021-10-21/rust-std-1.56.0-armv7-unknown-freebsd.tar.xz) = 19441136 SHA256 (rust/2021-10-21/cargo-1.56.0-armv7-unknown-freebsd.tar.xz) = 4f9b55eff84c6011fdcbffca2ebdbc939340a35f87f95ab1fa00f18a342a7679 SIZE (rust/2021-10-21/cargo-1.56.0-armv7-unknown-freebsd.tar.xz) = 4692220 SHA256 (rust/2021-10-21/rustc-1.56.0-i686-unknown-freebsd.tar.xz) = db1a697eced4bc65b36ddf590b8c0bb5b8c50a75032b7a3e088c8fe1b2c86c52 SIZE (rust/2021-10-21/rustc-1.56.0-i686-unknown-freebsd.tar.xz) = 52722604 SHA256 (rust/2021-10-21/rust-std-1.56.0-i686-unknown-freebsd.tar.xz) = f48e0b23e0979bc44db13b4470d65eb057c68f508af1df5e1f38497cc66e8e2f SIZE (rust/2021-10-21/rust-std-1.56.0-i686-unknown-freebsd.tar.xz) = 20434844 SHA256 (rust/2021-10-21/cargo-1.56.0-i686-unknown-freebsd.tar.xz) = 748b14fa68924216c7a08bebb2758933f923feabc4cabefb8356924ea4515aae SIZE (rust/2021-10-21/cargo-1.56.0-i686-unknown-freebsd.tar.xz) = 5438960 SHA256 (rust/2021-10-21/rustc-1.56.0-powerpc-unknown-freebsd.tar.xz) = 76638a9b16960288aea7efdea4249b96a931b2f93b88ad8b4614c046ebc41206 SIZE (rust/2021-10-21/rustc-1.56.0-powerpc-unknown-freebsd.tar.xz) = 49648024 SHA256 (rust/2021-10-21/rust-std-1.56.0-powerpc-unknown-freebsd.tar.xz) = d06ff829d0fbc05fe740f60d648f2768f6907b21747f8dfc3ca38b8dde5d55de SIZE (rust/2021-10-21/rust-std-1.56.0-powerpc-unknown-freebsd.tar.xz) = 18478484 SHA256 (rust/2021-10-21/cargo-1.56.0-powerpc-unknown-freebsd.tar.xz) = e4668521bc16b5b81b61280ff601f016185299cf4c74b07e1ea023704b7ef1f6 SIZE (rust/2021-10-21/cargo-1.56.0-powerpc-unknown-freebsd.tar.xz) = 5054048 SHA256 (rust/2021-10-21/rustc-1.56.0-powerpc64-unknown-freebsd-elfv1.tar.xz) = d5f6563c40110e0d5e63e1ce0fbd1a8522d4da80de8a04d56313cfde0f906a58 SIZE (rust/2021-10-21/rustc-1.56.0-powerpc64-unknown-freebsd-elfv1.tar.xz) = 58767712 SHA256 (rust/2021-10-21/rust-std-1.56.0-powerpc64-unknown-freebsd-elfv1.tar.xz) = f8f40ff0d3592766b95e66d048fe7724110970d5274281e72073ce3bd70411fb SIZE (rust/2021-10-21/rust-std-1.56.0-powerpc64-unknown-freebsd-elfv1.tar.xz) = 18692716 SHA256 (rust/2021-10-21/cargo-1.56.0-powerpc64-unknown-freebsd-elfv1.tar.xz) = a623c36df322e4dc5376821387c4121499cc799e933d04a45b934d4731d84b38 SIZE (rust/2021-10-21/cargo-1.56.0-powerpc64-unknown-freebsd-elfv1.tar.xz) = 5105400 SHA256 (rust/2021-10-21/rustc-1.56.0-powerpc64le-unknown-freebsd.tar.xz) = 7edfbf3c163742ca56401dcf44ad7d54ebe4dc8fae4b8c111b46e5583abde2bd SIZE (rust/2021-10-21/rustc-1.56.0-powerpc64le-unknown-freebsd.tar.xz) = 50451092 SHA256 (rust/2021-10-21/rust-std-1.56.0-powerpc64le-unknown-freebsd.tar.xz) = d713bb476500e87b9b1a4bc3f1caa7912d586727ad0a7b0792911358cb5efde0 SIZE (rust/2021-10-21/rust-std-1.56.0-powerpc64le-unknown-freebsd.tar.xz) = 18805860 SHA256 (rust/2021-10-21/cargo-1.56.0-powerpc64le-unknown-freebsd.tar.xz) = c29c558c07d09e56c0288d2c9528b63311072ca491a047b9588ea3320d1699bb SIZE (rust/2021-10-21/cargo-1.56.0-powerpc64le-unknown-freebsd.tar.xz) = 5046108 +SHA256 (rust/2021-12-02/rustc-1.57.0-riscv64gc-unknown-freebsd.tar.xz) = 7831ebf7d9b9c579d3e16e1b7b556a793d63a62f36636fba3b63ef2ed13c6872 +SIZE (rust/2021-12-02/rustc-1.57.0-riscv64gc-unknown-freebsd.tar.xz) = 141961976 +SHA256 (rust/2021-12-02/rust-std-1.57.0-riscv64gc-unknown-freebsd.tar.xz) = 3068b2f74537e5efcd293ebae7ce0e16bff92603cbc3ac5201ba3bb8e9ebe4ef +SIZE (rust/2021-12-02/rust-std-1.57.0-riscv64gc-unknown-freebsd.tar.xz) = 27221940 +SHA256 (rust/2021-12-02/cargo-1.57.0-riscv64gc-unknown-freebsd.tar.xz) = c88fb84cd53349fcac5516f79b88f8b23ebdcbac40408719a112ef095068a95d +SIZE (rust/2021-12-02/cargo-1.57.0-riscv64gc-unknown-freebsd.tar.xz) = 24413628 SHA256 (rust/2021-10-21/rustc-1.56.0-powerpc64-unknown-freebsd-elfv2.tar.xz) = b5f715c8b66e53ae3ef4a0dcd6fd70b033595316ded47c5b733c34408e8bf1e5 SIZE (rust/2021-10-21/rustc-1.56.0-powerpc64-unknown-freebsd-elfv2.tar.xz) = 48308540 SHA256 (rust/2021-10-21/rust-std-1.56.0-powerpc64-unknown-freebsd-elfv2.tar.xz) = 012200453f449bd1a5b7b43ccafe11fa6169b6bf3c009f5de689740a43bd39ec SIZE (rust/2021-10-21/rust-std-1.56.0-powerpc64-unknown-freebsd-elfv2.tar.xz) = 18631992 SHA256 (rust/2021-10-21/cargo-1.56.0-powerpc64-unknown-freebsd-elfv2.tar.xz) = b4d09cf715f0be1aa3a0d681e8e2f9de5d254422bb813bd5ed3a3d4df57823cd SIZE (rust/2021-10-21/cargo-1.56.0-powerpc64-unknown-freebsd-elfv2.tar.xz) = 4791156 diff --git a/lang/rust/files/riscv64/patch-compiler_rustc__llvm_build.rs b/lang/rust/files/riscv64/patch-compiler_rustc__llvm_build.rs new file mode 100644 index 000000000000..1786f3e285df --- /dev/null +++ b/lang/rust/files/riscv64/patch-compiler_rustc__llvm_build.rs @@ -0,0 +1,16 @@ +--- compiler/rustc_llvm/build.rs.orig 2021-11-29 19:27:11 UTC ++++ compiler/rustc_llvm/build.rs +@@ -276,8 +276,11 @@ fn main() { + "stdc++" + }; + +- // RISC-V requires libatomic for sub-word atomic operations +- if target.starts_with("riscv") { ++ // RISC-V GCC erroneously requires libatomic for sub-word ++ // atomic operations. FreeBSD uses Clang as its system ++ // compiler and provides no libatomic in its base system so ++ // does not want this. ++ if !target.contains("freebsd") && target.starts_with("riscv") { + println!("cargo:rustc-link-lib=atomic"); + } + diff --git a/lang/rust/files/riscv64/patch-compiler_rustc__target_src_spec_mod.rs b/lang/rust/files/riscv64/patch-compiler_rustc__target_src_spec_mod.rs new file mode 100644 index 000000000000..f08735462131 --- /dev/null +++ b/lang/rust/files/riscv64/patch-compiler_rustc__target_src_spec_mod.rs @@ -0,0 +1,10 @@ +--- compiler/rustc_target/src/spec/mod.rs.orig 2021-11-04 11:23:50 UTC ++++ compiler/rustc_target/src/spec/mod.rs +@@ -805,6 +805,7 @@ supported_targets! { + ("powerpc-unknown-freebsd", powerpc_unknown_freebsd), + ("powerpc64-unknown-freebsd", powerpc64_unknown_freebsd), + ("powerpc64le-unknown-freebsd", powerpc64le_unknown_freebsd), ++ ("riscv64gc-unknown-freebsd", riscv64gc_unknown_freebsd), + ("x86_64-unknown-freebsd", x86_64_unknown_freebsd), + + ("x86_64-unknown-dragonfly", x86_64_unknown_dragonfly), diff --git a/lang/rust/files/riscv64/patch-compiler_rustc__target_src_spec_riscv64gc__unknown__freebsd.rs b/lang/rust/files/riscv64/patch-compiler_rustc__target_src_spec_riscv64gc__unknown__freebsd.rs new file mode 100644 index 000000000000..9dcbb17ab3c0 --- /dev/null +++ b/lang/rust/files/riscv64/patch-compiler_rustc__target_src_spec_riscv64gc__unknown__freebsd.rs @@ -0,0 +1,21 @@ +--- compiler/rustc_target/src/spec/riscv64gc_unknown_freebsd.rs.orig 2021-11-04 11:22:10 UTC ++++ compiler/rustc_target/src/spec/riscv64gc_unknown_freebsd.rs +@@ -0,0 +1,18 @@ ++use crate::spec::{CodeModel, Target, TargetOptions}; ++ ++pub fn target() -> Target { ++ Target { ++ llvm_target: "riscv64-unknown-freebsd".to_string(), ++ pointer_width: 64, ++ data_layout: "e-m:e-p:64:64-i64:64-i128:128-n64-S128".to_string(), ++ arch: "riscv64".to_string(), ++ options: TargetOptions { ++ code_model: Some(CodeModel::Medium), ++ cpu: "generic-rv64".to_string(), ++ features: "+m,+a,+f,+d,+c".to_string(), ++ llvm_abiname: "lp64d".to_string(), ++ max_atomic_width: Some(64), ++ ..super::freebsd_base::opts() ++ }, ++ } ++} diff --git a/lang/rust/files/riscv64/patch-library_std_src_os_raw_mod.rs b/lang/rust/files/riscv64/patch-library_std_src_os_raw_mod.rs new file mode 100644 index 000000000000..e880f73fd205 --- /dev/null +++ b/lang/rust/files/riscv64/patch-library_std_src_os_raw_mod.rs @@ -0,0 +1,22 @@ +--- library/std/src/os/raw/mod.rs.orig 2021-11-05 15:16:50 UTC ++++ library/std/src/os/raw/mod.rs +@@ -68,7 +68,8 @@ type_alias! { "char.md", c_char = u8, NonZero_c_char = + target_arch = "aarch64", + target_arch = "arm", + target_arch = "powerpc", +- target_arch = "powerpc64" ++ target_arch = "powerpc64", ++ target_arch = "riscv64" + ) + ), + all( +@@ -110,7 +111,8 @@ type_alias! { "char.md", c_char = i8, NonZero_c_char = + target_arch = "aarch64", + target_arch = "arm", + target_arch = "powerpc", +- target_arch = "powerpc64" ++ target_arch = "powerpc64", ++ target_arch = "riscv64" + ) + ), + all( diff --git a/lang/rust/files/riscv64/patch-library_stdarch_crates_std__detect_src_detect_os_freebsd_auxvec.rs b/lang/rust/files/riscv64/patch-library_stdarch_crates_std__detect_src_detect_os_freebsd_auxvec.rs new file mode 100644 index 000000000000..d2df5bd0056f --- /dev/null +++ b/lang/rust/files/riscv64/patch-library_stdarch_crates_std__detect_src_detect_os_freebsd_auxvec.rs @@ -0,0 +1,12 @@ +--- library/stdarch/crates/std_detect/src/detect/os/freebsd/auxvec.rs.orig 2021-10-18 09:52:55 UTC ++++ library/stdarch/crates/std_detect/src/detect/os/freebsd/auxvec.rs +@@ -3,7 +3,8 @@ + any( + target_arch = "aarch64", + target_arch = "arm", +- target_arch = "powerpc64" ++ target_arch = "powerpc64", ++ target_arch = "riscv64" + ), + allow(dead_code) + )] diff --git a/lang/rust/files/riscv64/patch-src_bootstrap_bootstrap.py b/lang/rust/files/riscv64/patch-src_bootstrap_bootstrap.py new file mode 100644 index 000000000000..d384c0990ca5 --- /dev/null +++ b/lang/rust/files/riscv64/patch-src_bootstrap_bootstrap.py @@ -0,0 +1,11 @@ +--- src/bootstrap/bootstrap.py.orig 2021-11-11 14:21:03 UTC ++++ src/bootstrap/bootstrap.py +@@ -283,7 +283,7 @@ def default_build_triple(verbose): + err = "unknown OS type: {}".format(ostype) + sys.exit(err) + +- if cputype == 'powerpc' and ostype == 'unknown-freebsd': ++ if cputype in ['powerpc', 'riscv'] and ostype == 'unknown-freebsd': + cputype = subprocess.check_output( + ['uname', '-p']).strip().decode(default_encoding) + cputype_mapper = { diff --git a/lang/rust/files/riscv64/patch-src_bootstrap_native.rs b/lang/rust/files/riscv64/patch-src_bootstrap_native.rs new file mode 100644 index 000000000000..df56a7f09589 --- /dev/null +++ b/lang/rust/files/riscv64/patch-src_bootstrap_native.rs @@ -0,0 +1,20 @@ +--- src/bootstrap/native.rs.orig 2021-11-29 19:27:11 UTC ++++ src/bootstrap/native.rs +@@ -248,9 +248,14 @@ impl Step for Llvm { + } + } + +- if target.starts_with("riscv") { +- // In RISC-V, using C++ atomics require linking to `libatomic` but the LLVM build +- // system check cannot detect this. Therefore it is set manually here. ++ if !target.contains("freebsd") && target.starts_with("riscv") { ++ // RISC-V GCC erroneously requires linking against ++ // `libatomic` when using 1-byte and 2-byte C++ ++ // atomics but the LLVM build system check cannot ++ // detect this. Therefore it is set manually here. ++ // FreeBSD uses Clang as its system compiler and ++ // provides no libatomic in its base system so does ++ // not want this. + if !builder.config.llvm_tools_enabled { + cfg.define("CMAKE_EXE_LINKER_FLAGS", "-latomic"); + } else { diff --git a/lang/rust/files/riscv64/patch-src_doc_rustc_src_platform-support.md b/lang/rust/files/riscv64/patch-src_doc_rustc_src_platform-support.md new file mode 100644 index 000000000000..9f82379f9187 --- /dev/null +++ b/lang/rust/files/riscv64/patch-src_doc_rustc_src_platform-support.md @@ -0,0 +1,10 @@ +--- src/doc/rustc/src/platform-support.md.orig 2021-11-04 11:32:01 UTC ++++ src/doc/rustc/src/platform-support.md +@@ -261,6 +261,7 @@ target | std | host | notes + `riscv32gc-unknown-linux-gnu` | | | RISC-V Linux (kernel 5.4, glibc 2.33) + `riscv32gc-unknown-linux-musl` | | | RISC-V Linux (kernel 5.4, musl + RISCV32 support patches) + `riscv32imc-esp-espidf` | ✓ | | RISC-V ESP-IDF ++`riscv64gc-unknown-freebsd` | | | RISC-V FreeBSD + `riscv64gc-unknown-linux-musl` | | | RISC-V Linux (kernel 4.20, musl 1.2.0) + `s390x-unknown-linux-musl` | | | S390x Linux (kernel 2.6.32, MUSL) + `sparc-unknown-linux-gnu` | ✓ | | 32-bit SPARC Linux diff --git a/lang/rust/files/riscv64/patch-vendor_cc-1.0.69_src_lib.rs b/lang/rust/files/riscv64/patch-vendor_cc-1.0.69_src_lib.rs new file mode 100644 index 000000000000..be6399810851 --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_cc-1.0.69_src_lib.rs @@ -0,0 +1,12 @@ +--- vendor/cc-1.0.69/src/lib.rs.orig 2021-10-18 11:05:53 UTC ++++ vendor/cc-1.0.69/src/lib.rs +@@ -1700,6 +1700,9 @@ impl Build { + if target.contains("linux") && arch.starts_with("64") { + cmd.args.push(("-march=rv64gc").into()); + cmd.args.push("-mabi=lp64d".into()); ++ } else if target.contains("freebsd") && arch.starts_with("64") { ++ cmd.args.push(("-march=rv64gc").into()); ++ cmd.args.push("-mabi=lp64d".into()); + } else if target.contains("linux") && arch.starts_with("32") { + cmd.args.push(("-march=rv32gc").into()); + cmd.args.push("-mabi=ilp32d".into()); diff --git a/lang/rust/files/riscv64/patch-vendor_cc_src_lib.rs b/lang/rust/files/riscv64/patch-vendor_cc_src_lib.rs new file mode 100644 index 000000000000..1c2974574031 --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_cc_src_lib.rs @@ -0,0 +1,12 @@ +--- vendor/cc/src/lib.rs.orig 2021-10-18 11:05:53 UTC ++++ vendor/cc/src/lib.rs +@@ -1700,6 +1700,9 @@ impl Build { + if target.contains("linux") && arch.starts_with("64") { + cmd.args.push(("-march=rv64gc").into()); + cmd.args.push("-mabi=lp64d".into()); ++ } else if target.contains("freebsd") && arch.starts_with("64") { ++ cmd.args.push(("-march=rv64gc").into()); ++ cmd.args.push("-mabi=lp64d".into()); + } else if target.contains("linux") && arch.starts_with("32") { + cmd.args.push(("-march=rv32gc").into()); + cmd.args.push("-mabi=ilp32d".into()); diff --git a/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_freebsd11_mod.rs b/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_freebsd11_mod.rs new file mode 100644 index 000000000000..04aef529ce69 --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_freebsd11_mod.rs @@ -0,0 +1,12 @@ +--- vendor/libc-0.2.98/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs.orig 2021-11-29 20:27:33 UTC ++++ vendor/libc-0.2.98/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs +@@ -217,7 +217,8 @@ extern "C" { + + cfg_if! { + if #[cfg(any(target_arch = "x86_64", +- target_arch = "aarch64"))] { ++ target_arch = "aarch64", ++ target_arch = "riscv64"))] { + mod b64; + pub use self::b64::*; + } diff --git a/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_freebsd12_mod.rs b/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_freebsd12_mod.rs new file mode 100644 index 000000000000..e9a428f19c59 --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_freebsd12_mod.rs @@ -0,0 +1,12 @@ +--- vendor/libc-0.2.98/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs.orig 2021-11-29 20:27:33 UTC ++++ vendor/libc-0.2.98/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs +@@ -235,7 +235,8 @@ extern "C" { + + cfg_if! { + if #[cfg(any(target_arch = "x86_64", +- target_arch = "aarch64"))] { ++ target_arch = "aarch64", ++ target_arch = "riscv64"))] { + mod b64; + pub use self::b64::*; + } diff --git a/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_freebsd13_mod.rs b/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_freebsd13_mod.rs new file mode 100644 index 000000000000..fbfa6662aabb --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_freebsd13_mod.rs @@ -0,0 +1,12 @@ +--- vendor/libc-0.2.98/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs.orig 2021-11-29 20:27:33 UTC ++++ vendor/libc-0.2.98/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs +@@ -240,7 +240,8 @@ extern "C" { + + cfg_if! { + if #[cfg(any(target_arch = "x86_64", +- target_arch = "aarch64"))] { ++ target_arch = "aarch64", ++ target_arch = "riscv64"))] { + mod b64; + pub use self::b64::*; + } diff --git a/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_mod.rs b/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_mod.rs new file mode 100644 index 000000000000..864d0669534c --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_mod.rs @@ -0,0 +1,12 @@ +--- vendor/libc-0.2.98/src/unix/bsd/freebsdlike/freebsd/mod.rs.orig 2021-11-29 20:27:33 UTC ++++ vendor/libc-0.2.98/src/unix/bsd/freebsdlike/freebsd/mod.rs +@@ -1749,6 +1749,9 @@ cfg_if! { + } else if #[cfg(target_arch = "powerpc")] { + mod powerpc; + pub use self::powerpc::*; ++ } else if #[cfg(target_arch = "riscv64")] { ++ mod riscv64; ++ pub use self::riscv64::*; + } else { + // Unknown target_arch + } diff --git a/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_riscv64.rs b/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_riscv64.rs new file mode 100644 index 000000000000..d4fddf2844a2 --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_libc-0.2.98_src_unix_bsd_freebsdlike_freebsd_riscv64.rs @@ -0,0 +1,157 @@ +--- vendor/libc-0.2.98/src/unix/bsd/freebsdlike/freebsd/riscv64.rs.orig 2021-11-05 13:41:21 UTC ++++ vendor/libc-0.2.98/src/unix/bsd/freebsdlike/freebsd/riscv64.rs +@@ -0,0 +1,154 @@ ++pub type c_char = u8; ++pub type c_long = i64; ++pub type c_ulong = u64; ++pub type wchar_t = ::c_int; ++pub type time_t = i64; ++pub type suseconds_t = ::c_long; ++pub type register_t = i64; ++ ++// should be pub(crate), but that requires Rust 1.18.0 ++cfg_if! { ++ if #[cfg(libc_const_size_of)] { ++ #[doc(hidden)] ++ pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_longlong>() - 1; ++ } else { ++ #[doc(hidden)] ++ pub const _ALIGNBYTES: usize = 8 - 1; ++ } ++} ++ ++s_no_extra_traits! { ++ pub struct gpregs { ++ pub gp_ra: ::register_t, ++ pub gp_sp: ::register_t, ++ pub gp_gp: ::register_t, ++ pub gp_tp: ::register_t, ++ pub gp_t: [::register_t; 7], ++ pub gp_s: [::register_t; 12], ++ pub gp_a: [::register_t; 8], ++ pub gp_sepc: ::register_t, ++ pub gp_sstatus: ::register_t, ++ } ++ ++ pub struct fpregs { ++ pub fp_x: [[::register_t; 2]; 32], ++ pub fp_fcsr: ::register_t, ++ pub fp_flags: ::c_int, ++ pub fp_pad: ::c_int, ++ } ++ ++ pub struct mcontext_t { ++ pub mc_gpregs: gpregs, ++ pub mc_fpregs: fpregs, ++ pub mc_flags: ::c_int, ++ pub mc_pad: ::c_int, ++ pub mc_spare: [u64; 8], ++ } ++} ++ ++cfg_if! { ++ if #[cfg(feature = "extra_traits")] { ++ impl PartialEq for gpregs { ++ fn eq(&self, other: &gpregs) -> bool { ++ self.gp_ra == other.gp_ra && ++ self.gp_sp == other.gp_sp && ++ self.gp_gp == other.gp_gp && ++ self.gp_tp == other.gp_tp && ++ self.gp_t.iter().zip(other.gp_t.iter()).all(|(a, b)| a == b) && ++ self.gp_s.iter().zip(other.gp_s.iter()).all(|(a, b)| a == b) && ++ self.gp_a.iter().zip(other.gp_a.iter()).all(|(a, b)| a == b) && ++ self.gp_sepc == other.gp_sepc && ++ self.gp_sstatus == other.gp_sstatus ++ } ++ } ++ impl Eq for gpregs {} ++ impl ::fmt::Debug for gpregs { ++ fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ f.debug_struct("gpregs") ++ .field("gp_ra", &self.gp_ra) ++ .field("gp_sp", &self.gp_sp) ++ .field("gp_gp", &self.gp_gp) ++ .field("gp_tp", &self.gp_tp) ++ .field("gp_t", &self.gp_t) ++ .field("gp_s", &self.gp_s) ++ .field("gp_a", &self.gp_a) ++ .field("gp_sepc", &self.gp_sepc) ++ .field("gp_sstatus", &self.gp_sstatus) ++ .finish() ++ } ++ } ++ impl ::hash::Hash for gpregs { ++ fn hash(&self, state: &mut H) { ++ self.gp_ra.hash(state); ++ self.gp_sp.hash(state); ++ self.gp_gp.hash(state); ++ self.gp_tp.hash(state); ++ self.gp_t.hash(state); ++ self.gp_s.hash(state); ++ self.gp_a.hash(state); ++ self.gp_sepc.hash(state); ++ self.gp_sstatus.hash(state); ++ } ++ } ++ impl PartialEq for fpregs { ++ fn eq(&self, other: &fpregs) -> bool { ++ self.fp_x == other.fp_x && ++ self.fp_fcsr == other.fp_fcsr && ++ self.fp_flags == other.fp_flags && ++ self.fp_pad == other.fp_pad ++ } ++ } ++ impl Eq for fpregs {} ++ impl ::fmt::Debug for fpregs { ++ fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ f.debug_struct("fpregs") ++ .field("fp_x", &self.fp_x) ++ .field("fp_fcsr", &self.fp_fcsr) ++ .field("fp_flags", &self.fp_flags) ++ .field("fp_pad", &self.fp_pad) ++ .finish() ++ } ++ } ++ impl ::hash::Hash for fpregs { ++ fn hash(&self, state: &mut H) { ++ self.fp_x.hash(state); ++ self.fp_fcsr.hash(state); ++ self.fp_flags.hash(state); ++ self.fp_pad.hash(state); ++ } ++ } ++ impl PartialEq for mcontext_t { ++ fn eq(&self, other: &mcontext_t) -> bool { ++ self.mc_gpregs == other.mc_gpregs && ++ self.mc_fpregs == other.mc_fpregs && ++ self.mc_flags == other.mc_flags && ++ self.mc_pad == other.mc_pad && ++ self.mc_spare.iter().zip(other.mc_spare.iter()).all(|(a, b)| a == b) ++ } ++ } ++ impl Eq for mcontext_t {} ++ impl ::fmt::Debug for mcontext_t { ++ fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ f.debug_struct("mcontext_t") ++ .field("mc_gpregs", &self.mc_gpregs) ++ .field("mc_fpregs", &self.mc_fpregs) ++ .field("mc_flags", &self.mc_flags) ++ .field("mc_pad", &self.mc_pad) ++ .field("mc_spare", &self.mc_spare) ++ .finish() ++ } ++ } ++ impl ::hash::Hash for mcontext_t { ++ fn hash(&self, state: &mut H) { ++ self.mc_gpregs.hash(state); ++ self.mc_fpregs.hash(state); ++ self.mc_flags.hash(state); ++ self.mc_pad.hash(state); ++ self.mc_spare.hash(state); ++ } ++ } ++ } ++} ++ ++pub const MAP_32BIT: ::c_int = 0x00080000; ++pub const MINSIGSTKSZ: ::size_t = 4096; // 1024 * 4 diff --git a/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_freebsd11_mod.rs b/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_freebsd11_mod.rs new file mode 100644 index 000000000000..017c18db6f9c --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_freebsd11_mod.rs @@ -0,0 +1,12 @@ +--- vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs.orig 2021-11-29 20:27:33 UTC ++++ vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs +@@ -217,7 +217,8 @@ extern "C" { + + cfg_if! { + if #[cfg(any(target_arch = "x86_64", +- target_arch = "aarch64"))] { ++ target_arch = "aarch64", ++ target_arch = "riscv64"))] { + mod b64; + pub use self::b64::*; + } diff --git a/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_freebsd12_mod.rs b/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_freebsd12_mod.rs new file mode 100644 index 000000000000..599ba3d18247 --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_freebsd12_mod.rs @@ -0,0 +1,12 @@ +--- vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs.orig 2021-11-29 20:27:33 UTC ++++ vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs +@@ -241,7 +241,8 @@ extern "C" { + + cfg_if! { + if #[cfg(any(target_arch = "x86_64", +- target_arch = "aarch64"))] { ++ target_arch = "aarch64", ++ target_arch = "riscv64"))] { + mod b64; + pub use self::b64::*; + } diff --git a/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_freebsd13_mod.rs b/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_freebsd13_mod.rs new file mode 100644 index 000000000000..4098c94249cc --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_freebsd13_mod.rs @@ -0,0 +1,12 @@ +--- vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs.orig 2021-11-29 20:27:33 UTC ++++ vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs +@@ -271,7 +271,8 @@ extern "C" { + + cfg_if! { + if #[cfg(any(target_arch = "x86_64", +- target_arch = "aarch64"))] { ++ target_arch = "aarch64", ++ target_arch = "riscv64"))] { + mod b64; + pub use self::b64::*; + } diff --git a/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_mod.rs b/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_mod.rs new file mode 100644 index 000000000000..a99c851e9422 --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_mod.rs @@ -0,0 +1,12 @@ +--- vendor/libc/src/unix/bsd/freebsdlike/freebsd/mod.rs.orig 2021-11-29 20:27:33 UTC ++++ vendor/libc/src/unix/bsd/freebsdlike/freebsd/mod.rs +@@ -2021,6 +2021,9 @@ cfg_if! { + } else if #[cfg(target_arch = "powerpc")] { + mod powerpc; + pub use self::powerpc::*; ++ } else if #[cfg(target_arch = "riscv64")] { ++ mod riscv64; ++ pub use self::riscv64::*; + } else { + // Unknown target_arch + } diff --git a/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_riscv64.rs b/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_riscv64.rs new file mode 100644 index 000000000000..103a066a39af --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_libc_src_unix_bsd_freebsdlike_freebsd_riscv64.rs @@ -0,0 +1,157 @@ +--- vendor/libc/src/unix/bsd/freebsdlike/freebsd/riscv64.rs.orig 2021-11-05 13:41:21 UTC ++++ vendor/libc/src/unix/bsd/freebsdlike/freebsd/riscv64.rs +@@ -0,0 +1,154 @@ ++pub type c_char = u8; ++pub type c_long = i64; ++pub type c_ulong = u64; ++pub type wchar_t = ::c_int; ++pub type time_t = i64; ++pub type suseconds_t = ::c_long; ++pub type register_t = i64; ++ ++// should be pub(crate), but that requires Rust 1.18.0 ++cfg_if! { ++ if #[cfg(libc_const_size_of)] { ++ #[doc(hidden)] ++ pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_longlong>() - 1; ++ } else { ++ #[doc(hidden)] ++ pub const _ALIGNBYTES: usize = 8 - 1; ++ } ++} ++ ++s_no_extra_traits! { ++ pub struct gpregs { ++ pub gp_ra: ::register_t, ++ pub gp_sp: ::register_t, ++ pub gp_gp: ::register_t, ++ pub gp_tp: ::register_t, ++ pub gp_t: [::register_t; 7], ++ pub gp_s: [::register_t; 12], ++ pub gp_a: [::register_t; 8], ++ pub gp_sepc: ::register_t, ++ pub gp_sstatus: ::register_t, ++ } ++ ++ pub struct fpregs { ++ pub fp_x: [[::register_t; 2]; 32], ++ pub fp_fcsr: ::register_t, ++ pub fp_flags: ::c_int, ++ pub fp_pad: ::c_int, ++ } ++ ++ pub struct mcontext_t { ++ pub mc_gpregs: gpregs, ++ pub mc_fpregs: fpregs, ++ pub mc_flags: ::c_int, ++ pub mc_pad: ::c_int, ++ pub mc_spare: [u64; 8], ++ } ++} ++ ++cfg_if! { ++ if #[cfg(feature = "extra_traits")] { ++ impl PartialEq for gpregs { ++ fn eq(&self, other: &gpregs) -> bool { ++ self.gp_ra == other.gp_ra && ++ self.gp_sp == other.gp_sp && ++ self.gp_gp == other.gp_gp && ++ self.gp_tp == other.gp_tp && ++ self.gp_t.iter().zip(other.gp_t.iter()).all(|(a, b)| a == b) && ++ self.gp_s.iter().zip(other.gp_s.iter()).all(|(a, b)| a == b) && ++ self.gp_a.iter().zip(other.gp_a.iter()).all(|(a, b)| a == b) && ++ self.gp_sepc == other.gp_sepc && ++ self.gp_sstatus == other.gp_sstatus ++ } ++ } ++ impl Eq for gpregs {} ++ impl ::fmt::Debug for gpregs { ++ fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ f.debug_struct("gpregs") ++ .field("gp_ra", &self.gp_ra) ++ .field("gp_sp", &self.gp_sp) ++ .field("gp_gp", &self.gp_gp) ++ .field("gp_tp", &self.gp_tp) ++ .field("gp_t", &self.gp_t) ++ .field("gp_s", &self.gp_s) ++ .field("gp_a", &self.gp_a) ++ .field("gp_sepc", &self.gp_sepc) ++ .field("gp_sstatus", &self.gp_sstatus) ++ .finish() ++ } ++ } ++ impl ::hash::Hash for gpregs { ++ fn hash(&self, state: &mut H) { ++ self.gp_ra.hash(state); ++ self.gp_sp.hash(state); ++ self.gp_gp.hash(state); ++ self.gp_tp.hash(state); ++ self.gp_t.hash(state); ++ self.gp_s.hash(state); ++ self.gp_a.hash(state); ++ self.gp_sepc.hash(state); ++ self.gp_sstatus.hash(state); ++ } ++ } ++ impl PartialEq for fpregs { ++ fn eq(&self, other: &fpregs) -> bool { ++ self.fp_x == other.fp_x && ++ self.fp_fcsr == other.fp_fcsr && ++ self.fp_flags == other.fp_flags && ++ self.fp_pad == other.fp_pad ++ } ++ } ++ impl Eq for fpregs {} ++ impl ::fmt::Debug for fpregs { ++ fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ f.debug_struct("fpregs") ++ .field("fp_x", &self.fp_x) ++ .field("fp_fcsr", &self.fp_fcsr) ++ .field("fp_flags", &self.fp_flags) ++ .field("fp_pad", &self.fp_pad) ++ .finish() ++ } ++ } ++ impl ::hash::Hash for fpregs { ++ fn hash(&self, state: &mut H) { ++ self.fp_x.hash(state); ++ self.fp_fcsr.hash(state); ++ self.fp_flags.hash(state); ++ self.fp_pad.hash(state); ++ } ++ } ++ impl PartialEq for mcontext_t { ++ fn eq(&self, other: &mcontext_t) -> bool { ++ self.mc_gpregs == other.mc_gpregs && ++ self.mc_fpregs == other.mc_fpregs && ++ self.mc_flags == other.mc_flags && ++ self.mc_pad == other.mc_pad && ++ self.mc_spare.iter().zip(other.mc_spare.iter()).all(|(a, b)| a == b) ++ } ++ } ++ impl Eq for mcontext_t {} ++ impl ::fmt::Debug for mcontext_t { ++ fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ f.debug_struct("mcontext_t") ++ .field("mc_gpregs", &self.mc_gpregs) ++ .field("mc_fpregs", &self.mc_fpregs) ++ .field("mc_flags", &self.mc_flags) ++ .field("mc_pad", &self.mc_pad) ++ .field("mc_spare", &self.mc_spare) ++ .finish() ++ } ++ } ++ impl ::hash::Hash for mcontext_t { ++ fn hash(&self, state: &mut H) { ++ self.mc_gpregs.hash(state); ++ self.mc_fpregs.hash(state); ++ self.mc_flags.hash(state); ++ self.mc_pad.hash(state); ++ self.mc_spare.hash(state); ++ } ++ } ++ } ++} ++ ++pub const MAP_32BIT: ::c_int = 0x00080000; ++pub const MINSIGSTKSZ: ::size_t = 4096; // 1024 * 4 diff --git a/lang/rust/files/riscv64/patch-vendor_openssl-src_src_lib.rs b/lang/rust/files/riscv64/patch-vendor_openssl-src_src_lib.rs new file mode 100644 index 000000000000..3171b5769f1a --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_openssl-src_src_lib.rs @@ -0,0 +1,10 @@ +--- vendor/openssl-src/src/lib.rs.orig 2021-11-04 11:27:54 UTC ++++ vendor/openssl-src/src/lib.rs +@@ -260,6 +260,7 @@ impl Build { + "powerpc64le-unknown-freebsd" => "BSD-generic64", + "powerpc64le-unknown-linux-gnu" => "linux-ppc64le", + "powerpc64le-unknown-linux-musl" => "linux-ppc64le", ++ "riscv64gc-unknown-freebsd" => "BSD-generic64", + "riscv64gc-unknown-linux-gnu" => "linux-generic64", + "s390x-unknown-linux-gnu" => "linux64-s390x", + "s390x-unknown-linux-musl" => "linux64-s390x", diff --git a/lang/rust/files/riscv64/patch-vendor_rustc__ap__rustc__target_src_spec_mod.rs b/lang/rust/files/riscv64/patch-vendor_rustc__ap__rustc__target_src_spec_mod.rs new file mode 100644 index 000000000000..9e0858752a7f --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_rustc__ap__rustc__target_src_spec_mod.rs @@ -0,0 +1,9 @@ +--- vendor/rustc-ap-rustc_target/src/spec/mod.rs.orig 2021-11-04 11:23:50 UTC ++++ vendor/rustc-ap-rustc_target/src/spec/mod.rs +@@ -805,6 +805,7 @@ supported_targets! { + ("powerpc-unknown-freebsd", powerpc_unknown_freebsd), + ("powerpc64-unknown-freebsd", powerpc64_unknown_freebsd), ++ ("riscv64gc-unknown-freebsd", riscv64gc_unknown_freebsd), + ("x86_64-unknown-freebsd", x86_64_unknown_freebsd), + + ("x86_64-unknown-dragonfly", x86_64_unknown_dragonfly), diff --git a/lang/rust/files/riscv64/patch-vendor_rustc__ap__rustc__target_src_spec_riscv64gc__unknown__freebsd.rs b/lang/rust/files/riscv64/patch-vendor_rustc__ap__rustc__target_src_spec_riscv64gc__unknown__freebsd.rs new file mode 100644 index 000000000000..5faf5e2aacf8 --- /dev/null +++ b/lang/rust/files/riscv64/patch-vendor_rustc__ap__rustc__target_src_spec_riscv64gc__unknown__freebsd.rs @@ -0,0 +1,21 @@ +--- vendor/rustc-ap-rustc_target/src/spec/riscv64gc_unknown_freebsd.rs.orig 2021-11-04 11:22:10 UTC ++++ vendor/rustc-ap-rustc_target/src/spec/riscv64gc_unknown_freebsd.rs +@@ -0,0 +1,18 @@ ++use crate::spec::{CodeModel, Target, TargetOptions}; ++ ++pub fn target() -> Target { ++ Target { ++ llvm_target: "riscv64-unknown-freebsd".to_string(), ++ pointer_width: 64, ++ data_layout: "e-m:e-p:64:64-i64:64-i128:128-n64-S128".to_string(), ++ arch: "riscv64".to_string(), ++ options: TargetOptions { ++ code_model: Some(CodeModel::Medium), ++ cpu: "generic-rv64".to_string(), ++ features: "+m,+a,+f,+d,+c".to_string(), ++ llvm_abiname: "lp64d".to_string(), ++ max_atomic_width: Some(64), ++ ..super::freebsd_base::opts() ++ }, ++ } ++}