diff --git a/.travis.yml b/.travis.yml index 85384924..14f91da1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,107 +1,210 @@ +# Environment variables env: + global: - CFLAGS=-Werror +# Common test script script: - # make sure example can at least compile - - sed -n '/``` c/,/```/{/```/d; p;}' README.md > test.c && - make all size CFLAGS+=" + # make sure example can at least compile + - sed -n '/``` c/,/```/{/```/d; p;}' README.md > test.c && + make all CFLAGS+=" -Duser_provided_block_device_read=NULL -Duser_provided_block_device_prog=NULL -Duser_provided_block_device_erase=NULL -Duser_provided_block_device_sync=NULL -include stdio.h" - # run tests - - make test QUIET=1 + # run tests + - make test QUIET=1 - # run tests with a few different configurations - - make test QUIET=1 CFLAGS+="-DLFS_READ_SIZE=1 -DLFS_PROG_SIZE=1" - - make test QUIET=1 CFLAGS+="-DLFS_READ_SIZE=512 -DLFS_PROG_SIZE=512" - - make test QUIET=1 CFLAGS+="-DLFS_BLOCK_COUNT=1023 -DLFS_LOOKAHEAD=2048" + # run tests with a few different configurations + - make test QUIET=1 CFLAGS+="-DLFS_READ_SIZE=1 -DLFS_PROG_SIZE=1" + - make test QUIET=1 CFLAGS+="-DLFS_READ_SIZE=512 -DLFS_PROG_SIZE=512" + - make test QUIET=1 CFLAGS+="-DLFS_BLOCK_COUNT=1023 -DLFS_LOOKAHEAD=2048" + + - make clean test QUIET=1 CFLAGS+="-DLFS_NO_INTRINSICS" + + # compile and find the code size with the smalles configuration + - make clean size + OBJ="$(ls lfs*.o | tr '\n' ' ')" + CFLAGS+="-DLFS_NO{ASSERT,DEBUG,WARN,ERROR}" + | tee sizes + + # update status if we succeeded, compare with master if possible + - | + if [ "$TRAVIS_TEST_RESULT" -eq 0 ] + then + CURR=$(tail -n1 sizes | awk '{print $1}') + STATUS="Passed, code size is ${CURR}B" + + PREV=$(curl https://api.github.com/repos/$TRAVIS_REPO_SLUG/status/master \ + | jq -r ".statuses[] | select(.context == \"ci/$NAME\").description" \ + | sed 's/.*code size is \([0-9]*\).*/\1/' \ + || echo 0) + if [ "$PREV" -ne 0 ] + then + STATUS="$STATUS ($(python -c "print '%+.2f' % (100*($CURR-$PREV)/$PREV.0)")%)" + fi + fi + +# CI matrix +matrix: + include: + # native testing + - env: + - NAME=littlefs-x86 + + # cross-compile with ARM (thumb mode) + - env: + - NAME=littlefs-arm + - CC="arm-linux-gnueabi-gcc --static -mthumb" + - EXEC="qemu-arm" + install: + - sudo apt-get install gcc-arm-linux-gnueabi qemu-user + - arm-linux-gnueabi-gcc --version + - qemu-arm -version + + # cross-compile with PowerPC + - env: + - NAME=littlefs-powerpc + - CC="powerpc-linux-gnu-gcc --static" + - EXEC="qemu-ppc" + install: + - sudo apt-get install gcc-powerpc-linux-gnu qemu-user + - powerpc-linux-gnu-gcc --version + - qemu-ppc -version + + # cross-compile with MIPS + - env: + - NAME=littlefs-mips + - CC="mips-linux-gnu-gcc --static" + - EXEC="qemu-mips" + install: + - sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu/ xenial main universe" + - sudo apt-get -qq update + - sudo apt-get install gcc-mips-linux-gnu qemu-user + - mips-linux-gnu-gcc --version + - qemu-mips -version # self-host with littlefs-fuse for fuzz test - - make -C littlefs-fuse + - env: + - NAME=littlefs-fuse + install: + - sudo apt-get install libfuse-dev + - git clone --depth 1 https://github.com/geky/littlefs-fuse + - fusermount -V + - gcc --version + before_script: + # setup disk for littlefs-fuse + - rm -rf littlefs-fuse/littlefs/* + - cp -r $(git ls-tree --name-only HEAD) littlefs-fuse/littlefs - - littlefs-fuse/lfs --format /dev/loop0 - - littlefs-fuse/lfs /dev/loop0 mount + - mkdir mount + - sudo chmod a+rw /dev/loop0 + - dd if=/dev/zero bs=512 count=2048 of=disk + - losetup /dev/loop0 disk + script: + # self-host test + - make -C littlefs-fuse - - ls mount - - mkdir mount/littlefs - - cp -r $(git ls-tree --name-only HEAD) mount/littlefs - - cd mount/littlefs - - ls - - make -B test_dirs test_files QUIET=1 + - littlefs-fuse/lfs --format /dev/loop0 + - littlefs-fuse/lfs /dev/loop0 mount + - ls mount + - mkdir mount/littlefs + - cp -r $(git ls-tree --name-only HEAD) mount/littlefs + - cd mount/littlefs + - ls + - make -B test_dirs test_files QUIET=1 + +# Manage statuses before_install: - - fusermount -V - - gcc --version + - | + curl -u $GEKY_BOT_STATUSES -X POST \ + https://api.github.com/repos/$TRAVIS_REPO_SLUG/statuses/${TRAVIS_PULL_REQUEST_SHA:-$TRAVIS_COMMIT} \ + -d "{ + \"context\": \"ci/$NAME\", + \"state\": \"pending\", + \"description\": \"${STATUS:-In progress}\", + \"target_url\": \"https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$TRAVIS_JOB_ID\" + }" -install: - - sudo apt-get install libfuse-dev - - git clone --depth 1 https://github.com/geky/littlefs-fuse +after_failure: + - | + curl -u $GEKY_BOT_STATUSES -X POST \ + https://api.github.com/repos/$TRAVIS_REPO_SLUG/statuses/${TRAVIS_PULL_REQUEST_SHA:-$TRAVIS_COMMIT} \ + -d "{ + \"context\": \"ci/$NAME\", + \"state\": \"failure\", + \"description\": \"${STATUS:-Failed}\", + \"target_url\": \"https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$TRAVIS_JOB_ID\" + }" -before_script: - - rm -rf littlefs-fuse/littlefs/* - - cp -r $(git ls-tree --name-only HEAD) littlefs-fuse/littlefs - - - mkdir mount - - sudo chmod a+rw /dev/loop0 - - dd if=/dev/zero bs=512 count=2048 of=disk - - losetup /dev/loop0 disk +after_success: + - | + curl -u $GEKY_BOT_STATUSES -X POST \ + https://api.github.com/repos/$TRAVIS_REPO_SLUG/statuses/${TRAVIS_PULL_REQUEST_SHA:-$TRAVIS_COMMIT} \ + -d "{ + \"context\": \"ci/$NAME\", + \"state\": \"success\", + \"description\": \"${STATUS:-Passed}\", + \"target_url\": \"https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$TRAVIS_JOB_ID\" + }" +# Automatically update releases deploy: - # Let before_deploy take over - provider: script - script: 'true' - on: - branch: master + # Let before_deploy take over + provider: script + script: 'true' + on: + branch: master before_deploy: - - cd $TRAVIS_BUILD_DIR - # Update tag for version defined in lfs.h - - LFS_VERSION=$(grep -ox '#define LFS_VERSION .*' lfs.h | cut -d ' ' -f3) - - LFS_VERSION_MAJOR=$((0xffff & ($LFS_VERSION >> 16))) - - LFS_VERSION_MINOR=$((0xffff & ($LFS_VERSION >> 0))) - - LFS_VERSION="v$LFS_VERSION_MAJOR.$LFS_VERSION_MINOR" - - echo "littlefs version $LFS_VERSION" - - | - curl -u $GEKY_BOT -X POST \ - https://api.github.com/repos/$TRAVIS_REPO_SLUG/git/refs \ - -d "{ - \"ref\": \"refs/tags/$LFS_VERSION\", - \"sha\": \"$TRAVIS_COMMIT\" - }" - - | - curl -f -u $GEKY_BOT -X PATCH \ - https://api.github.com/repos/$TRAVIS_REPO_SLUG/git/refs/tags/$LFS_VERSION \ - -d "{ - \"sha\": \"$TRAVIS_COMMIT\" - }" - # Create release notes from commits - - LFS_PREV_VERSION="v$LFS_VERSION_MAJOR.$(($LFS_VERSION_MINOR-1))" - - | - if [ $(git tag -l "$LFS_PREV_VERSION") ] - then - curl -u $GEKY_BOT -X POST \ - https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases \ - -d "{ - \"tag_name\": \"$LFS_VERSION\", - \"name\": \"$LFS_VERSION\" - }" - RELEASE=$( - curl -f https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases/tags/$LFS_VERSION - ) - CHANGES=$( - git log --oneline $LFS_PREV_VERSION.. --grep='^Merge' --invert-grep - ) - curl -f -u $GEKY_BOT -X PATCH \ - https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases/$( - jq -r '.id' <<< "$RELEASE" - ) \ - -d "$( - jq -s '{ - "body": ((.[0] // "" | sub("(?<=\n)#+ Changes.*"; ""; "mi")) - + "### Changes\n\n" + .[1]) - }' <(jq '.body' <<< "$RELEASE") <(jq -sR '.' <<< "$CHANGES") - )" - fi + - cd $TRAVIS_BUILD_DIR + # Update tag for version defined in lfs.h + - LFS_VERSION=$(grep -ox '#define LFS_VERSION .*' lfs.h | cut -d ' ' -f3) + - LFS_VERSION_MAJOR=$((0xffff & ($LFS_VERSION >> 16))) + - LFS_VERSION_MINOR=$((0xffff & ($LFS_VERSION >> 0))) + - LFS_VERSION="v$LFS_VERSION_MAJOR.$LFS_VERSION_MINOR" + - echo "littlefs version $LFS_VERSION" + - | + curl -u $GEKY_BOT_RELEASES -X POST \ + https://api.github.com/repos/$TRAVIS_REPO_SLUG/git/refs \ + -d "{ + \"ref\": \"refs/tags/$LFS_VERSION\", + \"sha\": \"$TRAVIS_COMMIT\" + }" + - | + curl -f -u $GEKY_BOT_RELEASES -X PATCH \ + https://api.github.com/repos/$TRAVIS_REPO_SLUG/git/refs/tags/$LFS_VERSION \ + -d "{ + \"sha\": \"$TRAVIS_COMMIT\" + }" + # Create release notes from commits + - LFS_PREV_VERSION="v$LFS_VERSION_MAJOR.$(($LFS_VERSION_MINOR-1))" + - | + if [ $(git tag -l "$LFS_PREV_VERSION") ] + then + curl -u $GEKY_BOT_RELEASES -X POST \ + https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases \ + -d "{ + \"tag_name\": \"$LFS_VERSION\", + \"name\": \"$LFS_VERSION\" + }" + RELEASE=$( + curl -f https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases/tags/$LFS_VERSION + ) + CHANGES=$( + git log --oneline $LFS_PREV_VERSION.. --grep='^Merge' --invert-grep + ) + curl -f -u $GEKY_BOT_RELEASES -X PATCH \ + https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases/$( + jq -r '.id' <<< "$RELEASE" + ) \ + -d "$( + jq -s '{ + "body": ((.[0] // "" | sub("(?<=\n)#+ Changes.*"; ""; "mi")) + + "### Changes\n\n" + .[1]) + }' <(jq '.body' <<< "$RELEASE") <(jq -sR '.' <<< "$CHANGES") + )" + fi diff --git a/Makefile b/Makefile index 259ed0e0..ee717936 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ TARGET = lfs -CC = gcc -AR = ar -SIZE = size +CC ?= gcc +AR ?= ar +SIZE ?= size SRC += $(wildcard *.c emubd/*.c) OBJ := $(SRC:.c=.o) diff --git a/tests/test.py b/tests/test.py index e74bc3c3..24b0d1a3 100755 --- a/tests/test.py +++ b/tests/test.py @@ -33,10 +33,15 @@ def generate(test): pass def compile(): - subprocess.check_call(['make', '--no-print-directory', '-s']) + subprocess.check_call([ + os.environ.get('MAKE', 'make'), + '--no-print-directory', '-s']) def execute(): - subprocess.check_call(["./lfs"]) + if 'EXEC' in os.environ: + subprocess.check_call([os.environ['EXEC'], "./lfs"]) + else: + subprocess.check_call(["./lfs"]) def main(test=None): if test and not test.startswith('-'):