diff --git a/.gitmodules b/.gitmodules index fc2f8bbc8a350..96e7b40cd196b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "src/llvm"] path = src/llvm - url = https://github.com/rust-lang/llvm.git - branch = master + url = https://github.com/dylanmckay/llvm.git + branch = avr-rust-llvm-release-6-0-0 [submodule "src/jemalloc"] path = src/jemalloc url = https://github.com/rust-lang/jemalloc.git diff --git a/.travis.yml b/.travis.yml index 280da05699506..7249af7ac0328 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,378 +1,32 @@ -language: shell +language: generic sudo: required -dist: trusty services: - docker +# LLVM takes awhile to check out and otherwise we'll manage the submodules in +# our configure script, so disable auto submodule management. git: - depth: 2 submodules: false - -matrix: - fast_finish: true - include: - # Images used in testing PR and try-build should be run first. - - env: IMAGE=x86_64-gnu-llvm-3.9 RUST_BACKTRACE=1 - if: type = pull_request OR branch = auto - - - env: IMAGE=dist-x86_64-linux DEPLOY=1 - if: branch = try OR branch = auto - - # "alternate" deployments, these are "nightlies" but have LLVM assertions - # turned on, they're deployed to a different location primarily for - # additional testing. - - env: IMAGE=dist-x86_64-linux DEPLOY_ALT=1 - if: branch = try OR branch = auto - - - env: > - RUST_CHECK_TARGET=dist - RUST_CONFIGURE_ARGS="--enable-extended --enable-profiler" - SRC=. - DEPLOY_ALT=1 - RUSTC_RETRY_LINKER_ON_SEGFAULT=1 - SCCACHE_ERROR_LOG=/tmp/sccache.log - MACOSX_DEPLOYMENT_TARGET=10.7 - NO_LLVM_ASSERTIONS=1 - NO_DEBUG_ASSERTIONS=1 - os: osx - osx_image: xcode7.3 - if: branch = auto - - # macOS builders. These are placed near the beginning because they are very - # slow to run. - - # OSX builders running tests, these run the full test suite. - # - # Note that the compiler is compiled to target 10.8 here because the Xcode - # version that we're using, 8.2, cannot compile LLVM for OSX 10.7. - - env: > - RUST_CHECK_TARGET=check - RUST_CONFIGURE_ARGS="--build=x86_64-apple-darwin --enable-sanitizers --enable-profiler" - SRC=. - RUSTC_RETRY_LINKER_ON_SEGFAULT=1 - SCCACHE_ERROR_LOG=/tmp/sccache.log - MACOSX_DEPLOYMENT_TARGET=10.8 - MACOSX_STD_DEPLOYMENT_TARGET=10.7 - NO_LLVM_ASSERTIONS=1 - NO_DEBUG_ASSERTIONS=1 - os: osx - osx_image: xcode9.2 - if: branch = auto - - - env: > - RUST_CHECK_TARGET=check - RUST_CONFIGURE_ARGS=--build=i686-apple-darwin - SRC=. - RUSTC_RETRY_LINKER_ON_SEGFAULT=1 - SCCACHE_ERROR_LOG=/tmp/sccache.log - MACOSX_DEPLOYMENT_TARGET=10.8 - MACOSX_STD_DEPLOYMENT_TARGET=10.7 - NO_LLVM_ASSERTIONS=1 - NO_DEBUG_ASSERTIONS=1 - os: osx - osx_image: xcode9.2 - if: branch = auto - - # OSX builders producing releases. These do not run the full test suite and - # just produce a bunch of artifacts. - # - # Note that these are running in the `xcode7` image instead of the - # `xcode8.2` image as above. That's because we want to build releases for - # OSX 10.7 and `xcode7` is the latest Xcode able to compile LLVM for 10.7. - - env: > - RUST_CHECK_TARGET=dist - RUST_CONFIGURE_ARGS="--build=i686-apple-darwin --enable-extended --enable-profiler --enable-emscripten" - SRC=. - DEPLOY=1 - RUSTC_RETRY_LINKER_ON_SEGFAULT=1 - SCCACHE_ERROR_LOG=/tmp/sccache.log - MACOSX_DEPLOYMENT_TARGET=10.7 - NO_LLVM_ASSERTIONS=1 - NO_DEBUG_ASSERTIONS=1 - os: osx - osx_image: xcode7.3 - if: branch = auto - - - env: > - RUST_CHECK_TARGET=dist - RUST_CONFIGURE_ARGS="--target=aarch64-apple-ios,armv7-apple-ios,armv7s-apple-ios,i386-apple-ios,x86_64-apple-ios --enable-extended --enable-sanitizers --enable-profiler --enable-emscripten" - SRC=. - DEPLOY=1 - RUSTC_RETRY_LINKER_ON_SEGFAULT=1 - SCCACHE_ERROR_LOG=/tmp/sccache.log - MACOSX_DEPLOYMENT_TARGET=10.7 - NO_LLVM_ASSERTIONS=1 - NO_DEBUG_ASSERTIONS=1 - os: osx - osx_image: xcode7.3 - if: branch = auto - - # Linux builders, remaining docker images - - env: IMAGE=arm-android - if: branch = auto - - env: IMAGE=armhf-gnu - if: branch = auto - - env: IMAGE=dist-various-1 DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-various-2 DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-aarch64-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-android DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-arm-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-armhf-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-armv7-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-i586-gnu-i586-i686-musl DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-i686-freebsd DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-i686-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-mips-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-mips64-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-mips64el-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-mipsel-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-powerpc-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-powerpc64-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-powerpc64le-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-s390x-linux DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-x86_64-freebsd DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-x86_64-musl DEPLOY=1 - if: branch = auto - - env: IMAGE=dist-x86_64-netbsd DEPLOY=1 - if: branch = auto - - env: IMAGE=asmjs - if: branch = auto - - env: IMAGE=i686-gnu - if: branch = auto - - env: IMAGE=i686-gnu-nopt - if: branch = auto - - env: IMAGE=wasm32-unknown - if: branch = auto - - env: IMAGE=x86_64-gnu - if: branch = auto - - env: IMAGE=x86_64-gnu-full-bootstrap - if: branch = auto - - env: IMAGE=x86_64-gnu-aux - if: branch = auto - - env: IMAGE=x86_64-gnu-tools - if: branch = auto - - env: IMAGE=x86_64-gnu-debug - if: branch = auto - - env: IMAGE=x86_64-gnu-nopt - if: branch = auto - - env: IMAGE=x86_64-gnu-distcheck - if: branch = auto - - env: IMAGE=x86_64-gnu-incremental - if: branch = auto - - - stage: publish toolstate - if: branch = master AND type = push - before_install: [] - install: [] - cache: false - sudo: false - script: - MESSAGE_FILE=$(mktemp -t msg.XXXXXX); - . src/ci/docker/x86_64-gnu-tools/repo.sh; - commit_toolstate_change "$MESSAGE_FILE" "$TRAVIS_BUILD_DIR/src/tools/publish_toolstate.py" "$(git rev-parse HEAD)" "$(git log --format=%s -n1 HEAD)" "$MESSAGE_FILE" + depth: 1 env: - global: - - SCCACHE_BUCKET=rust-lang-ci-sccache2 - - SCCACHE_REGION=us-west-1 - - AWS_ACCESS_KEY_ID=AKIAJAMV3QAMMA6AXHFQ - # AWS_SECRET_ACCESS_KEY=... - - secure: "j96XxTVOSUf4s4r4htIxn/fvIa5DWbMgLqWl7r8z2QfgUwscmkMXAwXuFNc7s7bGTpV/+CgDiMFFM6BAFLGKutytIF6oA02s9b+usQYnM0th7YQ2AIgm9GtMTJCJp4AoyfFmh8F2faUICBZlfVLUJ34udHEe35vOklix+0k4WDo=" - # TOOLSTATE_REPO_ACCESS_TOKEN=... - - secure: "cFh8thThqEJLC98XKI5pfqflUzOlxsYPRW20AWRaYOOgYHPTiGWypTXiPbGSKaeAXTZoOA+DpQtEmefc0U6lt9dHc7a/MIaK6isFurjlnKYiLOeTruzyu1z7PWCeZ/jKXsU2RK/88DBtlNwfMdaMIeuKj14IVfpepPPL71ETbuk=" + - CXX=/usr/bin/g++-4.7 RUST_BACKTRACE=1 before_install: - - zcat $HOME/docker/rust-ci.tar.gz | docker load || true - - mkdir -p $HOME/rustsrc - # FIXME(#46924): these two commands are required to enable IPv6, - # they shouldn't exist, please revert once more official solutions appeared. - # see https://github.com/travis-ci/travis-ci/issues/8891#issuecomment-353403729 - - if [ "$TRAVIS_OS_NAME" = linux ]; then - echo '{"ipv6":true,"fixed-cidr-v6":"fd9a:8454:6789:13f7::/64"}' | sudo tee /etc/docker/daemon.json; - sudo service docker restart; - fi - -install: - - case "$TRAVIS_OS_NAME" in - linux) - travis_retry curl -fo $HOME/stamp https://s3-us-west-1.amazonaws.com/rust-lang-ci2/rust-ci-mirror/2017-03-17-stamp-x86_64-unknown-linux-musl && - chmod +x $HOME/stamp && - export PATH=$PATH:$HOME - ;; - osx) - if [[ "$RUST_CHECK_TARGET" == dist ]]; then - travis_retry brew update && - travis_retry brew install xz; - fi && - travis_retry curl -fo /usr/local/bin/sccache https://s3-us-west-1.amazonaws.com/rust-lang-ci2/rust-ci-mirror/2017-05-12-sccache-x86_64-apple-darwin && - chmod +x /usr/local/bin/sccache && - travis_retry curl -fo /usr/local/bin/stamp https://s3-us-west-1.amazonaws.com/rust-lang-ci2/rust-ci-mirror/2017-03-17-stamp-x86_64-apple-darwin && - chmod +x /usr/local/bin/stamp - ;; - esac - -before_script: - - > - echo "#### Disk usage before running script:"; - df -h; - du . | sort -nr | head -n100 - - > - RUN_SCRIPT="src/ci/init_repo.sh . $HOME/rustsrc"; - if [ "$TRAVIS_OS_NAME" = "osx" ]; then - export RUN_SCRIPT="$RUN_SCRIPT && src/ci/run.sh"; - else - export RUN_SCRIPT="$RUN_SCRIPT && src/ci/docker/run.sh $IMAGE"; - fi + - docker build -t rust -f src/etc/Dockerfile src/etc -# Log time information from this machine and an external machine for insight into possible -# clock drift. Timezones don't matter since relative deltas give all the necessary info. script: - - > - date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true) - - stamp sh -x -c "$RUN_SCRIPT" - - > - date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true) - -after_success: - - > - echo "#### Build successful; Disk usage after running script:"; - df -h; - du . | sort -nr | head -n100 - -after_failure: - - > - echo "#### Build failed; Disk usage after running script:"; - df -h; - du . | sort -nr | head -n100 - - # One of these is the linux sccache log, one is the OSX sccache log. Instead - # of worrying about what system we are just cat both. One of these commands - # will fail but that's ok, they'll both get executed. - - cat obj/tmp/sccache.log - - cat /tmp/sccache.log - - # Random attempt at debugging currently. Just poking around in here to see if - # anything shows up. - - ls -lat $HOME/Library/Logs/DiagnosticReports/ - - find $HOME/Library/Logs/DiagnosticReports - -type f - -not -name '*.stage2-*.crash' - -not -name 'com.apple.CoreSimulator.CoreSimulatorService-*.crash' - -exec printf travis_fold":start:crashlog\n\033[31;1m%s\033[0m\n" {} \; - -exec head -750 {} \; - -exec echo travis_fold":"end:crashlog \; - - # attempt to debug anything killed by the oom killer on linux, just to see if - # it happened - - dmesg | grep -i kill - -# Save tagged docker images we created and load them if they're available -# Travis saves caches whether the build failed or not, nuke rustsrc if -# the failure was while updating it (as it may be in a bad state) -# https://github.com/travis-ci/travis-ci/issues/4472 -before_cache: - - docker history -q rust-ci | - grep -v missing | - xargs docker save | - gzip > $HOME/docker/rust-ci.tar.gz + - docker run -v `pwd`:/build rust + sh -c " + ./configure --enable-rustbuild --llvm-root=/usr/lib/llvm-3.7 --enable-quiet-tests && + make tidy && + make check -j4 + " + +# Real testing happens on http://buildbot.rust-lang.org/ +# +# See https://github.com/rust-lang/rust-buildbot +# CONTRIBUTING.md#pull-requests notifications: email: false - -cache: - directories: - - $HOME/docker - -before_deploy: - - mkdir -p deploy/$TRAVIS_COMMIT - - > - if [ "$TRAVIS_OS_NAME" == "osx" ]; then - rm -rf build/dist/doc && - cp -r build/dist/* deploy/$TRAVIS_COMMIT; - else - rm -rf obj/build/dist/doc && - cp -r obj/build/dist/* deploy/$TRAVIS_COMMIT; - fi - - travis_retry gem update --system - - ls -la deploy/$TRAVIS_COMMIT - -deploy: - - provider: s3 - bucket: rust-lang-ci2 - skip_cleanup: true - local_dir: deploy - upload_dir: rustc-builds - acl: public_read - region: us-west-1 - access_key_id: AKIAJVBODR3IA4O72THQ - secret_access_key: - secure: "kUGd3t7JcVWFESgIlzvsM8viZgCA9Encs3creW0xLJaLSeI1iVjlJK4h/2/nO6y224AFrh/GUfsNr4/4AlxPuYb8OU5oC5Lv+Ff2JiRDYtuNpyQSKAQp+bRYytWMtrmhja91h118Mbm90cUfcLPwkdiINgJNTXhPKg5Cqu3VYn0=" - on: - branch: auto - condition: $DEPLOY = 1 - - # this is the same as the above deployment provider except that it uploads to - # a slightly different directory and has a different trigger - - provider: s3 - bucket: rust-lang-ci2 - skip_cleanup: true - local_dir: deploy - upload_dir: rustc-builds-alt - acl: public_read - region: us-west-1 - access_key_id: AKIAJVBODR3IA4O72THQ - secret_access_key: - secure: "kUGd3t7JcVWFESgIlzvsM8viZgCA9Encs3creW0xLJaLSeI1iVjlJK4h/2/nO6y224AFrh/GUfsNr4/4AlxPuYb8OU5oC5Lv+Ff2JiRDYtuNpyQSKAQp+bRYytWMtrmhja91h118Mbm90cUfcLPwkdiINgJNTXhPKg5Cqu3VYn0=" - on: - branch: auto - condition: $DEPLOY_ALT = 1 - - # These two providers are the same as the two above, except deploy on the - # try branch. Travis does not appear to provide a way to use "or" in these - # conditions. - - provider: s3 - bucket: rust-lang-ci2 - skip_cleanup: true - local_dir: deploy - upload_dir: rustc-builds - acl: public_read - region: us-west-1 - access_key_id: AKIAJVBODR3IA4O72THQ - secret_access_key: - secure: "kUGd3t7JcVWFESgIlzvsM8viZgCA9Encs3creW0xLJaLSeI1iVjlJK4h/2/nO6y224AFrh/GUfsNr4/4AlxPuYb8OU5oC5Lv+Ff2JiRDYtuNpyQSKAQp+bRYytWMtrmhja91h118Mbm90cUfcLPwkdiINgJNTXhPKg5Cqu3VYn0=" - on: - branch: try - condition: $DEPLOY = 1 - - - provider: s3 - bucket: rust-lang-ci2 - skip_cleanup: true - local_dir: deploy - upload_dir: rustc-builds-alt - acl: public_read - region: us-west-1 - access_key_id: AKIAJVBODR3IA4O72THQ - secret_access_key: - secure: "kUGd3t7JcVWFESgIlzvsM8viZgCA9Encs3creW0xLJaLSeI1iVjlJK4h/2/nO6y224AFrh/GUfsNr4/4AlxPuYb8OU5oC5Lv+Ff2JiRDYtuNpyQSKAQp+bRYytWMtrmhja91h118Mbm90cUfcLPwkdiINgJNTXhPKg5Cqu3VYn0=" - on: - branch: try - condition: $DEPLOY_ALT = 1 diff --git a/.travis_rust.yml b/.travis_rust.yml new file mode 100644 index 0000000000000..280da05699506 --- /dev/null +++ b/.travis_rust.yml @@ -0,0 +1,378 @@ +language: shell +sudo: required +dist: trusty +services: + - docker + +git: + depth: 2 + submodules: false + +matrix: + fast_finish: true + include: + # Images used in testing PR and try-build should be run first. + - env: IMAGE=x86_64-gnu-llvm-3.9 RUST_BACKTRACE=1 + if: type = pull_request OR branch = auto + + - env: IMAGE=dist-x86_64-linux DEPLOY=1 + if: branch = try OR branch = auto + + # "alternate" deployments, these are "nightlies" but have LLVM assertions + # turned on, they're deployed to a different location primarily for + # additional testing. + - env: IMAGE=dist-x86_64-linux DEPLOY_ALT=1 + if: branch = try OR branch = auto + + - env: > + RUST_CHECK_TARGET=dist + RUST_CONFIGURE_ARGS="--enable-extended --enable-profiler" + SRC=. + DEPLOY_ALT=1 + RUSTC_RETRY_LINKER_ON_SEGFAULT=1 + SCCACHE_ERROR_LOG=/tmp/sccache.log + MACOSX_DEPLOYMENT_TARGET=10.7 + NO_LLVM_ASSERTIONS=1 + NO_DEBUG_ASSERTIONS=1 + os: osx + osx_image: xcode7.3 + if: branch = auto + + # macOS builders. These are placed near the beginning because they are very + # slow to run. + + # OSX builders running tests, these run the full test suite. + # + # Note that the compiler is compiled to target 10.8 here because the Xcode + # version that we're using, 8.2, cannot compile LLVM for OSX 10.7. + - env: > + RUST_CHECK_TARGET=check + RUST_CONFIGURE_ARGS="--build=x86_64-apple-darwin --enable-sanitizers --enable-profiler" + SRC=. + RUSTC_RETRY_LINKER_ON_SEGFAULT=1 + SCCACHE_ERROR_LOG=/tmp/sccache.log + MACOSX_DEPLOYMENT_TARGET=10.8 + MACOSX_STD_DEPLOYMENT_TARGET=10.7 + NO_LLVM_ASSERTIONS=1 + NO_DEBUG_ASSERTIONS=1 + os: osx + osx_image: xcode9.2 + if: branch = auto + + - env: > + RUST_CHECK_TARGET=check + RUST_CONFIGURE_ARGS=--build=i686-apple-darwin + SRC=. + RUSTC_RETRY_LINKER_ON_SEGFAULT=1 + SCCACHE_ERROR_LOG=/tmp/sccache.log + MACOSX_DEPLOYMENT_TARGET=10.8 + MACOSX_STD_DEPLOYMENT_TARGET=10.7 + NO_LLVM_ASSERTIONS=1 + NO_DEBUG_ASSERTIONS=1 + os: osx + osx_image: xcode9.2 + if: branch = auto + + # OSX builders producing releases. These do not run the full test suite and + # just produce a bunch of artifacts. + # + # Note that these are running in the `xcode7` image instead of the + # `xcode8.2` image as above. That's because we want to build releases for + # OSX 10.7 and `xcode7` is the latest Xcode able to compile LLVM for 10.7. + - env: > + RUST_CHECK_TARGET=dist + RUST_CONFIGURE_ARGS="--build=i686-apple-darwin --enable-extended --enable-profiler --enable-emscripten" + SRC=. + DEPLOY=1 + RUSTC_RETRY_LINKER_ON_SEGFAULT=1 + SCCACHE_ERROR_LOG=/tmp/sccache.log + MACOSX_DEPLOYMENT_TARGET=10.7 + NO_LLVM_ASSERTIONS=1 + NO_DEBUG_ASSERTIONS=1 + os: osx + osx_image: xcode7.3 + if: branch = auto + + - env: > + RUST_CHECK_TARGET=dist + RUST_CONFIGURE_ARGS="--target=aarch64-apple-ios,armv7-apple-ios,armv7s-apple-ios,i386-apple-ios,x86_64-apple-ios --enable-extended --enable-sanitizers --enable-profiler --enable-emscripten" + SRC=. + DEPLOY=1 + RUSTC_RETRY_LINKER_ON_SEGFAULT=1 + SCCACHE_ERROR_LOG=/tmp/sccache.log + MACOSX_DEPLOYMENT_TARGET=10.7 + NO_LLVM_ASSERTIONS=1 + NO_DEBUG_ASSERTIONS=1 + os: osx + osx_image: xcode7.3 + if: branch = auto + + # Linux builders, remaining docker images + - env: IMAGE=arm-android + if: branch = auto + - env: IMAGE=armhf-gnu + if: branch = auto + - env: IMAGE=dist-various-1 DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-various-2 DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-aarch64-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-android DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-arm-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-armhf-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-armv7-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-i586-gnu-i586-i686-musl DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-i686-freebsd DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-i686-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-mips-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-mips64-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-mips64el-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-mipsel-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-powerpc-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-powerpc64-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-powerpc64le-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-s390x-linux DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-x86_64-freebsd DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-x86_64-musl DEPLOY=1 + if: branch = auto + - env: IMAGE=dist-x86_64-netbsd DEPLOY=1 + if: branch = auto + - env: IMAGE=asmjs + if: branch = auto + - env: IMAGE=i686-gnu + if: branch = auto + - env: IMAGE=i686-gnu-nopt + if: branch = auto + - env: IMAGE=wasm32-unknown + if: branch = auto + - env: IMAGE=x86_64-gnu + if: branch = auto + - env: IMAGE=x86_64-gnu-full-bootstrap + if: branch = auto + - env: IMAGE=x86_64-gnu-aux + if: branch = auto + - env: IMAGE=x86_64-gnu-tools + if: branch = auto + - env: IMAGE=x86_64-gnu-debug + if: branch = auto + - env: IMAGE=x86_64-gnu-nopt + if: branch = auto + - env: IMAGE=x86_64-gnu-distcheck + if: branch = auto + - env: IMAGE=x86_64-gnu-incremental + if: branch = auto + + - stage: publish toolstate + if: branch = master AND type = push + before_install: [] + install: [] + cache: false + sudo: false + script: + MESSAGE_FILE=$(mktemp -t msg.XXXXXX); + . src/ci/docker/x86_64-gnu-tools/repo.sh; + commit_toolstate_change "$MESSAGE_FILE" "$TRAVIS_BUILD_DIR/src/tools/publish_toolstate.py" "$(git rev-parse HEAD)" "$(git log --format=%s -n1 HEAD)" "$MESSAGE_FILE" + +env: + global: + - SCCACHE_BUCKET=rust-lang-ci-sccache2 + - SCCACHE_REGION=us-west-1 + - AWS_ACCESS_KEY_ID=AKIAJAMV3QAMMA6AXHFQ + # AWS_SECRET_ACCESS_KEY=... + - secure: "j96XxTVOSUf4s4r4htIxn/fvIa5DWbMgLqWl7r8z2QfgUwscmkMXAwXuFNc7s7bGTpV/+CgDiMFFM6BAFLGKutytIF6oA02s9b+usQYnM0th7YQ2AIgm9GtMTJCJp4AoyfFmh8F2faUICBZlfVLUJ34udHEe35vOklix+0k4WDo=" + # TOOLSTATE_REPO_ACCESS_TOKEN=... + - secure: "cFh8thThqEJLC98XKI5pfqflUzOlxsYPRW20AWRaYOOgYHPTiGWypTXiPbGSKaeAXTZoOA+DpQtEmefc0U6lt9dHc7a/MIaK6isFurjlnKYiLOeTruzyu1z7PWCeZ/jKXsU2RK/88DBtlNwfMdaMIeuKj14IVfpepPPL71ETbuk=" + +before_install: + - zcat $HOME/docker/rust-ci.tar.gz | docker load || true + - mkdir -p $HOME/rustsrc + # FIXME(#46924): these two commands are required to enable IPv6, + # they shouldn't exist, please revert once more official solutions appeared. + # see https://github.com/travis-ci/travis-ci/issues/8891#issuecomment-353403729 + - if [ "$TRAVIS_OS_NAME" = linux ]; then + echo '{"ipv6":true,"fixed-cidr-v6":"fd9a:8454:6789:13f7::/64"}' | sudo tee /etc/docker/daemon.json; + sudo service docker restart; + fi + +install: + - case "$TRAVIS_OS_NAME" in + linux) + travis_retry curl -fo $HOME/stamp https://s3-us-west-1.amazonaws.com/rust-lang-ci2/rust-ci-mirror/2017-03-17-stamp-x86_64-unknown-linux-musl && + chmod +x $HOME/stamp && + export PATH=$PATH:$HOME + ;; + osx) + if [[ "$RUST_CHECK_TARGET" == dist ]]; then + travis_retry brew update && + travis_retry brew install xz; + fi && + travis_retry curl -fo /usr/local/bin/sccache https://s3-us-west-1.amazonaws.com/rust-lang-ci2/rust-ci-mirror/2017-05-12-sccache-x86_64-apple-darwin && + chmod +x /usr/local/bin/sccache && + travis_retry curl -fo /usr/local/bin/stamp https://s3-us-west-1.amazonaws.com/rust-lang-ci2/rust-ci-mirror/2017-03-17-stamp-x86_64-apple-darwin && + chmod +x /usr/local/bin/stamp + ;; + esac + +before_script: + - > + echo "#### Disk usage before running script:"; + df -h; + du . | sort -nr | head -n100 + - > + RUN_SCRIPT="src/ci/init_repo.sh . $HOME/rustsrc"; + if [ "$TRAVIS_OS_NAME" = "osx" ]; then + export RUN_SCRIPT="$RUN_SCRIPT && src/ci/run.sh"; + else + export RUN_SCRIPT="$RUN_SCRIPT && src/ci/docker/run.sh $IMAGE"; + fi + +# Log time information from this machine and an external machine for insight into possible +# clock drift. Timezones don't matter since relative deltas give all the necessary info. +script: + - > + date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true) + - stamp sh -x -c "$RUN_SCRIPT" + - > + date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true) + +after_success: + - > + echo "#### Build successful; Disk usage after running script:"; + df -h; + du . | sort -nr | head -n100 + +after_failure: + - > + echo "#### Build failed; Disk usage after running script:"; + df -h; + du . | sort -nr | head -n100 + + # One of these is the linux sccache log, one is the OSX sccache log. Instead + # of worrying about what system we are just cat both. One of these commands + # will fail but that's ok, they'll both get executed. + - cat obj/tmp/sccache.log + - cat /tmp/sccache.log + + # Random attempt at debugging currently. Just poking around in here to see if + # anything shows up. + - ls -lat $HOME/Library/Logs/DiagnosticReports/ + - find $HOME/Library/Logs/DiagnosticReports + -type f + -not -name '*.stage2-*.crash' + -not -name 'com.apple.CoreSimulator.CoreSimulatorService-*.crash' + -exec printf travis_fold":start:crashlog\n\033[31;1m%s\033[0m\n" {} \; + -exec head -750 {} \; + -exec echo travis_fold":"end:crashlog \; + + # attempt to debug anything killed by the oom killer on linux, just to see if + # it happened + - dmesg | grep -i kill + +# Save tagged docker images we created and load them if they're available +# Travis saves caches whether the build failed or not, nuke rustsrc if +# the failure was while updating it (as it may be in a bad state) +# https://github.com/travis-ci/travis-ci/issues/4472 +before_cache: + - docker history -q rust-ci | + grep -v missing | + xargs docker save | + gzip > $HOME/docker/rust-ci.tar.gz + +notifications: + email: false + +cache: + directories: + - $HOME/docker + +before_deploy: + - mkdir -p deploy/$TRAVIS_COMMIT + - > + if [ "$TRAVIS_OS_NAME" == "osx" ]; then + rm -rf build/dist/doc && + cp -r build/dist/* deploy/$TRAVIS_COMMIT; + else + rm -rf obj/build/dist/doc && + cp -r obj/build/dist/* deploy/$TRAVIS_COMMIT; + fi + - travis_retry gem update --system + - ls -la deploy/$TRAVIS_COMMIT + +deploy: + - provider: s3 + bucket: rust-lang-ci2 + skip_cleanup: true + local_dir: deploy + upload_dir: rustc-builds + acl: public_read + region: us-west-1 + access_key_id: AKIAJVBODR3IA4O72THQ + secret_access_key: + secure: "kUGd3t7JcVWFESgIlzvsM8viZgCA9Encs3creW0xLJaLSeI1iVjlJK4h/2/nO6y224AFrh/GUfsNr4/4AlxPuYb8OU5oC5Lv+Ff2JiRDYtuNpyQSKAQp+bRYytWMtrmhja91h118Mbm90cUfcLPwkdiINgJNTXhPKg5Cqu3VYn0=" + on: + branch: auto + condition: $DEPLOY = 1 + + # this is the same as the above deployment provider except that it uploads to + # a slightly different directory and has a different trigger + - provider: s3 + bucket: rust-lang-ci2 + skip_cleanup: true + local_dir: deploy + upload_dir: rustc-builds-alt + acl: public_read + region: us-west-1 + access_key_id: AKIAJVBODR3IA4O72THQ + secret_access_key: + secure: "kUGd3t7JcVWFESgIlzvsM8viZgCA9Encs3creW0xLJaLSeI1iVjlJK4h/2/nO6y224AFrh/GUfsNr4/4AlxPuYb8OU5oC5Lv+Ff2JiRDYtuNpyQSKAQp+bRYytWMtrmhja91h118Mbm90cUfcLPwkdiINgJNTXhPKg5Cqu3VYn0=" + on: + branch: auto + condition: $DEPLOY_ALT = 1 + + # These two providers are the same as the two above, except deploy on the + # try branch. Travis does not appear to provide a way to use "or" in these + # conditions. + - provider: s3 + bucket: rust-lang-ci2 + skip_cleanup: true + local_dir: deploy + upload_dir: rustc-builds + acl: public_read + region: us-west-1 + access_key_id: AKIAJVBODR3IA4O72THQ + secret_access_key: + secure: "kUGd3t7JcVWFESgIlzvsM8viZgCA9Encs3creW0xLJaLSeI1iVjlJK4h/2/nO6y224AFrh/GUfsNr4/4AlxPuYb8OU5oC5Lv+Ff2JiRDYtuNpyQSKAQp+bRYytWMtrmhja91h118Mbm90cUfcLPwkdiINgJNTXhPKg5Cqu3VYn0=" + on: + branch: try + condition: $DEPLOY = 1 + + - provider: s3 + bucket: rust-lang-ci2 + skip_cleanup: true + local_dir: deploy + upload_dir: rustc-builds-alt + acl: public_read + region: us-west-1 + access_key_id: AKIAJVBODR3IA4O72THQ + secret_access_key: + secure: "kUGd3t7JcVWFESgIlzvsM8viZgCA9Encs3creW0xLJaLSeI1iVjlJK4h/2/nO6y224AFrh/GUfsNr4/4AlxPuYb8OU5oC5Lv+Ff2JiRDYtuNpyQSKAQp+bRYytWMtrmhja91h118Mbm90cUfcLPwkdiINgJNTXhPKg5Cqu3VYn0=" + on: + branch: try + condition: $DEPLOY_ALT = 1 diff --git a/README.md b/README.md index 589aa1afe35ec..19fd7c3a3a8a6 100644 --- a/README.md +++ b/README.md @@ -1,242 +1,55 @@ -# The Rust Programming Language +# Rust with AVR support -This is the main source code repository for [Rust]. It contains the compiler, -standard library, and documentation. +[![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg)](https://gitter.im/avr-rust) -[Rust]: https://www.rust-lang.org +This project adds support for the [AVR](https://en.wikipedia.org/wiki/Atmel_AVR) +microcontroller to Rust. -## Quick Start -[quick-start]: #quick-start +It uses the [AVR-LLVM backend](http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AVR/). -Read ["Installation"] from [The Book]. +This will compile Rust with AVR support. This will not create a +fully-fledged cross-compiler, however, as it does not compile any libraries +such as `libcore` or `liblibc`. To do this, the `--target=avr-unknown-unknown` +flag must be passed to `configure`, which is not fully supported yet due to bugs. -["Installation"]: https://doc.rust-lang.org/book/second-edition/ch01-01-installation.html -[The Book]: https://doc.rust-lang.org/book/index.html +``` bash +# Grab the avr-rust sources +git clone https://github.com/avr-rust/rust.git -## Building from Source -[building-from-source]: #building-from-source +# Create a directory to place built files in +mkdir build && cd build -### Building on *nix -1. Make sure you have installed the dependencies: +# Generate Makefile using settings suitable for an experimental compiler +../rust/configure \ + --enable-debug \ + --disable-docs \ + --enable-llvm-assertions \ + --enable-debug-assertions \ + --enable-optimize \ + --prefix=/opt/avr-rust - * `g++` 4.7 or later or `clang++` 3.x or later - * `python` 2.7 (but not 3.x) - * GNU `make` 3.81 or later - * `cmake` 3.4.3 or later - * `curl` - * `git` +# Build the compiler, optionally install it to /opt/avr-rust +make +make install -2. Clone the [source] with `git`: +# Register the toolchain with rustup +rustup toolchain link avr-toolchain $(realpath $(find . -name 'stage1')) - ```sh - $ git clone https://github.com/rust-lang/rust.git - $ cd rust - ``` - -[source]: https://github.com/rust-lang/rust - -3. Build and install: - - ```sh - $ ./x.py build && sudo ./x.py install - ``` - - > ***Note:*** Install locations can be adjusted by copying the config file - > from `./config.toml.example` to `./config.toml`, and - > adjusting the `prefix` option under `[install]`. Various other options, such - > as enabling debug information, are also supported, and are documented in - > the config file. - - When complete, `sudo ./x.py install` will place several programs into - `/usr/local/bin`: `rustc`, the Rust compiler, and `rustdoc`, the - API-documentation tool. This install does not include [Cargo], - Rust's package manager, which you may also want to build. - -[Cargo]: https://github.com/rust-lang/cargo - -### Building on Windows -[building-on-windows]: #building-on-windows - -There are two prominent ABIs in use on Windows: the native (MSVC) ABI used by -Visual Studio, and the GNU ABI used by the GCC toolchain. Which version of Rust -you need depends largely on what C/C++ libraries you want to interoperate with: -for interop with software produced by Visual Studio use the MSVC build of Rust; -for interop with GNU software built using the MinGW/MSYS2 toolchain use the GNU -build. - -#### MinGW -[windows-mingw]: #windows-mingw - -[MSYS2][msys2] can be used to easily build Rust on Windows: - -[msys2]: https://msys2.github.io/ - -1. Grab the latest [MSYS2 installer][msys2] and go through the installer. - -2. Run `mingw32_shell.bat` or `mingw64_shell.bat` from wherever you installed - MSYS2 (i.e. `C:\msys64`), depending on whether you want 32-bit or 64-bit - Rust. (As of the latest version of MSYS2 you have to run `msys2_shell.cmd - -mingw32` or `msys2_shell.cmd -mingw64` from the command line instead) - -3. From this terminal, install the required tools: - - ```sh - # Update package mirrors (may be needed if you have a fresh install of MSYS2) - $ pacman -Sy pacman-mirrors - - # Install build tools needed for Rust. If you're building a 32-bit compiler, - # then replace "x86_64" below with "i686". If you've already got git, python, - # or CMake installed and in PATH you can remove them from this list. Note - # that it is important that you do **not** use the 'python2' and 'cmake' - # packages from the 'msys2' subsystem. The build has historically been known - # to fail with these packages. - $ pacman -S git \ - make \ - diffutils \ - tar \ - mingw-w64-x86_64-python2 \ - mingw-w64-x86_64-cmake \ - mingw-w64-x86_64-gcc - ``` - -4. Navigate to Rust's source code (or clone it), then build it: - - ```sh - $ ./x.py build && ./x.py install - ``` - -#### MSVC -[windows-msvc]: #windows-msvc - -MSVC builds of Rust additionally require an installation of Visual Studio 2013 -(or later) so `rustc` can use its linker. Make sure to check the “C++ tools” -option. - -With these dependencies installed, you can build the compiler in a `cmd.exe` -shell with: - -```sh -> python x.py build -``` - -Currently building Rust only works with some known versions of Visual Studio. If -you have a more recent version installed the build system doesn't understand -then you may need to force rustbuild to use an older version. This can be done -by manually calling the appropriate vcvars file before running the bootstrap. - -``` -CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat" -python x.py build +# Optionally enable the avr toolchain globally +rustup default avr-toolchain ``` -If you are seeing build failure when compiling `rustc_binaryen`, make sure the path -length of the rust folder is not longer than 22 characters. - -#### Specifying an ABI -[specifying-an-abi]: #specifying-an-abi - -Each specific ABI can also be used from either environment (for example, using -the GNU ABI in powershell) by using an explicit build triple. The available -Windows build triples are: -- GNU ABI (using GCC) - - `i686-pc-windows-gnu` - - `x86_64-pc-windows-gnu` -- The MSVC ABI - - `i686-pc-windows-msvc` - - `x86_64-pc-windows-msvc` - -The build triple can be specified by either specifying `--build=` when -invoking `x.py` commands, or by copying the `config.toml` file (as described -in Building From Source), and modifying the `build` option under the `[build]` -section. - -### Configure and Make -[configure-and-make]: #configure-and-make - -While it's not the recommended build system, this project also provides a -configure script and makefile (the latter of which just invokes `x.py`). - -```sh -$ ./configure -$ make && sudo make install -``` - -When using the configure script, the generated `config.mk` file may override the -`config.toml` file. To go back to the `config.toml` file, delete the generated -`config.mk` file. - -## Building Documentation -[building-documentation]: #building-documentation - -If you’d like to build the documentation, it’s almost the same: - -```sh -$ ./x.py doc -``` - -The generated documentation will appear under `doc` in the `build` directory for -the ABI used. I.e., if the ABI was `x86_64-pc-windows-msvc`, the directory will be -`build\x86_64-pc-windows-msvc\doc`. - -## Notes -[notes]: #notes - -Since the Rust compiler is written in Rust, it must be built by a -precompiled "snapshot" version of itself (made in an earlier state of -development). As such, source builds require a connection to the Internet, to -fetch snapshots, and an OS that can execute the available snapshot binaries. - -Snapshot binaries are currently built and tested on several platforms: - -| Platform / Architecture | x86 | x86_64 | -|--------------------------------|-----|--------| -| Windows (7, 8, Server 2008 R2) | ✓ | ✓ | -| Linux (2.6.18 or later) | ✓ | ✓ | -| OSX (10.7 Lion or later) | ✓ | ✓ | - -You may find that other platforms work, but these are our officially -supported build environments that are most likely to work. - -Rust currently needs between 600MiB and 1.5GiB of RAM to build, depending on platform. -If it hits swap, it will take a very long time to build. - -There is more advice about hacking on Rust in [CONTRIBUTING.md]. - -[CONTRIBUTING.md]: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md - -## Getting Help -[getting-help]: #getting-help - -The Rust community congregates in a few places: - -* [Stack Overflow] - Direct questions about using the language. -* [users.rust-lang.org] - General discussion and broader questions. -* [/r/rust] - News and general discussion. - -[Stack Overflow]: https://stackoverflow.com/questions/tagged/rust -[/r/rust]: https://reddit.com/r/rust -[users.rust-lang.org]: https://users.rust-lang.org/ - -## Contributing -[contributing]: #contributing - -To contribute to Rust, please see [CONTRIBUTING](CONTRIBUTING.md). +## Usage -Rust has an [IRC] culture and most real-time collaboration happens in a -variety of channels on Mozilla's IRC network, irc.mozilla.org. The -most popular channel is [#rust], a venue for general discussion about -Rust. And a good place to ask for help would be [#rust-beginners]. +# With Xargo (recommended) -[IRC]: https://en.wikipedia.org/wiki/Internet_Relay_Chat -[#rust]: irc://irc.mozilla.org/rust -[#rust-beginners]: irc://irc.mozilla.org/rust-beginners +Take a look at the example [blink](https://github.com/avr-rust/blink) program. -## License -[license]: #license +# Vanilla `rustc` -Rust is primarily distributed under the terms of both the MIT license -and the Apache License (Version 2.0), with portions covered by various -BSD-like licenses. +AVR support is enabled by passing the `--target avr-unknown-unknown` flag to `rustc`. -See [LICENSE-APACHE](LICENSE-APACHE), [LICENSE-MIT](LICENSE-MIT), and -[COPYRIGHT](COPYRIGHT) for details. +Note that the Rust `libcore` library (essentially required for every Rust program), +must be manually compiled for it to be used, as it will not be built for AVR during +compiler compilation (yet). Work is currently being done in order to allow `libcore` +to be automatically compiled for AVR. diff --git a/RUST_README.md b/RUST_README.md new file mode 100644 index 0000000000000..78a9f509bbcb4 --- /dev/null +++ b/RUST_README.md @@ -0,0 +1,226 @@ +# The Rust Programming Language + +This is the main source code repository for [Rust]. It contains the compiler, +standard library, and documentation. + +[Rust]: https://www.rust-lang.org + +## Quick Start + +Read ["Installation"] from [The Book]. + +["Installation"]: https://doc.rust-lang.org/book/second-edition/ch01-01-installation.html +[The Book]: https://doc.rust-lang.org/book/index.html + +## Building from Source + +1. Make sure you have installed the dependencies: + + * `g++` 4.7 or later or `clang++` 3.x or later + * `python` 2.7 (but not 3.x) + * GNU `make` 3.81 or later + * `cmake` 3.4.3 or later + * `curl` + * `git` + +2. Clone the [source] with `git`: + + ```sh + $ git clone https://github.com/rust-lang/rust.git + $ cd rust + ``` + +[source]: https://github.com/rust-lang/rust + +3. Build and install: + + ```sh + $ ./x.py build && sudo ./x.py install + ``` + + > ***Note:*** Install locations can be adjusted by copying the config file + > from `./config.toml.example` to `./config.toml`, and + > adjusting the `prefix` option under `[install]`. Various other options, such + > as enabling debug information, are also supported, and are documented in + > the config file. + + When complete, `sudo ./x.py install` will place several programs into + `/usr/local/bin`: `rustc`, the Rust compiler, and `rustdoc`, the + API-documentation tool. This install does not include [Cargo], + Rust's package manager, which you may also want to build. + +[Cargo]: https://github.com/rust-lang/cargo + +### Building on Windows + +There are two prominent ABIs in use on Windows: the native (MSVC) ABI used by +Visual Studio, and the GNU ABI used by the GCC toolchain. Which version of Rust +you need depends largely on what C/C++ libraries you want to interoperate with: +for interop with software produced by Visual Studio use the MSVC build of Rust; +for interop with GNU software built using the MinGW/MSYS2 toolchain use the GNU +build. + +#### MinGW + +[MSYS2][msys2] can be used to easily build Rust on Windows: + +[msys2]: https://msys2.github.io/ + +1. Grab the latest [MSYS2 installer][msys2] and go through the installer. + +2. Run `mingw32_shell.bat` or `mingw64_shell.bat` from wherever you installed + MSYS2 (i.e. `C:\msys64`), depending on whether you want 32-bit or 64-bit + Rust. (As of the latest version of MSYS2 you have to run `msys2_shell.cmd + -mingw32` or `msys2_shell.cmd -mingw64` from the command line instead) + +3. From this terminal, install the required tools: + + ```sh + # Update package mirrors (may be needed if you have a fresh install of MSYS2) + $ pacman -Sy pacman-mirrors + + # Install build tools needed for Rust. If you're building a 32-bit compiler, + # then replace "x86_64" below with "i686". If you've already got git, python, + # or CMake installed and in PATH you can remove them from this list. Note + # that it is important that you do **not** use the 'python2' and 'cmake' + # packages from the 'msys2' subsystem. The build has historically been known + # to fail with these packages. + $ pacman -S git \ + make \ + diffutils \ + tar \ + mingw-w64-x86_64-python2 \ + mingw-w64-x86_64-cmake \ + mingw-w64-x86_64-gcc + ``` + +4. Navigate to Rust's source code (or clone it), then build it: + + ```sh + $ ./x.py build && ./x.py install + ``` + +#### MSVC + +MSVC builds of Rust additionally require an installation of Visual Studio 2013 +(or later) so `rustc` can use its linker. Make sure to check the “C++ tools” +option. + +With these dependencies installed, you can build the compiler in a `cmd.exe` +shell with: + +```sh +> python x.py build +``` + +Currently building Rust only works with some known versions of Visual Studio. If +you have a more recent version installed the build system doesn't understand +then you may need to force rustbuild to use an older version. This can be done +by manually calling the appropriate vcvars file before running the bootstrap. + +``` +CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat" +python x.py build +``` + +#### Specifying an ABI + +Each specific ABI can also be used from either environment (for example, using +the GNU ABI in powershell) by using an explicit build triple. The available +Windows build triples are: +- GNU ABI (using GCC) + - `i686-pc-windows-gnu` + - `x86_64-pc-windows-gnu` +- The MSVC ABI + - `i686-pc-windows-msvc` + - `x86_64-pc-windows-msvc` + +The build triple can be specified by either specifying `--build=` when +invoking `x.py` commands, or by copying the `config.toml` file (as described +in Building From Source), and modifying the `build` option under the `[build]` +section. + +### Configure and Make + +While it's not the recommended build system, this project also provides a +configure script and makefile (the latter of which just invokes `x.py`). + +```sh +$ ./configure +$ make && sudo make install +``` + +When using the configure script, the generated `config.mk` file may override the +`config.toml` file. To go back to the `config.toml` file, delete the generated +`config.mk` file. + +## Building Documentation + +If you’d like to build the documentation, it’s almost the same: + +```sh +$ ./x.py doc +``` + +The generated documentation will appear under `doc` in the `build` directory for +the ABI used. I.e., if the ABI was `x86_64-pc-windows-msvc`, the directory will be +`build\x86_64-pc-windows-msvc\doc`. + +## Notes + +Since the Rust compiler is written in Rust, it must be built by a +precompiled "snapshot" version of itself (made in an earlier state of +development). As such, source builds require a connection to the Internet, to +fetch snapshots, and an OS that can execute the available snapshot binaries. + +Snapshot binaries are currently built and tested on several platforms: + +| Platform / Architecture | x86 | x86_64 | +|--------------------------------|-----|--------| +| Windows (7, 8, Server 2008 R2) | ✓ | ✓ | +| Linux (2.6.18 or later) | ✓ | ✓ | +| OSX (10.7 Lion or later) | ✓ | ✓ | + +You may find that other platforms work, but these are our officially +supported build environments that are most likely to work. + +Rust currently needs between 600MiB and 1.5GiB to build, depending on platform. +If it hits swap, it will take a very long time to build. + +There is more advice about hacking on Rust in [CONTRIBUTING.md]. + +[CONTRIBUTING.md]: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md + +## Getting Help + +The Rust community congregates in a few places: + +* [Stack Overflow] - Direct questions about using the language. +* [users.rust-lang.org] - General discussion and broader questions. +* [/r/rust] - News and general discussion. + +[Stack Overflow]: https://stackoverflow.com/questions/tagged/rust +[/r/rust]: https://reddit.com/r/rust +[users.rust-lang.org]: https://users.rust-lang.org/ + +## Contributing + +To contribute to Rust, please see [CONTRIBUTING](CONTRIBUTING.md). + +Rust has an [IRC] culture and most real-time collaboration happens in a +variety of channels on Mozilla's IRC network, irc.mozilla.org. The +most popular channel is [#rust], a venue for general discussion about +Rust. And a good place to ask for help would be [#rust-beginners]. + +[IRC]: https://en.wikipedia.org/wiki/Internet_Relay_Chat +[#rust]: irc://irc.mozilla.org/rust +[#rust-beginners]: irc://irc.mozilla.org/rust-beginners + +## License + +Rust is primarily distributed under the terms of both the MIT license +and the Apache License (Version 2.0), with portions covered by various +BSD-like licenses. + +See [LICENSE-APACHE](LICENSE-APACHE), [LICENSE-MIT](LICENSE-MIT), and +[COPYRIGHT](COPYRIGHT) for details. diff --git a/config.toml.example b/config.toml.example index 8d1fa3eec5cf2..e3f11d50be6f8 100644 --- a/config.toml.example +++ b/config.toml.example @@ -62,7 +62,7 @@ # not built by default and the experimental Rust compilation targets that depend # on them will not work unless the user opts in to building them. By default the # `WebAssembly` target is enabled when compiling LLVM from scratch. -#experimental-targets = "WebAssembly" +#experimental-targets = "AVR;WebAssembly" # Cap the number of parallel linker invocations when compiling LLVM. # This can be useful when building LLVM with debug info, which significantly diff --git a/src/librustc/ich/impls_syntax.rs b/src/librustc/ich/impls_syntax.rs index c31a5c9d86d77..dbae41d8859f9 100644 --- a/src/librustc/ich/impls_syntax.rs +++ b/src/librustc/ich/impls_syntax.rs @@ -93,6 +93,8 @@ impl_stable_hash_for!(enum ::syntax::abi::Abi { PtxKernel, Msp430Interrupt, X86Interrupt, + AvrInterrupt, + AvrNonBlockingInterrupt, Rust, C, System, diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index cfbf233297cf8..4bc7a2c33298b 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1331,6 +1331,7 @@ pub fn default_lib_output() -> CrateType { pub fn default_configuration(sess: &Session) -> ast::CrateConfig { let end = &sess.target.target.target_endian; let arch = &sess.target.target.arch; + let cpu = &sess.target.target.options.cpu; let wordsz = &sess.target.target.target_pointer_width; let os = &sess.target.target.target_os; let env = &sess.target.target.target_env; @@ -1352,6 +1353,10 @@ pub fn default_configuration(sess: &Session) -> ast::CrateConfig { ret.insert((Symbol::intern("target_pointer_width"), Some(Symbol::intern(wordsz)))); ret.insert((Symbol::intern("target_env"), Some(Symbol::intern(env)))); ret.insert((Symbol::intern("target_vendor"), Some(Symbol::intern(vendor)))); + if sess.target.target.options.is_specific_cpu() { + ret.insert((Symbol::intern("target_cpu"), Some(Symbol::intern(cpu)))); + } + if sess.target.target.options.has_elf_tls { ret.insert((Symbol::intern("target_thread_local"), None)); } diff --git a/src/librustc_back/target/avr_unknown_unknown.rs b/src/librustc_back/target/avr_unknown_unknown.rs new file mode 100644 index 0000000000000..1ae6867d51f2d --- /dev/null +++ b/src/librustc_back/target/avr_unknown_unknown.rs @@ -0,0 +1,32 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use LinkerFlavor; +use target::{Target, TargetOptions, TargetResult}; + +pub fn target() -> TargetResult { + Ok(Target { + llvm_target: "avr-unknown-unknown".to_string(), + target_endian: "little".to_string(), + target_pointer_width: "16".to_string(), + target_c_int_width: "16".to_string(), + data_layout: "e-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8".to_string(), + arch: "avr".to_string(), + linker_flavor: LinkerFlavor::Gcc, + target_os: "unknown".to_string(), + target_env: "".to_string(), + target_vendor: "unknown".to_string(), + options: TargetOptions { + // jemalloc is not supported on 16-bit targets. + exe_allocation_crate: Some("alloc_system".to_string()), + .. super::none_base::opts() + }, + }) +} diff --git a/src/librustc_back/target/mod.rs b/src/librustc_back/target/mod.rs index 2872c59157d6b..1f783d95bfe32 100644 --- a/src/librustc_back/target/mod.rs +++ b/src/librustc_back/target/mod.rs @@ -62,6 +62,7 @@ mod emscripten_base; mod freebsd_base; mod haiku_base; mod linux_base; +mod none_base; mod linux_musl_base; mod openbsd_base; mod netbsd_base; @@ -209,6 +210,8 @@ supported_targets! { ("armv7-apple-ios", armv7_apple_ios), ("armv7s-apple-ios", armv7s_apple_ios), + ("avr-unknown-unknown", avr_unknown_unknown), + ("x86_64-sun-solaris", x86_64_sun_solaris), ("sparcv9-sun-solaris", sparcv9_sun_solaris), @@ -257,7 +260,7 @@ pub struct Target { /// Vendor name to use for conditional compilation. pub target_vendor: String, /// Architecture to use for ABI considerations. Valid options: "x86", - /// "x86_64", "arm", "aarch64", "mips", "powerpc", and "powerpc64". + /// "x86_64", "arm", "avr", "aarch64", "mips", "powerpc", and "powerpc64". pub arch: String, /// [Data layout](http://llvm.org/docs/LangRef.html#data-layout) to pass to LLVM. pub data_layout: String, @@ -864,6 +867,12 @@ impl Target { } } +impl TargetOptions { + pub fn is_specific_cpu(&self) -> bool { + self.cpu != "generic" + } +} + impl ToJson for Target { fn to_json(&self) -> Json { let mut d = BTreeMap::new(); diff --git a/src/librustc_back/target/none_base.rs b/src/librustc_back/target/none_base.rs new file mode 100644 index 0000000000000..8251cbb7dad75 --- /dev/null +++ b/src/librustc_back/target/none_base.rs @@ -0,0 +1,38 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use LinkerFlavor; +use std::default::Default; +use target::{LinkArgs, TargetOptions}; + +pub fn opts() -> TargetOptions { + let mut args = LinkArgs::new(); + + args.insert(LinkerFlavor::Gcc, vec![ + // We want to be able to strip as much executable code as possible + // from the linker command line, and this flag indicates to the + // linker that it can avoid linking in dynamic libraries that don't + // actually satisfy any symbols up to that point (as with many other + // resolutions the linker does). This option only applies to all + // following libraries so we're sure to pass it as one of the first + // arguments. + "-Wl,--as-needed".to_string(), + ]); + + TargetOptions { + dynamic_linking: false, + executables: true, + linker_is_gnu: true, + has_rpath: false, + pre_link_args: args, + position_independent_executables: true, + .. Default::default() + } +} diff --git a/src/librustc_llvm/build.rs b/src/librustc_llvm/build.rs index 54e3f544acb68..7a0a043ea2e27 100644 --- a/src/librustc_llvm/build.rs +++ b/src/librustc_llvm/build.rs @@ -75,7 +75,7 @@ fn main() { let is_crossed = target != host; let mut optional_components = - vec!["x86", "arm", "aarch64", "mips", "powerpc", + vec!["x86", "arm", "aarch64", "avr", "mips", "powerpc", "systemz", "jsbackend", "webassembly", "msp430", "sparc", "nvptx"]; let mut version_cmd = Command::new(&llvm_config); diff --git a/src/librustc_llvm/ffi.rs b/src/librustc_llvm/ffi.rs index e71bef512cf06..40d27e289d5b7 100644 --- a/src/librustc_llvm/ffi.rs +++ b/src/librustc_llvm/ffi.rs @@ -55,6 +55,8 @@ pub enum CallConv { X86_64_Win64 = 79, X86_VectorCall = 80, X86_Intr = 83, + AvrNonBlockingInterrupt = 84, + AvrInterrupt = 85, } /// LLVMRustLinkage diff --git a/src/librustc_llvm/lib.rs b/src/librustc_llvm/lib.rs index 8dcf7444dd18f..e87467540186f 100644 --- a/src/librustc_llvm/lib.rs +++ b/src/librustc_llvm/lib.rs @@ -324,6 +324,12 @@ pub fn initialize_available_targets() { LLVMInitializeARMTargetMC, LLVMInitializeARMAsmPrinter, LLVMInitializeARMAsmParser); + init_target!(llvm_component = "avr", + LLVMInitializeAVRTargetInfo, + LLVMInitializeAVRTarget, + LLVMInitializeAVRTargetMC, + LLVMInitializeAVRAsmPrinter, + LLVMInitializeAVRAsmParser); init_target!(llvm_component = "aarch64", LLVMInitializeAArch64TargetInfo, LLVMInitializeAArch64Target, diff --git a/src/librustc_trans/abi.rs b/src/librustc_trans/abi.rs index 12698964d2e65..10f2e4d5cc2bd 100644 --- a/src/librustc_trans/abi.rs +++ b/src/librustc_trans/abi.rs @@ -18,6 +18,7 @@ use cabi_x86_64; use cabi_x86_win64; use cabi_arm; use cabi_aarch64; +use cabi_avr; use cabi_powerpc; use cabi_powerpc64; use cabi_s390x; @@ -710,6 +711,8 @@ impl<'a, 'tcx> FnType<'tcx> { PtxKernel => llvm::PtxKernel, Msp430Interrupt => llvm::Msp430Intr, X86Interrupt => llvm::X86_Intr, + AvrInterrupt => llvm::AvrInterrupt, + AvrNonBlockingInterrupt => llvm::AvrNonBlockingInterrupt, // These API constants ought to be more specific... Cdecl => llvm::CCallConv, @@ -940,6 +943,7 @@ impl<'a, 'tcx> FnType<'tcx> { }, "aarch64" => cabi_aarch64::compute_abi_info(cx, self), "arm" => cabi_arm::compute_abi_info(cx, self), + "avr" => cabi_avr::compute_abi_info(self), "mips" => cabi_mips::compute_abi_info(cx, self), "mips64" => cabi_mips64::compute_abi_info(cx, self), "powerpc" => cabi_powerpc::compute_abi_info(cx, self), diff --git a/src/librustc_trans/cabi_avr.rs b/src/librustc_trans/cabi_avr.rs new file mode 100644 index 0000000000000..b9de30d8b76cf --- /dev/null +++ b/src/librustc_trans/cabi_avr.rs @@ -0,0 +1,43 @@ +// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![allow(non_upper_case_globals)] + +use abi::{FnType, ArgType, LayoutExt}; + +fn classify_ret_ty<'tcx>(ret: &mut ArgType<'tcx>) { + if ret.layout.is_aggregate() { + ret.make_indirect(); + } else { + ret.extend_integer_width_to(8); // Is 8 correct? + } +} + +fn classify_arg_ty<'tcx>(arg: &mut ArgType<'tcx>) { + if arg.layout.is_aggregate() { + arg.make_indirect(); + } else { + arg.extend_integer_width_to(8); + } +} + +pub fn compute_abi_info<'tcx>(fty: &mut FnType<'tcx>) { + if !fty.ret.is_ignore() { + classify_ret_ty(&mut fty.ret); + } + + for arg in &mut fty.args { + if arg.is_ignore() { + continue; + } + + classify_arg_ty(arg); + } +} diff --git a/src/librustc_trans/lib.rs b/src/librustc_trans/lib.rs index 908d3790170ac..63666bf05c765 100644 --- a/src/librustc_trans/lib.rs +++ b/src/librustc_trans/lib.rs @@ -110,6 +110,7 @@ mod base; mod builder; mod cabi_aarch64; mod cabi_arm; +mod cabi_avr; mod cabi_asmjs; mod cabi_hexagon; mod cabi_mips; diff --git a/src/libstd/env.rs b/src/libstd/env.rs index c4946b6b2824d..fba485ec93c13 100644 --- a/src/libstd/env.rs +++ b/src/libstd/env.rs @@ -807,6 +807,7 @@ pub mod consts { /// - x86_64 /// - arm /// - aarch64 + /// - avr /// - mips /// - mips64 /// - powerpc @@ -919,6 +920,11 @@ mod arch { pub const ARCH: &'static str = "aarch64"; } +#[cfg(target_arch = "avr")] +mod arch { + pub const ARCH: &'static str = "avr"; +} + #[cfg(target_arch = "mips")] mod arch { pub const ARCH: &'static str = "mips"; diff --git a/src/libsyntax/abi.rs b/src/libsyntax/abi.rs index ed2eb20990695..fbe7dcd3417e5 100644 --- a/src/libsyntax/abi.rs +++ b/src/libsyntax/abi.rs @@ -27,6 +27,8 @@ pub enum Abi { PtxKernel, Msp430Interrupt, X86Interrupt, + AvrInterrupt, + AvrNonBlockingInterrupt, // Multiplatform / generic ABIs Rust, @@ -63,6 +65,8 @@ const AbiDatas: &'static [AbiData] = &[ AbiData {abi: Abi::PtxKernel, name: "ptx-kernel", generic: false }, AbiData {abi: Abi::Msp430Interrupt, name: "msp430-interrupt", generic: false }, AbiData {abi: Abi::X86Interrupt, name: "x86-interrupt", generic: false }, + AbiData {abi: Abi::AvrInterrupt, name: "avr-interrupt", generic: false }, + AbiData {abi: Abi::AvrNonBlockingInterrupt, name: "avr-non-blocking-interrupt", generic: false }, // Cross-platform ABIs AbiData {abi: Abi::Rust, name: "Rust", generic: true }, diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 3b137f9570a39..029c9ccf0a64c 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -339,6 +339,8 @@ declare_features! ( // `extern "x86-interrupt" fn()` (active, abi_x86_interrupt, "1.17.0", Some(40180)), + // `extern "avr-interrupt" fn()` + (active, abi_avr_interrupt, "1.18.0", Some(000)), // Allows the `catch {...}` expression (active, catch_expr, "1.17.0", Some(31436)), @@ -1321,6 +1323,10 @@ impl<'a> PostExpansionVisitor<'a> { Abi::X86Interrupt => { gate_feature_post!(&self, abi_x86_interrupt, span, "x86-interrupt ABI is experimental and subject to change"); + } + Abi::AvrInterrupt | Abi::AvrNonBlockingInterrupt => { + gate_feature_post!(&self, abi_avr_interrupt, span, + "avr-interrupt and avr-non-blocking-interrupt ABIs are experimental and subject to change"); }, // Stable Abi::Cdecl | diff --git a/src/llvm b/src/llvm index 9f81beaf32608..7ff65e791f8cb 160000 --- a/src/llvm +++ b/src/llvm @@ -1 +1 @@ -Subproject commit 9f81beaf32608fbe1fe0f2a82f974e800e9d8c62 +Subproject commit 7ff65e791f8cbe48d8a7f915d064427b4c78421e diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index 06d1301d70003..9bc64c5369b1b 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -143,6 +143,12 @@ bool LLVMRustPassManagerBuilderPopulateThinLTOPassManager( #define SUBTARGET_AARCH64 #endif +#ifdef LLVM_COMPONENT_AVR +#define SUBTARGET_AVR SUBTARGET(AVR) +#else +#define SUBTARGET_AVR +#endif + #ifdef LLVM_COMPONENT_MIPS #define SUBTARGET_MIPS SUBTARGET(Mips) #else @@ -183,6 +189,7 @@ bool LLVMRustPassManagerBuilderPopulateThinLTOPassManager( SUBTARGET_X86 \ SUBTARGET_ARM \ SUBTARGET_AARCH64 \ + SUBTARGET_AVR \ SUBTARGET_MIPS \ SUBTARGET_PPC \ SUBTARGET_SYSTEMZ \ diff --git a/src/test/run-pass/cfg-target-cpu.rs b/src/test/run-pass/cfg-target-cpu.rs new file mode 100644 index 0000000000000..0553d2350a74d --- /dev/null +++ b/src/test/run-pass/cfg-target-cpu.rs @@ -0,0 +1,18 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub fn main() { + if cfg!(target_cpu = "cortex-a8") { + println!("Running on Cortex A8!"); + } else { + println!("Running on an arbitrary cpu"); + } +} + diff --git a/src/tools/compiletest/src/util.rs b/src/tools/compiletest/src/util.rs index 3c9dae915b5a2..543169138d548 100644 --- a/src/tools/compiletest/src/util.rs +++ b/src/tools/compiletest/src/util.rs @@ -24,6 +24,7 @@ const OS_TABLE: &'static [(&'static str, &'static str)] = &[ ("linux", "linux"), ("mingw32", "windows"), ("netbsd", "netbsd"), + ("none", "none"), ("openbsd", "openbsd"), ("win32", "windows"), ("windows", "windows"), @@ -36,6 +37,7 @@ const ARCH_TABLE: &'static [(&'static str, &'static str)] = &[ ("amd64", "x86_64"), ("arm", "arm"), ("arm64", "aarch64"), + ("avr", "avr"), ("hexagon", "hexagon"), ("i386", "x86"), ("i586", "x86"),