diff --git a/.clang-tidy b/.clang-tidy index 2aa0d1e4..3a6bd573 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -2,7 +2,7 @@ # TODO Enable (some of) the explicitly disabled checks. Possibly needs helper types from gsl library or similar to enable full cppcoreguidelines. # TODO Enable more checks (google-*, hicpp-*, llvm-*, modernize-*, mpi-*, performance-*, readability-*) # TODO Maybe just enable * and disable a list instead? -# TODO Check if there's new checks in clang-tidy-9 and potentially enable them +# TODO Check if there's new checks in clang-tidy-9 and later and potentially enable them Checks: | clang-diagnostic-*, clang-analyzer-*, diff --git a/.github/workflows/actions/setup_linux/action.yaml b/.github/workflows/actions/setup_linux/action.yaml new file mode 100644 index 00000000..4c1c230a --- /dev/null +++ b/.github/workflows/actions/setup_linux/action.yaml @@ -0,0 +1,40 @@ +name: 'Setup Linux' +description: 'Setup Linux' +inputs: + os: + description: "Exact os (i.e. ubuntu version) this runs on" + required: true + extra_apt_packages: + description: "Job-specific apt packages to install (e.g. the compiler)" + required: true +runs: + using: "composite" + steps: + - name: Install Linux dependencies + shell: bash + run: | + if [[ "${{inputs.os}}" == "ubuntu-18.04" ]]; then + echo Adding apt repositories for newer clang versions on Ubuntu 18.04 + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - + sudo touch /etc/apt/sources.list.d/clang.list + sudo chmod o+w /etc/apt/sources.list.d/clang.list + echo "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main" >> /etc/apt/sources.list.d/clang.list + echo "deb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main" >> /etc/apt/sources.list.d/clang.list + sudo chmod o-w /etc/apt/sources.list.d/clang.list + elif [[ "${{inputs.os}}" == "ubuntu-20.04" ]]; then + echo Adding apt repositories for newer clang versions on Ubuntu 20.04 + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - + sudo touch /etc/apt/sources.list.d/clang.list + sudo chmod o+w /etc/apt/sources.list.d/clang.list + echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-11 main" >> /etc/apt/sources.list.d/clang.list + echo "deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-11 main" >> /etc/apt/sources.list.d/clang.list + sudo chmod o-w /etc/apt/sources.list.d/clang.list + fi + sudo apt-get update + sudo apt-get install ninja-build libcurl4-openssl-dev libfuse-dev ccache ${{inputs.extra_apt_packages}} + - name: Speed up random generator + run: | + set -v + # Use /dev/urandom when /dev/random is accessed to use less entropy + sudo cp -a /dev/urandom /dev/random + shell: bash diff --git a/.github/workflows/actions/setup_macos/action.yaml b/.github/workflows/actions/setup_macos/action.yaml new file mode 100644 index 00000000..8dcf64bc --- /dev/null +++ b/.github/workflows/actions/setup_macos/action.yaml @@ -0,0 +1,13 @@ +name: 'Setup macOS' +description: 'Setup macOS' +inputs: + extra_homebrew_packages: + description: "Job-specific homebrew packages to install (e.g. the compiler)" + required: true +runs: + using: "composite" + steps: + - name: Install macOS dependencies + shell: bash + run: | + brew install ninja macfuse libomp ccache md5sha1sum ${{inputs.extra_homebrew_packages}} diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 43fb9360..f56f25c8 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -75,7 +75,9 @@ jobs: extra_cxxflags: [""] extra_env_vars_for_test: [""] install_dependencies_manually: [false] + run_build: [true] run_tests: [true] + run_clang_tidy: [false] include: - name: Local dependencies os: ubuntu-18.04 @@ -88,6 +90,7 @@ jobs: extra_cxxflags: "" extra_env_vars_for_test: "" install_dependencies_manually: true + run_build: true run_tests: true - name: Local dependencies os: ubuntu-20.04 @@ -100,6 +103,7 @@ jobs: extra_cxxflags: "" extra_env_vars_for_test: "" install_dependencies_manually: true + run_build: true run_tests: true - name: Werror gcc os: ubuntu-20.04 @@ -111,6 +115,7 @@ jobs: extra_cmake_flags: -DUSE_WERROR=on extra_cxxflags: "" install_dependencies_manually: false + run_build: true run_tests: false - name: Werror clang os: ubuntu-20.04 @@ -122,6 +127,7 @@ jobs: extra_cmake_flags: -DUSE_WERROR=on extra_cxxflags: "" install_dependencies_manually: false + run_build: true run_tests: false - name: No compatibility os: ubuntu-20.04 @@ -134,6 +140,7 @@ jobs: extra_cxxflags: "-DCRYFS_NO_COMPATIBILITY" extra_env_vars_for_test: "" install_dependencies_manually: false + run_build: true run_tests: true - name: ASAN os: ubuntu-20.04 @@ -148,6 +155,7 @@ jobs: extra_cxxflags: "-O1 -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-common -fsanitize-address-use-after-scope" extra_env_vars_for_test: ASAN_OPTIONS="detect_leaks=1 check_initialization_order=1 detect_stack_use_after_return=1 detect_invalid_pointer_pairs=1 atexit=1" install_dependencies_manually: false + run_build: true run_tests: true - name: UBSAN os: ubuntu-20.04 @@ -162,6 +170,7 @@ jobs: extra_cxxflags: "-O1 -fno-sanitize-recover=undefined,nullability,implicit-conversion,unsigned-integer-overflow,local-bounds,float-divide-by-zero -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-common" extra_env_vars_for_test: UBSAN_OPTIONS="print_stacktrace=1" install_dependencies_manually: false + run_build: true run_tests: true - name: TSAN os: ubuntu-20.04 @@ -173,9 +182,25 @@ jobs: extra_cmake_flags: "" extra_cxxflags: "-O2 -fsanitize=thread -fno-omit-frame-pointer -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-common" install_dependencies_manually: false + run_build: true run_tests: true gtest_args: "--gtest_filter=-LoggingTest.LoggingAlsoWorksAfterFork:AssertTest_*:BacktraceTest.*:SignalCatcherTest.*_thenDies:SignalHandlerTest.*_thenDies:SignalHandlerTest.givenMultipleSigIntHandlers_whenRaising_thenCatchesCorrectSignal:CliTest_Setup.*:CliTest_IntegrityCheck.*:*/CliTest_WrongEnvironment.*:CliTest_Unmount.*:CliTest.WorksWithCommasInBasedir" extra_env_vars_for_test: OMP_NUM_THREADS=1 + # TODO Update to clang-tidy-11 + - name: clang-tidy + os: ubuntu-20.04 + compiler: + cxx: clang++-9 + cc: clang-9 + apt_package: clang++-9 clang-tidy-9 + build_type: RelWithDebInfo + extra_cmake_flags: "" + extra_cxxflags: "" + install_dependencies_manually: false + run_build: false + run_tests: false + extra_env_vars_for_test: "" + run_clang_tidy: true runs-on: ${{matrix.os}} env: # Setting conan cache dir to a location where our Github Cache Action can find it @@ -184,41 +209,17 @@ jobs: - name: Checkout uses: actions/checkout@v1 #TODO Ideally, all the setup actions would be in their own subaction, but Github doesn't support using third party actions (e.g. cache) from nested actions yet, see https://github.com/actions/runner/issues/862 - - name: Install OSX dependencies + - name: Setup MacOS if: ${{ runner.os == 'macOS' }} - shell: bash - run: | - brew install ninja macfuse libomp ccache md5sha1sum ${{matrix.compiler.homebrew_package}} - - name: Install Linux dependencies + uses: ./.github/workflows/actions/setup_macos + with: + extra_homebrew_packages: ${{ matrix.compiler.homebrew_package }} + - name: Setup Linux if: ${{ runner.os == 'Linux' }} - shell: bash - run: | - if [[ "${{matrix.os}}" == "ubuntu-18.04" ]]; then - echo Adding apt repositories for newer clang versions on Ubuntu 18.04 - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - - sudo touch /etc/apt/sources.list.d/clang.list - sudo chmod o+w /etc/apt/sources.list.d/clang.list - echo "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main" >> /etc/apt/sources.list.d/clang.list - echo "deb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main" >> /etc/apt/sources.list.d/clang.list - sudo chmod o-w /etc/apt/sources.list.d/clang.list - elif [[ "${{matrix.os}}" == "ubuntu-20.04" ]]; then - echo Adding apt repositories for newer clang versions on Ubuntu 20.04 - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - - sudo touch /etc/apt/sources.list.d/clang.list - sudo chmod o+w /etc/apt/sources.list.d/clang.list - echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-11 main" >> /etc/apt/sources.list.d/clang.list - echo "deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-11 main" >> /etc/apt/sources.list.d/clang.list - sudo chmod o-w /etc/apt/sources.list.d/clang.list - fi - sudo apt-get update - sudo apt-get install ninja-build libcurl4-openssl-dev libfuse-dev ccache ${{matrix.compiler.apt_package}} - - name: Speed up random generator - if: ${{ runner.os == 'Linux' }} - run: | - set -v - # Use /dev/urandom when /dev/random is accessed to use less entropy - sudo cp -a /dev/urandom /dev/random - shell: bash + uses: ./.github/workflows/actions/setup_linux + with: + os: ${{ matrix.os }} + extra_apt_packages: ${{ matrix.compiler.apt_package }} - name: Install local dependencies if: ${{ matrix.install_dependencies_manually }} uses: ./.github/workflows/actions/install_local_dependencies @@ -289,7 +290,7 @@ jobs: aws-secret-access-key: ${{ secrets.CACHE_AWS_SECRET_ACCESS_KEY }} aws-region: ${{ secrets.CACHE_AWS_REGION }} bucket: ${{ secrets.CACHE_AWS_S3_BUCKET }} - key: v0-${{ runner.os }}-${{ matrix.os }}-ccache__${{matrix.compiler.cxx}}__${{matrix.compiler.cc}}__${{matrix.build_type}}__${{steps.hash_flags.outputs.hash_flags}}__ + key: v0-${{ runner.os }}-${{ matrix.os }}-ccache__${{matrix.compiler.cxx}}__${{matrix.compiler.cc}}__${{matrix.build_type}}__${{matrix.run_build}}__${{matrix.run_clang_tidy}}__${{steps.hash_flags.outputs.hash_flags}}__ - name: Show ccache statistics shell: bash run: | @@ -307,14 +308,14 @@ jobs: bucket: ${{ secrets.CACHE_AWS_S3_BUCKET }} key: v0-${{ runner.os }}-${{ matrix.os }}-conancache__${{matrix.compiler.cxx}}__${{matrix.compiler.cc}}__${{matrix.build_type}}__ - name: Build (macOS) - if: ${{ runner.os == 'macOS' }} + if: ${{ matrix.run_build && runner.os == 'macOS' }} uses: ./.github/workflows/actions/run_build with: cxx: ${{ matrix.compiler.macos_cxx }} cc: ${{ matrix.compiler.macos_cc }} build_type: ${{ matrix.build_type }} - name: Build (Linux) - if: ${{ runner.os == 'Linux' }} + if: ${{ matrix.run_build && runner.os == 'Linux' }} uses: ./.github/workflows/actions/run_build with: cxx: ${{ matrix.compiler.cxx }} @@ -322,6 +323,27 @@ jobs: build_type: ${{ matrix.build_type }} extra_cmake_flags: ${{ matrix.extra_cmake_flags }} extra_cxxflags: ${{ matrix.extra_cxxflags }} + - name: Run clang-tidy + if: ${{ matrix.run_clang_tidy }} + shell: bash + run: | + set -v + mkdir cmake + cd cmake + if ! ../run-clang-tidy.sh -fix ; then + git diff > /tmp/clang-tidy-fixes + echo Found clang tidy fixes: + cat /tmp/clang-tidy-fixes + exit 1 + else + echo Did not find any clang-tidy fixes + fi + - name: Upload fixes as artifact + if: ${{ matrix.run_clang_tidy }} + uses: actions/upload-artifact@v2 + with: + name: clang-tidy-fixes + path: /tmp/clang-tidy-fixes - name: Show ccache statistics shell: bash run: | @@ -342,7 +364,7 @@ jobs: aws-secret-access-key: ${{ secrets.CACHE_AWS_SECRET_ACCESS_KEY }} aws-region: ${{ secrets.CACHE_AWS_REGION }} bucket: ${{ secrets.CACHE_AWS_S3_BUCKET }} - key: v0-${{ runner.os }}-${{ matrix.os }}-ccache__${{matrix.compiler.cxx}}__${{matrix.compiler.cc}}__${{matrix.build_type}}__${{steps.hash_flags.outputs.hash_flags}}__ + key: v0-${{ runner.os }}-${{ matrix.os }}-ccache__${{matrix.compiler.cxx}}__${{matrix.compiler.cc}}__${{matrix.build_type}}__${{matrix.run_build}}__${{matrix.run_clang_tidy}}__${{steps.hash_flags.outputs.hash_flags}}__ artifacts: ${{ github.workspace }}/.ccache - name: Save conan cache uses: leroy-merlin-br/action-s3-cache@8d75079437b388688b9ea9c7d73dff4ef975c5fa # v1.0.5 @@ -359,4 +381,4 @@ jobs: uses: ./.github/workflows/actions/run_tests with: gtest_args: ${{matrix.gtest_args}} - extra_env_vars: ${{matrix.extra_env_vars_for_test}} \ No newline at end of file + extra_env_vars: ${{matrix.extra_env_vars_for_test}} diff --git a/run-clang-tidy.sh b/run-clang-tidy.sh index 13676880..5396a153 100755 --- a/run-clang-tidy.sh +++ b/run-clang-tidy.sh @@ -8,15 +8,19 @@ set -e +CXX=clang++-9 +CC=clang-9 +SCRIPT=run-clang-tidy-9.py + export NUMCORES=`nproc` && if [ ! -n "$NUMCORES" ]; then export NUMCORES=`sysctl -n hw.ncpu`; fi echo Using ${NUMCORES} cores # Run cmake in current working directory, but on source that is in the same directory as this script file -cmake -DBUILD_TESTING=on -DCMAKE_EXPORT_COMPILE_COMMANDS=ON "${0%/*}" +cmake -DBUILD_TESTING=on -DCMAKE_CXX_COMPILER=${CXX} -DCMAKE_C_COMPILER=${CC} -DCMAKE_EXPORT_COMPILE_COMMANDS=ON "${0%/*}" # Filter all third party code from the compilation database cat compile_commands.json|jq "map(select(.file | test(\"^$(realpath ${0%/*})/(src|test)/.*$\")))" > compile_commands2.json rm compile_commands.json mv compile_commands2.json compile_commands.json -run-clang-tidy-9.py -j${NUMCORES} -quiet -header-filter "$(realpath ${0%/*})/(src|test)/.*" $@ +${SCRIPT} -j${NUMCORES} -quiet -header-filter "$(realpath ${0%/*})/(src|test)/.*" $@