diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a6ad5dfd6d..331089dabc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -39,25 +39,29 @@ variables: # In multithreaded unit tests, abort on the first failure CMOCKA_TEST_ABORT: 1 - # Disable pytest's "cacheprovider" plugin to prevent it from creating - # cross-testrun files as there is no need to use that feature in CI. - PYTEST_ADDOPTS: "-p no:cacheprovider" - # Default platforms to run "stress" tests on BIND_STRESS_TEST_OS: linux BIND_STRESS_TEST_ARCH: amd64 + SHOTGUN_SCENARIO: + value: "udp" + description: "protocol combination to be tested, must be one of https://gitlab.nic.cz/knot/resolver-benchmarking/-/tree/master/roles/shotgun/files" + SHOTGUN_DURATION: + value: 60 + description: "test length in seconds" + SHOTGUN_TRAFFIC_MULTIPLIER: + value: 10 + description: "multiply client traffic, base value 1 = roughly 8 k QPS" + SHOTGUN_PERF_PROFILER: + value: "true" + description: "true/false = enable/disable profiling, disable for runs longer than 1 minute" + EXPERIMENT_CUSTOM_VERSION: + value: "$CI_COMMIT_SHA" + description: "DO NOT USE; this field does nothing for now" + stages: - - autoconf - - precheck - - build - - unit - - system - performance - - docs - - push - - postcheck - - release + - performance2 ### Runner Tag Templates @@ -215,7 +219,6 @@ stages: --disable-maintainer-mode \ --enable-developer \ --enable-option-checking=fatal \ - --enable-dnstap \ --with-cmocka \ --with-libxml2 \ --with-json-c \ @@ -430,1068 +433,32 @@ stages: # Jobs in the precheck stage -autoreconf: - <<: *autoconf_job - -misc: - <<: *precheck_job - script: - - sh util/checklibs.sh > checklibs.out - - sh util/tabify-changes < CHANGES > CHANGES.tmp - - diff -urNap CHANGES CHANGES.tmp - - perl util/check-changes CHANGES - - sh util/check-line-length.sh CHANGES - - test ! -f CHANGES.SE || sh util/tabify-changes < CHANGES.SE > CHANGES.tmp - - test ! -f CHANGES.SE || diff -urNap CHANGES.SE CHANGES.tmp - - test ! -f CHANGES.SE || perl util/check-changes master=0 CHANGES.SE - - test ! -f CHANGES.SE || sh util/check-line-length.sh CHANGES.SE - - rm CHANGES.tmp - - perl -w util/merge_copyrights - - diff -urNap util/copyrights util/newcopyrights - - rm util/newcopyrights - - perl -w util/update_copyrights < util/copyrights - - if test "$(git status --porcelain | grep -Ev '\?\?' | wc -l)" -gt "0"; then git status --short; exit 1; fi - - xmllint --noout --nonet `git ls-files '*.xml' '*.docbook'` - - sh util/check-win32util-configure - - sh util/check-categories.sh - - if git grep SYSTEMTESTTOP -- ':!.gitlab-ci.yml'; then echo 'Please use relative paths instead of $SYSTEMTESTTOP.'; exit 1; fi - - bash util/unused-headers.sh - needs: [] - artifacts: - paths: - - util/newcopyrights - - checklibs.out - expire_in: "1 day" - when: on_failure - -clang-format: - <<: *precheck_job - needs: [] - script: - - if [ -r .clang-format ]; then "${CLANG_FORMAT}" -i -style=file $(git ls-files '*.c' '*.h'); fi - - if test "$(git status --porcelain | grep -Ev '\?\?' | wc -l)" -gt "0"; then git status --short; exit 1; fi - -coccinelle: - <<: *precheck_job - needs: [] - script: - - util/check-cocci - - if test "$(git status --porcelain | grep -Ev '\?\?' | wc -l)" -gt "0"; then git status --short; exit 1; fi - -danger: - <<: *precheck_job - needs: [] - script: - - danger-python ci -f - only: - refs: - - merge_requests - variables: - - $DANGER_GITLAB_API_TOKEN - -flake8: - <<: *default_triggering_rules - <<: *base_image - stage: postcheck - needs: - - job: autoreconf - artifacts: true - script: - - *configure - - flake8 --max-line-length=80 $(git ls-files '*.py' | grep -vE '(ans\.py|dangerfile\.py)') - -pylint: - <<: *default_triggering_rules - <<: *base_image - stage: postcheck - needs: - - job: autoreconf - artifacts: true - script: - - *configure - - PYTHONPATH="$PYTHONPATH:$CI_PROJECT_DIR/bin/python" - - pylint --rcfile $CI_PROJECT_DIR/.pylintrc $(git ls-files '*.py' | grep -vE '(ans\.py|dangerfile\.py)') - -tarball-create: - stage: precheck - <<: *base_image - <<: *default_triggering_rules - script: - - ./configure --enable-maintainer-mode - - make maintainer-clean - - autoreconf -fi - - ./configure --enable-maintainer-mode - - make -j${BUILD_PARALLEL_JOBS:-1} all V=1 - - if test "$(git status --porcelain | grep -Ev '\?\?' | wc -l)" -gt "0"; then git status --short; exit 1; fi - - make -j${BUILD_PARALLEL_JOBS:-1} dist V=1 - artifacts: - paths: - - bind-*.tar.${TARBALL_EXTENSION} - needs: - - job: autoreconf - artifacts: true - -# Jobs for doc builds on Debian 10 "buster" (amd64) - -docs: - <<: *release_branch_triggering_rules - <<: *base_image - stage: docs - before_script: - - test -w "${CCACHE_DIR}" && export PATH="/usr/lib/ccache:${PATH}" - script: - - *configure - - make -j${BUILD_PARALLEL_JOBS:-1} -k doc V=1 - - qpdf --check doc/arm/_build/latex/Bv9ARM.pdf - - find doc/man/ -maxdepth 1 -name "*.[0-9]" -exec mandoc -T lint "{}" \; | ( ! grep -v -e "skipping paragraph macro. sp after" -e "unknown font, skipping request. ft C" ) - needs: - - job: autoreconf - artifacts: true - allow_failure: false - artifacts: - paths: - - doc/arm/ - - doc/man/ - - doc/misc/ - expire_in: "1 month" - -push:docs: - <<: *base_image - stage: push - needs: - - job: docs - artifacts: false - script: - - curl -X POST -F token=$GITLAB_PAGES_DOCS_TRIGGER_TOKEN -F ref=main $GITLAB_PAGES_DOCS_TRIGGER_URL - only: - - main@isc-projects/bind9 - - /^v9_[1-9][0-9]$/@isc-projects/bind9 - -# Jobs for regular GCC builds on Alpine Linux 3.13 (amd64) - -gcc:alpine3.13:amd64: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON}" - EXTRA_CONFIGURE: "${WITHOUT_READLINE}" - <<: *alpine_3_13_amd64_image - <<: *build_job - -system:gcc:alpine3.13:amd64: - <<: *alpine_3_13_amd64_image - <<: *system_test_job - needs: - - job: gcc:alpine3.13:amd64 - artifacts: true - -unit:gcc:alpine3.13:amd64: - <<: *alpine_3_13_amd64_image - <<: *unit_test_job - needs: - - job: gcc:alpine3.13:amd64 - artifacts: true - -# Jobs for regular GCC builds on CentOS 7 (amd64) - -gcc:centos7:amd64: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON}" - EXTRA_CONFIGURE: "--with-libidn2" - <<: *centos_centos7_amd64_image - <<: *build_job - -system:gcc:centos7:amd64: - <<: *centos_centos7_amd64_image - <<: *system_test_job - needs: - - job: gcc:centos7:amd64 - artifacts: true - -unit:gcc:centos7:amd64: - <<: *centos_centos7_amd64_image - <<: *unit_test_job - needs: - - job: gcc:centos7:amd64 - artifacts: true - -# Jobs for regular GCC builds on CentOS 8 (amd64) - -gcc:centos8:amd64: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON}" - EXTRA_CONFIGURE: "--enable-buffer-useinline --with-libidn2" - <<: *centos_centos8_amd64_image - <<: *build_job - -system:gcc:centos8:amd64: - <<: *centos_centos8_amd64_image - <<: *system_test_job - needs: - - job: gcc:centos8:amd64 - artifacts: true - -unit:gcc:centos8:amd64: - <<: *centos_centos8_amd64_image - <<: *unit_test_job - needs: - - job: gcc:centos8:amd64 - artifacts: true - -# Jobs for regular GCC builds on Debian 9 "stretch" (amd64) - -gcc:stretch:amd64: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON} -O2" - EXTRA_CONFIGURE: "--without-cmocka --without-gssapi" - <<: *debian_stretch_amd64_image - <<: *build_job - -system:gcc:stretch:amd64: - <<: *debian_stretch_amd64_image - <<: *system_test_job - needs: - - job: gcc:stretch:amd64 - artifacts: true - -unit:gcc:stretch:amd64: - <<: *debian_stretch_amd64_image - <<: *unit_test_job - needs: - - job: gcc:stretch:amd64 - artifacts: true - -# Jobs for regular GCC builds on Debian 10 "buster" (amd64) - -gcc:buster:amd64: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON} --coverage -O0" - EXTRA_CONFIGURE: "--with-libidn2 ${WITH_READLINE_LIBEDIT}" - <<: *debian_buster_amd64_image - <<: *build_job - -system:gcc:buster:amd64: - <<: *debian_buster_amd64_image - <<: *system_test_gcov_job - needs: - - job: unit:gcc:buster:amd64 - artifacts: true - -unit:gcc:buster:amd64: - <<: *debian_buster_amd64_image - <<: *unit_test_gcov_job - needs: - - job: gcc:buster:amd64 - artifacts: true - -# Jobs for scan-build builds on Debian 10 "buster" (amd64) - -.scan_build: &scan_build | - ${SCAN_BUILD} --html-title="BIND 9 ($CI_COMMIT_SHORT_SHA)" \ - --keep-cc \ - --status-bugs \ - --keep-going \ - -o scan-build.reports \ - make -j${BUILD_PARALLEL_JOBS:-1} all V=1 - -scan-build: - <<: *default_triggering_rules - <<: *base_image - stage: postcheck - variables: - CC: "${CLANG}" - CFLAGS: "${CFLAGS_COMMON}" - CONFIGURE: "${SCAN_BUILD} ./configure" - EXTRA_CONFIGURE: "--with-libidn2" - script: - - *configure - - *scan_build - needs: - - job: autoreconf - artifacts: true - artifacts: - paths: - - scan-build.reports/ - expire_in: "1 day" - when: on_failure - -# Jobs for regular GCC builds on Debian "sid" (amd64) -# Also tests configration option: --without-lmdb. - -gcc:sid:amd64: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON} -O3" - EXTRA_CONFIGURE: "--with-libidn2 --without-lmdb" - RUN_MAKE_INSTALL: 1 - <<: *debian_sid_amd64_image - <<: *build_job - -system:gcc:sid:amd64: - <<: *debian_sid_amd64_image - <<: *system_test_job - needs: - - job: gcc:sid:amd64 - artifacts: true - -unit:gcc:sid:amd64: - <<: *debian_sid_amd64_image - <<: *unit_test_job - needs: - - job: gcc:sid:amd64 - artifacts: true - -cppcheck: - <<: *base_image - <<: *cppcheck_job - -# Job for out-of-tree GCC build on Debian "sid" (amd64) -# Also tests configration option: --with-lmdb. - -gcc:out-of-tree: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON} -Og" - CONFIGURE: "${CI_PROJECT_DIR}/configure" - EXTRA_CONFIGURE: "--with-libidn2 --with-lmdb" - RUN_MAKE_INSTALL: 1 - OUT_OF_TREE_WORKSPACE: /tmp/out_of_tree_workspace - <<: *base_image - <<: *build_job - -system:gcc:out-of-tree: - variables: - OUT_OF_TREE_WORKSPACE: /tmp/out_of_tree_workspace - needs: - - job: gcc:out-of-tree - artifacts: true - <<: *base_image - <<: *system_test_job - only: - - schedules - - tags - - web - -# Jobs for tarball GCC builds on Debian 10 "buster" (amd64) - -gcc:tarball: - variables: - CC: gcc - EXTRA_CONFIGURE: "--with-libidn2" - RUN_MAKE_INSTALL: 1 - <<: *base_image - <<: *build_job - before_script: - - tar --extract --file bind-*.tar.${TARBALL_EXTENSION} - - rm -f bind-*.tar.${TARBALL_EXTENSION} - - cd bind-* - needs: - - job: tarball-create - artifacts: true - only: - - schedules - - tags - - web - -system:gcc:tarball: - <<: *base_image - <<: *system_test_job - before_script: - - cd bind-* - - *setup_interfaces - needs: - - job: gcc:tarball - artifacts: true - only: - - schedules - - tags - - web - -unit:gcc:tarball: - <<: *base_image - <<: *unit_test_job - before_script: - - cd bind-* - needs: - - job: gcc:tarball - artifacts: true - only: - - schedules - - tags - - web - -# Jobs for debug GCC builds on openSUSE Tumbleweed (amd64) - -gcc:tumbleweed:amd64: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON} -DDEBUG" - EXTRA_CONFIGURE: "--with-libidn2 ${WITH_READLINE_READLINE}" - <<: *tumbleweed_latest_amd64_image - <<: *build_job - -system:gcc:tumbleweed:amd64: - <<: *tumbleweed_latest_amd64_image - <<: *system_test_job - needs: - - job: gcc:tumbleweed:amd64 - artifacts: true - -unit:gcc:tumbleweed:amd64: - <<: *tumbleweed_latest_amd64_image - <<: *unit_test_job - needs: - - job: gcc:tumbleweed:amd64 - artifacts: true - -# Jobs for regular GCC builds on Ubuntu 20.04 Focal Fossa (amd64) - -gcc:focal:amd64: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON} -Og" - EXTRA_CONFIGURE: "--with-libidn2" - <<: *ubuntu_focal_amd64_image - <<: *build_job - -system:gcc:focal:amd64: - <<: *ubuntu_focal_amd64_image - <<: *system_test_job - needs: - - job: gcc:focal:amd64 - artifacts: true - -unit:gcc:focal:amd64: - <<: *ubuntu_focal_amd64_image - <<: *unit_test_job - needs: - - job: gcc:focal:amd64 - artifacts: true - -# Jobs for ASAN builds on Debian 10 "buster" (amd64) - -gcc:asan: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON} -fsanitize=address,undefined" - LDFLAGS: "-fsanitize=address,undefined" - EXTRA_CONFIGURE: "--with-libidn2" - <<: *base_image - <<: *build_job - -system:gcc:asan: - variables: - ASAN_OPTIONS: ${ASAN_OPTIONS_COMMON} - <<: *base_image - <<: *system_test_job - needs: - - job: gcc:asan - artifacts: true - -unit:gcc:asan: - variables: - ASAN_OPTIONS: ${ASAN_OPTIONS_COMMON} - <<: *base_image - <<: *unit_test_job - needs: - - job: gcc:asan - artifacts: true - -clang:asan: - variables: - CC: ${CLANG} - CFLAGS: "${CFLAGS_COMMON} -fsanitize=address,undefined" - LDFLAGS: "-fsanitize=address,undefined" - EXTRA_CONFIGURE: "--with-libidn2" - <<: *base_image - <<: *build_job - -system:clang:asan: - variables: - ASAN_OPTIONS: ${ASAN_OPTIONS_COMMON} - <<: *base_image - <<: *system_test_job - needs: - - job: clang:asan - artifacts: true - -unit:clang:asan: - variables: - ASAN_OPTIONS: ${ASAN_OPTIONS_COMMON} - <<: *base_image - <<: *unit_test_job - needs: - - job: clang:asan - artifacts: true - -# Jobs for TSAN builds on Debian 10 "buster" (amd64) - -gcc:tsan: - <<: *base_image - <<: *build_job - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON} -fsanitize=thread" - LDFLAGS: "-fsanitize=thread" - EXTRA_CONFIGURE: "--with-libidn2 --enable-pthread-rwlock" - -system:gcc:tsan: - variables: - TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON} - <<: *base_image - <<: *system_test_tsan_job - needs: - - job: gcc:tsan - artifacts: true - -unit:gcc:tsan: - variables: - TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON} suppressions=$CI_PROJECT_DIR/tsan-suppressions.txt - <<: *base_image - <<: *unit_test_tsan_job - needs: - - job: gcc:tsan - artifacts: true - -clang:tsan: - <<: *base_image - <<: *build_job - variables: - CC: "${CLANG}" - CFLAGS: "${CFLAGS_COMMON} -fsanitize=thread" - LDFLAGS: "-fsanitize=thread" - EXTRA_CONFIGURE: "--with-libidn2 --enable-pthread-rwlock" - -system:clang:tsan: - variables: - TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON} - <<: *base_image - <<: *system_test_tsan_job - needs: - - job: clang:tsan - artifacts: true - -unit:clang:tsan: - variables: - TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON} suppressions=$CI_PROJECT_DIR/tsan-suppressions.txt - <<: *base_image - <<: *unit_test_tsan_job - needs: - - job: clang:tsan - artifacts: true - -# Jobs for builds with mutex-based atomics on Debian 10 "buster" (amd64) - -gcc:mutexatomics: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON}" - EXTRA_CONFIGURE: "--with-libidn2 --enable-mutex-atomics" - <<: *base_image - <<: *build_job - -system:gcc:mutexatomics: - <<: *base_image - <<: *system_test_job - needs: - - job: gcc:mutexatomics - artifacts: true - -unit:gcc:mutexatomics: - <<: *base_image - <<: *unit_test_job - needs: - - job: gcc:mutexatomics - artifacts: true - -# Jobs for Clang builds on Debian 10 "buster" (amd64) - -clang:buster:amd64: - variables: - CC: ${CLANG} - CFLAGS: "${CFLAGS_COMMON} -Wenum-conversion" - <<: *debian_buster_amd64_image - <<: *build_job - -system:clang:buster:amd64: - <<: *debian_buster_amd64_image - <<: *system_test_job - needs: - - job: clang:buster:amd64 - artifacts: true - -unit:clang:buster:amd64: - <<: *debian_buster_amd64_image - <<: *unit_test_job - needs: - - job: clang:buster:amd64 - artifacts: true - -# Jobs for PKCS#11-enabled GCC builds on Debian "sid" (amd64) - -gcc:softhsm2.4: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON}" - EXTRA_CONFIGURE: "--enable-native-pkcs11 --with-pkcs11=/usr/lib/softhsm/libsofthsm2.so" - <<: *base_image - <<: *build_job - -system:gcc:softhsm2.4: - <<: *base_image - <<: *system_test_job - needs: - - job: gcc:softhsm2.4 - artifacts: true - -unit:gcc:softhsm2.4: - <<: *base_image - <<: *unit_test_job - needs: - - job: gcc:softhsm2.4 - artifacts: true - -# Jobs for PKCS#11-enabled GCC builds on Fedora 33 (amd64) - -gcc:softhsm2.6: - variables: - CC: gcc - CFLAGS: "${CFLAGS_COMMON} -O1" - EXTRA_CONFIGURE: "--with-libidn2 --enable-native-pkcs11 --with-pkcs11=/usr/lib64/pkcs11/libsofthsm2.so" - <<: *fedora_33_amd64_image - <<: *build_job - -system:gcc:softhsm2.6: - <<: *fedora_33_amd64_image - <<: *system_test_job - needs: - - job: gcc:softhsm2.6 - artifacts: true - -unit:gcc:softhsm2.6: - <<: *fedora_33_amd64_image - <<: *unit_test_job - needs: - - job: gcc:softhsm2.6 - artifacts: true - -# Jobs for Clang builds on FreeBSD 11 (amd64) - -clang:freebsd11:amd64: - variables: - CFLAGS: "${CFLAGS_COMMON}" - EXTRA_CONFIGURE: "${WITH_READLINE}" - USER: gitlab-runner - <<: *freebsd_11_amd64_image - <<: *build_job - -system:clang:freebsd11:amd64: - <<: *freebsd_11_amd64_image - <<: *system_test_job - variables: - USER: gitlab-runner - TEST_PARALLEL_JOBS: 4 - needs: - - job: clang:freebsd11:amd64 - artifacts: true - -unit:clang:freebsd11:amd64: - <<: *freebsd_11_amd64_image - <<: *unit_test_job - needs: - - job: clang:freebsd11:amd64 - artifacts: true - -# Jobs for Clang builds on FreeBSD 12 (amd64) - -clang:freebsd12:amd64: - variables: - CFLAGS: "${CFLAGS_COMMON}" - EXTRA_CONFIGURE: "${WITH_READLINE_EDITLINE}" - USER: gitlab-runner - <<: *freebsd_12_amd64_image - <<: *build_job - -system:clang:freebsd12:amd64: - <<: *freebsd_12_amd64_image - <<: *system_test_job - variables: - USER: gitlab-runner - TEST_PARALLEL_JOBS: 4 - needs: - - job: clang:freebsd12:amd64 - artifacts: true - -unit:clang:freebsd12:amd64: - <<: *freebsd_12_amd64_image - <<: *unit_test_job - needs: - - job: clang:freebsd12:amd64 - artifacts: true - -# Jobs for Clang builds on OpenBSD (amd64) - -clang:openbsd:amd64: - variables: - CC: clang - USER: gitlab-runner - EXTRA_CONFIGURE: "--disable-dnstap" - <<: *openbsd_amd64_image - <<: *build_job - -system:clang:openbsd:amd64: - <<: *openbsd_amd64_image - <<: *system_test_job - variables: - USER: gitlab-runner - needs: - - job: clang:openbsd:amd64 - artifacts: true - only: - - schedules - - web - -unit:clang:openbsd:amd64: - <<: *openbsd_amd64_image - <<: *unit_test_job - variables: - USER: gitlab-runner - # There's no socket option on OpenBSD, so we need to set this globally - TCP_CONNECTIONTIMEOUT: 1 - needs: - - job: clang:openbsd:amd64 - artifacts: true - -# Jobs for Visual Studio 2017 builds on Windows (amd64) - -msvc:windows:amd64: - <<: *windows_server_2016_amd64_image - <<: *windows_build_job - <<: *default_triggering_rules - variables: - VSCONF: Release - -system:msvc:windows:amd64: - <<: *windows_server_2016_amd64_image - <<: *windows_system_test_job - variables: - VSCONF: Release - needs: - - job: msvc:windows:amd64 - artifacts: true - -msvc-debug:windows:amd64: - <<: *windows_server_2016_amd64_image - <<: *windows_build_job - variables: - VSCONF: Debug - only: - - schedules - - tags - - web - -system:msvc-debug:windows:amd64: - <<: *windows_server_2016_amd64_image - <<: *windows_system_test_job - variables: - VSCONF: Debug - needs: - - job: msvc-debug:windows:amd64 - artifacts: true - -# Job producing a release tarball - -release: - <<: *base_image - stage: release - script: - - export BIND_DIRECTORY="$(basename "$(find . -name "bind-*.tar.*" -printf "%f")" ".tar.${TARBALL_EXTENSION}")" - # Remove redundant files and system test utilities from Windows build artifacts - - find Build/Release/ -name "*.pdb" -print -delete - - find Build/Debug/ \( -name "*.bsc" -o -name "*.idb" \) -print -delete - - find Build/ -regextype posix-extended -regex "Build/.*/($(find bin/tests/ -type f | sed -nE "s|^bin/tests(/system)?/win32/(.*)\.vcxproj$|\2|p" | paste -d"|" -s))\..*" -print -delete - # Create Windows zips - - openssl dgst -sha256 "${BIND_DIRECTORY}.tar.${TARBALL_EXTENSION}" | tee Build/Release/SHA256 Build/Debug/SHA256 - - cp "doc/arm/_build/latex/Bv9ARM.pdf" Build/Release/ - - cp "doc/arm/_build/latex/Bv9ARM.pdf" Build/Debug/ - - ( cd Build/Release; zip "../../BIND${BIND_DIRECTORY#bind-}.x64.zip" * ) - - ( cd Build/Debug; zip "../../BIND${BIND_DIRECTORY#bind-}.debug.x64.zip" * ) - # Prepare release tarball contents (tarballs + zips + documentation) - - mkdir -p release/doc/arm - - pushd release - - mv "../${BIND_DIRECTORY}.tar.${TARBALL_EXTENSION}" ../BIND*.zip . - - tar --extract --file="${BIND_DIRECTORY}.tar.${TARBALL_EXTENSION}" - - mv "${BIND_DIRECTORY}"/{CHANGES*,COPYRIGHT,LICENSE,README.md,srcid} . - - rm -rf "${BIND_DIRECTORY}" - - mv "../doc/arm/_build/html" doc/arm/ - - mv "../doc/arm/_build/latex/Bv9ARM.pdf" doc/arm/ - - mv "../doc/arm/_build/epub/Bv9ARM.epub" doc/arm/ - - echo '