Migrate to github actions
Not all combinations are migrated to the initial configuration; corresponding TODOs added.
Drive-by: additional combinations uncovered minor portability problems -> fixed
Drive-by: remove no-longer used "script" files.
diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml
new file mode 100644
index 0000000..9324847
--- /dev/null
+++ b/.github/workflows/build_test.yml
@@ -0,0 +1,382 @@
+# Copyright 2021 Google Inc. All Rights Reserved.
+#
+# Distributed under MIT license.
+# See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+
+# Workflow for building and running tests under Ubuntu
+
+name: Build/Test
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ types: [opened, reopened, labeled, synchronize]
+
+jobs:
+ ubuntu_build:
+ name: Build and test ${{ matrix.name }}
+ runs-on: ${{ matrix.os || 'ubuntu-latest' }}
+ defaults:
+ run:
+ shell: bash
+ strategy:
+ matrix:
+ include:
+ # TODO: consider running this combination in docker
+ #- name: cmake:gcc4.4
+
+ # TODO: consider running this combination in docker
+ #- name: cmake:gcc7
+
+ - name: cmake:gcc9
+ build_system: cmake
+ c_compiler: gcc-9
+ cxx_compiler: g++-9
+ os: ubuntu-18.04
+
+ # TODO: consider running this combination in docker
+ #- name: cmake:clang3.5
+
+ - name: cmake:clang12
+ build_system: cmake
+ c_compiler: clang-12
+ cxx_compiler: clang++12
+
+ - name: cmake:clang12:asan
+ build_system: cmake
+ sanitizer: address
+ c_compiler: clang-12
+ cxx_compiler: clang++12
+
+ - name: cmake:clang12:tsan
+ build_system: cmake
+ sanitizer: thread
+ c_compiler: clang-12
+ cxx_compiler: clang++12
+
+ - name: cmake:clang12:ubsan
+ build_system: cmake
+ sanitizer: undefined
+ c_compiler: clang-12
+ cxx_compiler: clang++-12
+ c_flags: -fno-sanitize-recover=undefined,integer
+
+ - name: cmake:qemu-arm-neon-gcc
+ build_system: cmake
+ c_compiler: arm-linux-gnueabihf-gcc
+ cxx_compiler: arm-linux-gnueabihf-g++
+ c_flags: -march=armv7-a -mfloat-abi=hard -mfpu=neon
+ extra_apt_pkgs: gcc-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-user
+
+ - name: cmake-osx:clang
+ build_system: cmake
+ c_compiler: clang
+ cxx_compiler: clang++
+ os: macos-latest
+
+ - name: cmake-osx:gcc
+ build_system: cmake
+ c_compiler: gcc
+ cxx_compiler: g++
+ os: macos-latest
+
+ - name: cmake-win64:msvc2017-rel
+ build_system: cmake
+ cmake_generator: Visual Studio 15 2017 Win64
+ cmake_config: Release
+ os: windows-2016
+
+ - name: cmake-win64:msvc2017-dbg
+ build_system: cmake
+ cmake_generator: Visual Studio 15 2017 Win64
+ cmake_config: Debug
+ os: windows-2016
+
+ # TODO: consider running this combination in docker
+ #- name: autotools:gcc5
+
+ - name: autotools:gcc10
+ build_system: autotools
+ c_compiler: gcc-10
+ cxx_compiler: g++-10
+
+ - name: autotools:clang12
+ build_system: autotools
+ c_compiler: clang-12
+ cxx_compiler: clang++12
+
+ - name: fuzz:clang12
+ build_system: fuzz
+ c_compiler: clang-12
+ cxx_compiler: clang++12
+
+ # TODO: consider running this combination in docker
+ #- name: python2.7:gcc5
+
+ - name: python27:clang9
+ build_system: python
+ c_compiler: clang-9
+ python_version: 2.7
+ cxx_compiler: clang++-9
+ os: ubuntu-18.04
+
+ # TODO: consider running this combination in docker
+ #- name: python27-win
+ # build_system: python
+ # python_version: 2.7
+ # # TODO: investigate why win-builds can't run tests
+ # py_setuptools_cmd: build_ext
+ # os: windows-2016
+
+ # TODO: consider running this combination in docker
+ #- name: python3.6:gcc5
+
+ # TODO: consider running this combination in docker
+ #- name: python3.7:gcc5
+
+ # TODO: consider running this combination in docker
+ #- name: python3.8:gcc5
+
+ - name: python39:clang12
+ build_system: python
+ python_version: 3.9
+ c_compiler: clang-12
+ cxx_compiler: clang++-12
+
+ - name: python39-win
+ build_system: python
+ python_version: 3.9
+ # TODO: investigate why win-builds can't run tests
+ py_setuptools_cmd: build_ext
+ os: windows-2019
+
+ - name: maven
+ build_system: maven
+
+ - name: bazel:root
+ build_system: bazel
+ bazel_project: .
+
+ - name: bazel:go
+ build_system: bazel
+ bazel_project: go
+
+ - name: bazel:java
+ build_system: bazel
+ bazel_project: java
+
+ - name: bazel:js
+ build_system: bazel
+ bazel_project: js
+
+ - name: bazel:research
+ build_system: bazel
+ bazel_project: research
+
+ - name: bazel-osx:root
+ build_system: bazel
+ bazel_project: .
+ os: macos-latest
+
+ - name: bazel-osx:go
+ build_system: bazel
+ bazel_project: go
+ os: macos-latest
+
+ - name: bazel-osx:java
+ build_system: bazel
+ bazel_project: java
+ os: macos-latest
+
+ - name: bazel-osx:js
+ build_system: bazel
+ bazel_project: js
+ os: macos-latest
+
+ - name: bazel-osx:research
+ build_system: bazel
+ bazel_project: research
+ os: macos-latest
+
+ - name: bazel-win:root
+ build_system: bazel
+ bazel_project: .
+ os: windows-latest
+
+ # TODO: use single dll on windows, otherwise it fails to link
+ #- name: bazel-win:go
+ # build_system: bazel
+ # bazel_project: go
+ # os: windows-latest
+
+ - name: bazel-win:java
+ build_system: bazel
+ bazel_project: java
+ os: windows-latest
+
+ # TODO: blocked by Bazel Closure rules issue
+ #- name: bazel-win:js
+ # build_system: bazel
+ # bazel_project: js
+ # os: windows-latest
+
+ - name: bazel-win:research
+ build_system: bazel
+ bazel_project: research
+ os: windows-latest
+
+ - name: make
+ build_system: make
+
+ - name: make-osx
+ build_system: make
+ os: macos-latest
+
+ # TODO: add 32/64-bit x MSYS2/mingw/Cygwin toolchain support.
+ - name: make-win
+ build_system: make
+ os: windows-latest
+
+ env:
+ CC: ${{ matrix.c_compiler || 'gcc' }}
+ CXX: ${{ matrix.cxx_compiler || 'gcc' }}
+
+ steps:
+ - name: Install extra deps @ Ubuntu
+ if: ${{ runner.os == 'Linux' }}
+ # Already installed: bazel, clang{10-12}, cmake, gcc{9,10}, java{8,11}, maven, python{2.7,3.5-3.9}
+ run: |
+ EXTRA_PACKAGES="${{ matrix.extra_apt_pkgs || '' }}"
+ sudo apt update
+ sudo apt install -y ${EXTRA_PACKAGES}
+
+ - name: Checkout the source
+ uses: actions/checkout@v2
+ with:
+ submodules: false
+ fetch-depth: 1
+
+ #- name: Checkout VC9 for Python
+ # if: ${{ runner.os == 'Windows' && matrix.build_system == 'python' && matrix.python_version == '2.7' }}
+ # uses: actions/checkout@v2
+ # with:
+ # repository: reider-roque/sulley-win-installer
+ # path: third_party/VCForPython27
+
+ - name: Configure / Build / Test with CMake
+ if: ${{ matrix.build_system == 'cmake' }}
+ run: |
+ export ASAN_OPTIONS=detect_leaks=0
+ declare -a CMAKE_OPTIONS=()
+ CMAKE_OPTIONS+=("-DCMAKE_VERBOSE_MAKEFILE=ON")
+ [ ! -z '${{ matrix.c_compiler || '' }}' ] && CMAKE_OPTIONS+=(-DCMAKE_C_COMPILER='${{ matrix.c_compiler }}')
+ [ ! -z '${{ matrix.cxx_compiler || '' }}' ] && CMAKE_OPTIONS+=(-DCMAKE_CXX_COMPILER='${{ matrix.cxx_compiler }}')
+ [ ! -z '${{ matrix.sanitizer || '' }}' ] && CMAKE_OPTIONS+=(-DENABLE_SANITIZER='${{ matrix.sanitizer }}')
+ [ ! -z '${{ matrix.cmake_generator || '' }}' ] && export CMAKE_GENERATOR='${{ matrix.cmake_generator }}'
+ declare -a CMAKE_BUILD_OPTIONS=()
+ [ ! -z '${{ matrix.cmake_config || '' }}' ] && CMAKE_BUILD_OPTIONS+=(--config '${{ matrix.cmake_config }}')
+ declare -a CMAKE_TEST_OPTIONS=()
+ [ ! -z '${{ matrix.cmake_config || '' }}' ] && CMAKE_TEST_OPTIONS+=(-C '${{ matrix.cmake_config }}')
+
+ cmake -B out . ${CMAKE_OPTIONS[*]} -DCMAKE_C_FLAGS='${{ matrix.c_flags || '' }}'
+ cmake --build out ${CMAKE_BUILD_OPTIONS[*]}
+ cd out; ctest ${CMAKE_TEST_OPTIONS[*]}; cd ..
+
+ - name: Quick Fuzz
+ if: ${{ matrix.build_system == 'fuzz' }}
+ run: |
+ export ASAN_OPTIONS=detect_leaks=0
+ ./c/fuzz/test_fuzzer.sh
+
+ - name: Build with Bazel
+ if: ${{ matrix.build_system == 'bazel' }}
+ run: |
+ cd ${GITHUB_WORKSPACE}/${{ matrix.bazel_project }}
+ bazel build -c opt ...:all
+
+ - name: Fix symlinks for Bazel (Windows)
+ if: ${{ matrix.build_system == 'bazel' && runner.os == 'Windows' && matrix.bazel_project == 'java' }}
+ shell: python
+ run: |
+ import fnmatch
+ import os
+ import os.path
+ from shutil import copyfile
+ os.chdir('${{ matrix.bazel_project }}')
+ print('Searching for manifests in ' + os.getcwd())
+ matches = []
+ for root, dirnames, filenames in os.walk('bazel-bin\\org\\brotli'):
+ for filename in fnmatch.filter(filenames, '*.runfiles_manifest'):
+ matches.append(os.path.join(root, filename))
+ for match in matches:
+ print('Scanning manifest ' + match)
+ runfiles = match[:-len('_manifest')]
+ with open(match) as manifest:
+ for entry in manifest:
+ entry = entry.strip()
+ if not entry.startswith("org_brotli_java"):
+ continue
+ if entry.startswith('org_brotli_java/external'):
+ continue
+ (alias, space, link) = entry.partition(' ')
+ if alias.endswith('.jar') or alias.endswith('.exe'):
+ continue
+ link = link.replace('/', '\\')
+ alias = alias.replace('/', '\\')
+ dst = os.path.join(runfiles, alias)
+ if not os.path.exists(dst):
+ print(link + ' -> ' + dst)
+ parent = os.path.dirname(dst)
+ if not os.path.exists(parent):
+ os.makedirs(parent)
+ copyfile(link, dst)
+ print('Finished resolving symlinks')
+
+ - name: Test with Bazel
+ if: ${{ matrix.build_system == 'bazel' }}
+ run: |
+ cd ${GITHUB_WORKSPACE}/${{ matrix.bazel_project }}
+ bazel query "tests(...)" --output=label > ${RUNNER_TEMP}/tests.lst
+ [ -s ${RUNNER_TEMP}/tests.lst ] && bazel test -c opt ...:all
+ bazel clean
+
+ - name: Build / Test with Maven
+ if: ${{ matrix.build_system == 'maven' }}
+ run: |
+ export MAVEN_OPTS=-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
+ cd java/org/brotli
+ mvn -B install
+ cd integration
+ mvn -B verify
+
+ - name: Build / Test with Autotools
+ if: ${{ matrix.build_system == 'autotools' }}
+ run: |
+ ./bootstrap && ./configure && make
+
+ - name: Build / Test with Make
+ if: ${{ matrix.build_system == 'make' }}
+ run: |
+ make brotli
+ make test
+
+ - uses: actions/setup-python@v2
+ if: ${{ matrix.build_system == 'python' }}
+ with:
+ python-version: ${{ matrix.python_version }}
+
+ # TODO: investigate, why msiexec hangs
+ #- name: Install VC9 for Python
+ # if: ${{ runner.os == 'Windows' && matrix.build_system == 'python' && matrix.python_version == '2.7' }}
+ # run: |
+ # echo "070474db76a2e625513a5835df4595df9324d820f9cc97eab2a596dcbc2f5cbf third_party/VCForPython27/VCForPython27.msi" | sha256sum --check --status
+ # msiexec ALLUSERS=1 /qn /norestart /i third_party/VCForPython27/VCForPython27.msi /l*v ${RUNNER_TEMP}/msiexec.log
+ # cat ${RUNNER_TEMP}/msiexec.log
+
+ - name: Build / Test with Python
+ if: ${{ matrix.build_system == 'python' }}
+ run: |
+ python -VV
+ python -c "import sys; sys.exit('Invalid python version') if '.'.join(map(str,sys.version_info[0:2])) != '${{ matrix.python_version }}' else True"
+ python setup.py ${{ matrix.py_setuptools_cmd || 'test'}}
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index e97adc3..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,267 +0,0 @@
-language: c
-sudo: false
-branches:
- only:
- - master
-
-cache:
- directories:
- - $HOME/Library/Caches/Homebrew
- - /usr/local/Homebrew
-
-before_cache:
- - if [ "${TRAVIS_OS_NAME}" = "osx" ]; then brew cleanup; fi
- - if [ "${TRAVIS_OS_NAME}" = "osx" ]; then find /usr/local/Homebrew \! -regex ".+\.git.+" -delete; fi
-
-matrix:
- include:
- ###
- ## Linux builds using various versions of GCC.
- ###
- - os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=gcc-7 CXX_COMPILER=g++-7
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - gcc-7
- - g++-7
- - os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=gcc-4.4 CXX_COMPILER=g++-4.4
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - gcc-4.4
- - g++-4.4
-
- ###
- ## Test that Autotools build works.
- ###
- - os: linux
- env: BUILD_SYSTEM=autotools C_COMPILER=gcc-5 CXX_COMPILER=g++-5
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - gcc-5
- - g++-5
-
- ###
- ## Test that fuzzer is compiling / working.
- ###
- - os: linux
- env: BUILD_SYSTEM=fuzz C_COMPILER=clang-7 CXX_COMPILER=clang++-7 ASAN_OPTIONS=detect_leaks=0
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- - llvm-toolchain-xenial-7
- packages:
- - clang-7
-
- ###
- ## clang on Linux
- ###
- - os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=clang-7 CXX_COMPILER=clang++-7
- addons:
- apt:
- sources:
- - llvm-toolchain-xenial-7
- - ubuntu-toolchain-r-test
- packages:
- - clang-7
- - os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=clang-3.5 CXX_COMPILER=clang++-3.5
- addons:
- apt:
- sources:
- - llvm-toolchain-trusty-3.5
- - ubuntu-toolchain-r-test
- packages:
- - clang-3.5
-
- ###
- ## testing arm via qemu on Linux
- ###
- - os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=arm-linux-gnueabihf-gcc CXX_COMPILER=arm-linux-gnueabihf-g++ CFLAGS="-march=armv7-a -mfloat-abi=hard -mfpu=neon"
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - qemu
- - gcc-arm-linux-gnueabihf
- - libc6-dev-armhf-cross
-
- ###
- ## PGI Community Edition on Linux
- ###
- # Installer is currently broken
- #- os: linux
- # env: BUILD_SYSTEM=cmake C_COMPILER=pgcc CXX_COMPILER=pgc++
-
- ###
- ## Python builds on Linux
- ###
- - os: linux
- language: python
- python: 2.7
- env: BUILD_SYSTEM=python C_COMPILER=gcc-5 CXX_COMPILER=g++-5
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - gcc-5
- - g++-5
- - os: linux
- language: python
- python: 3.6
- env: BUILD_SYSTEM=python C_COMPILER=gcc-5 CXX_COMPILER=g++-5
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - gcc-5
- - g++-5
-
- - os: linux
- language: python
- python: 3.7
- env: BUILD_SYSTEM=python C_COMPILER=gcc-5 CXX_COMPILER=g++-5
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - gcc-5
- - g++-5
-
- - os: linux
- language: python
- python: 3.8
- env: BUILD_SYSTEM=python C_COMPILER=gcc-5 CXX_COMPILER=g++-5
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - gcc-5
- - g++-5
-
- ###
- ## CMake on OS X
- ##
- ## These all work, but it seems unnecessary to actually build them
- ## all since we already test all these versions of GCC on Linux.
- ## We'll just test 4.4 and the most recent version.
- ###
- - os: osx
- osx_image: xcode12.2
- env: BUILD_SYSTEM=cmake C_COMPILER=gcc CXX_COMPILER=g++
- #- os: osx
- # osx_image: xcode12.2
- # env: BUILD_SYSTEM=cmake C_COMPILER=gcc-4.9 CXX_COMPILER=g++-4.9
- - os: osx
- osx_image: xcode12.2
- env: BUILD_SYSTEM=cmake
-
- ###
- ## Python 2.7 OS X build (using the system /usr/bin/python)
- ###
- - os: osx
- osx_image: xcode12.2
- env: BUILD_SYSTEM=python C_COMPILER=gcc CXX_COMPILER=g++
-
- ###
- ## Sanitizers
- ###
- - os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=clang-7 CXX_COMPILER=clang++-7 SANITIZER=address ASAN_OPTIONS=detect_leaks=0
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- - llvm-toolchain-xenial-7
- packages:
- - clang-7
- - os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=clang-7 CXX_COMPILER=clang++-7 SANITIZER=thread
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- - llvm-toolchain-xenial-7
- packages:
- - clang-7
- - os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=clang-7 CXX_COMPILER=clang++-7 SANITIZER=undefined CFLAGS="-fno-sanitize-recover=undefined,integer"
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- - llvm-toolchain-xenial-7
- packages:
- - clang-7
-
- - os: linux
- env: BUILD_SYSTEM=maven
- jdk:
- # maven + jdk11 + javadoc == trouble
- - openjdk10
- language: java
-
- - os: linux
- sudo: required
- language: java
- jdk: oraclejdk9
- env: BUILD_SYSTEM=bazel
- addons:
- apt:
- sources:
- - sourceline: "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8"
- key_url: "https://storage.googleapis.com/bazel-apt/doc/apt-key.pub.gpg"
- - ubuntu-toolchain-r-test
- packages:
- - bazel
-
- - os: osx
- osx_image: xcode12.2
- env: BUILD_SYSTEM=bazel
- language: java
-
-before_install:
-###
-## If we use the matrix to set CC/CXX Travis, overwrites the values,
-## so instead we use C/CXX_COMPILER, then copy the values to CC/CXX
-## here (after Travis has set CC/CXX).
-###
-- if [ -n "${C_COMPILER}" ]; then export CC="${C_COMPILER}"; fi
-- if [ -n "${CXX_COMPILER}" ]; then export CXX="${CXX_COMPILER}"; fi
-- scripts/.travis.sh before_install
-install:
-- scripts/.travis.sh install
-script:
-- scripts/.travis.sh script
-after_success:
-- scripts/.travis.sh after_success
-
-before_deploy:
-- scripts/.travis.sh before_deploy
-
-deploy:
-- provider: bintray
- file: "scripts/.bintray.json"
- user: "eustas"
- key:
- secure: "Kbam/lTAdz72fZivbs6riJT+Y4PbuKP7r6t5PAWxJxAAykjwnYTRe3zF472g9HCE14KYMsdB+KSYSgg6TGJnqGC9gL9xhhGU9U/WmA+vbMWS/MSnMWpK9IRpp77pM2i2NKZD4v33JuEwKFCBJP3Vj6QQ5Qd1NKdobuXJyznhgnw="
- on:
- condition: "${BUILD_SYSTEM} = bazel"
- skip_cleanup: true
diff --git a/configure.ac b/configure.ac
index 87d579d..9a3b285 100644
--- a/configure.ac
+++ b/configure.ac
@@ -11,4 +11,4 @@
AC_CONFIG_FILES([Makefile scripts/libbrotlicommon.pc scripts/libbrotlidec.pc scripts/libbrotlienc.pc])
-AC_OUTPUT
\ No newline at end of file
+AC_OUTPUT
diff --git a/docs/brotli.1 b/docs/brotli.1
index 7242a32..a3c9a13 100644
--- a/docs/brotli.1
+++ b/docs/brotli.1
@@ -1,4 +1,4 @@
-.TH "BROTLI" "1" "February 2018" "brotli 1.0.0" "User commands"
+.TH "BROTLI" "1" "August 2021" "" "User commands"
.SH "NAME"
\fBbrotli\fR \- brotli, unbrotli \- compress or decompress files
.SH SYNOPSIS
@@ -108,6 +108,10 @@
windows size improve density; decoder might require up to window size
memory to operate
.IP \(bu 2
+\fB\-D FILE\fP, \fB\-\-dictionary=FILE\fP:
+ use FILE as raw (LZ77) dictionary; same dictionary MUST be used both for
+ compression and decompression
+.IP \(bu 2
\fB\-S SUF\fP, \fB\-\-suffix=SUF\fP:
output file suffix (default: \fB\|\.br\fP)
.IP \(bu 2
diff --git a/docs/constants.h.3 b/docs/constants.h.3
index edf071c..1b29f28 100644
--- a/docs/constants.h.3
+++ b/docs/constants.h.3
@@ -1,4 +1,4 @@
-.TH "constants.h" 3 "Wed May 13 2020" "Brotli" \" -*- nroff -*-
+.TH "constants.h" 3 "August 2021" "Brotli" \" -*- nroff -*-
.ad l
.nh
.SH NAME
diff --git a/docs/decode.h.3 b/docs/decode.h.3
index 7b8581c..14abda6 100644
--- a/docs/decode.h.3
+++ b/docs/decode.h.3
@@ -1,4 +1,4 @@
-.TH "decode.h" 3 "Thu Feb 22 2018" "Brotli" \" -*- nroff -*-
+.TH "decode.h" 3 "August 2021" "Brotli" \" -*- nroff -*-
.ad l
.nh
.SH NAME
@@ -36,6 +36,10 @@
.in +1c
.ti -1c
+.RI "\fBBROTLI_BOOL\fP \fBBrotliDecoderAttachDictionary\fP (\fBBrotliDecoderState\fP *state, BrotliSharedDictionaryType type, size_t data_size, const uint8_t data[data_size])"
+.br
+.RI "\fIAdds LZ77 prefix dictionary, adds or replaces built-in static dictionary and transforms\&. \fP"
+.ti -1c
.RI "\fBBrotliDecoderState\fP * \fBBrotliDecoderCreateInstance\fP (\fBbrotli_alloc_func\fP alloc_func, \fBbrotli_free_func\fP free_func, void *opaque)"
.br
.RI "\fICreates an instance of \fBBrotliDecoderState\fP and initializes it\&. \fP"
@@ -167,6 +171,35 @@
Partially done; should be called again with more output\&.
.SH "Function Documentation"
.PP
+.SS "\fBBROTLI_BOOL\fP BrotliDecoderAttachDictionary (\fBBrotliDecoderState\fP * state, BrotliSharedDictionaryType type, size_t data_size, const uint8_t data[data_size])"
+
+.PP
+Adds LZ77 prefix dictionary, adds or replaces built-in static dictionary and transforms\&. Attached dictionary ownership is not transferred\&. Data provided to this method should be kept accessible until decoding is finished and decoder instance is destroyed\&.
+.PP
+\fBNote:\fP
+.RS 4
+Dictionaries could NOT be attached after actual decoding is started\&.
+.RE
+.PP
+\fBParameters:\fP
+.RS 4
+\fIstate\fP decoder instance
+.br
+\fItype\fP dictionary data format
+.br
+\fIdata_size\fP length of memory region pointed by \fCdata\fP
+.br
+\fIdata\fP dictionary data in format corresponding to \fCtype\fP
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+\fBBROTLI_FALSE\fP if dictionary is corrupted, or dictionary count limit is reached
+.PP
+\fBBROTLI_TRUE\fP if dictionary is accepted / attached
+.RE
+.PP
+
.SS "\fBBrotliDecoderState\fP* BrotliDecoderCreateInstance (\fBbrotli_alloc_func\fP alloc_func, \fBbrotli_free_func\fP free_func, void * opaque)"
.PP
diff --git a/docs/encode.h.3 b/docs/encode.h.3
index 0cab816..e31b6b4 100644
--- a/docs/encode.h.3
+++ b/docs/encode.h.3
@@ -1,4 +1,4 @@
-.TH "encode.h" 3 "Thu Feb 22 2018" "Brotli" \" -*- nroff -*-
+.TH "encode.h" 3 "August 2021" "Brotli" \" -*- nroff -*-
.ad l
.nh
.SH NAME
@@ -76,6 +76,10 @@
.in +1c
.ti -1c
+.RI "\fBBROTLI_BOOL\fP \fBBrotliEncoderAttachPreparedDictionary\fP (\fBBrotliEncoderState\fP *state, const BrotliEncoderPreparedDictionary *dictionary)"
+.br
+.RI "\fIAttaches a prepared dictionary of any type to the encoder\&. \fP"
+.ti -1c
.RI "\fBBROTLI_BOOL\fP \fBBrotliEncoderCompress\fP (int quality, int lgwin, \fBBrotliEncoderMode\fP mode, size_t input_size, const uint8_t input_buffer[input_size], size_t *encoded_size, uint8_t encoded_buffer[*encoded_size])"
.br
.RI "\fIPerforms one-shot memory-to-memory compression\&. \fP"
@@ -104,6 +108,10 @@
.br
.RI "\fICalculates the output size bound for the given \fCinput_size\fP\&. \fP"
.ti -1c
+.RI "BrotliEncoderPreparedDictionary * \fBBrotliEncoderPrepareDictionary\fP (BrotliSharedDictionaryType type, size_t data_size, const uint8_t data[data_size], int quality, \fBbrotli_alloc_func\fP alloc_func, \fBbrotli_free_func\fP free_func, void *opaque)"
+.br
+.RI "\fIPrepares a shared dictionary from the given file format for the encoder\&. \fP"
+.ti -1c
.RI "\fBBROTLI_BOOL\fP \fBBrotliEncoderSetParameter\fP (\fBBrotliEncoderState\fP *state, \fBBrotliEncoderParameter\fP param, uint32_t value)"
.br
.RI "\fISets the specified parameter to the given encoder instance\&. \fP"
@@ -318,6 +326,19 @@
Range is not artificially limited, but all the values greater or equal to maximal window size have the same effect\&. Values greater than 2**30 are not allowed\&.
.SH "Function Documentation"
.PP
+.SS "\fBBROTLI_BOOL\fP BrotliEncoderAttachPreparedDictionary (\fBBrotliEncoderState\fP * state, const BrotliEncoderPreparedDictionary * dictionary)"
+
+.PP
+Attaches a prepared dictionary of any type to the encoder\&. Can be used multiple times to attach multiple dictionaries\&. The dictionary type was determined by BrotliEncoderPrepareDictionary\&. Multiple raw prefix dictionaries and/or max 1 serialized dictionary with custom words can be attached\&.
+.PP
+\fBReturns:\fP
+.RS 4
+\fBBROTLI_FALSE\fP in case of error
+.PP
+\fBBROTLI_TRUE\fP otherwise
+.RE
+.PP
+
.SS "\fBBROTLI_BOOL\fP BrotliEncoderCompress (int quality, int lgwin, \fBBrotliEncoderMode\fP mode, size_t input_size, const uint8_t input_buffer[input_size], size_t * encoded_size, uint8_t encoded_buffer[*encoded_size])"
.PP
@@ -509,6 +530,29 @@
.RE
.PP
+.SS "BrotliEncoderPreparedDictionary* BrotliEncoderPrepareDictionary (BrotliSharedDictionaryType type, size_t data_size, const uint8_t data[data_size], int quality, \fBbrotli_alloc_func\fP alloc_func, \fBbrotli_free_func\fP free_func, void * opaque)"
+
+.PP
+Prepares a shared dictionary from the given file format for the encoder\&. \fCalloc_func\fP and \fCfree_func\fP \fBMUST\fP be both zero or both non-zero\&. In the case they are both zero, default memory allocators are used\&. \fCopaque\fP is passed to \fCalloc_func\fP and \fCfree_func\fP when they are called\&. \fCfree_func\fP has to return without doing anything when asked to free a NULL pointer\&.
+.PP
+\fBParameters:\fP
+.RS 4
+\fItype\fP type of dictionary stored in data
+.br
+\fIdata_size\fP size of \fCdata\fP buffer
+.br
+\fIdata\fP pointer to the dictionary data
+.br
+\fIquality\fP the maximum Brotli quality to prepare the dictionary for, use BROTLI_MAX_QUALITY by default
+.br
+\fIalloc_func\fP custom memory allocation function
+.br
+\fIfree_func\fP custom memory free function
+.br
+\fIopaque\fP custom memory manager handle
+.RE
+.PP
+
.SS "\fBBROTLI_BOOL\fP BrotliEncoderSetParameter (\fBBrotliEncoderState\fP * state, \fBBrotliEncoderParameter\fP param, uint32_t value)"
.PP
diff --git a/docs/types.h.3 b/docs/types.h.3
index bef9313..3d8a98c 100644
--- a/docs/types.h.3
+++ b/docs/types.h.3
@@ -1,4 +1,4 @@
-.TH "types.h" 3 "Thu Feb 22 2018" "Brotli" \" -*- nroff -*-
+.TH "types.h" 3 "August 2021" "Brotli" \" -*- nroff -*-
.ad l
.nh
.SH NAME
diff --git a/go/WORKSPACE b/go/WORKSPACE
index 8fb62e5..03d38da 100644
--- a/go/WORKSPACE
+++ b/go/WORKSPACE
@@ -20,4 +20,4 @@
go_rules_dependencies()
-go_register_toolchains(version = "1.16")
\ No newline at end of file
+go_register_toolchains(version = "1.16")
diff --git a/java/org/brotli/dec/pom.xml b/java/org/brotli/dec/pom.xml
index 8701874..e7f9fd9 100644
--- a/java/org/brotli/dec/pom.xml
+++ b/java/org/brotli/dec/pom.xml
@@ -76,6 +76,9 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.4</version>
+ <configuration>
+ <source>8</source>
+ </configuration>
<executions>
<execution>
<id>attach-javadocs</id>
diff --git a/research/BUILD.libdivsufsort b/research/BUILD.libdivsufsort
index a6deb5b..aeea923 100644
--- a/research/BUILD.libdivsufsort
+++ b/research/BUILD.libdivsufsort
@@ -38,7 +38,8 @@
srcs = ["include/config.h.cmake"],
outs = ["include/config.h"],
cmd = ("awk '{ " +
- "gsub(/@HAVE_IO_H 1@/, \"HAVE_IO_H 0\"); " +
+ "gsub(/HAVE_IO_H 1/, \"HAVE_IO_H 0\"); " +
+ "gsub(/HAVE_STRINGS_H 1/, \"HAVE_STRINGS_H 0\"); " +
commom_awk_replaces +
"print; }' $(<) > $(@)"),
)
diff --git a/research/WORKSPACE b/research/WORKSPACE
index 358f87d..343c3bb 100644
--- a/research/WORKSPACE
+++ b/research/WORKSPACE
@@ -12,6 +12,7 @@
build_file = "@//:BUILD.libdivsufsort",
commit = "5f60d6f026c30fb4ac296f696b3c8b0eb71bd428",
remote = "https://github.com/y-256/libdivsufsort",
+ shallow_since = "1445958113 +0900",
)
new_git_repository(
@@ -27,4 +28,5 @@
""",
commit = "ca7cb332011ec37a8436487f210f396b84bd8273",
remote = "https://github.com/hillbig/esaxx",
+ shallow_since = "1391400691 +0900",
)
diff --git a/research/brotli_decoder.c b/research/brotli_decoder.c
index 4b0bc4a..3febcbd 100644
--- a/research/brotli_decoder.c
+++ b/research/brotli_decoder.c
@@ -6,7 +6,17 @@
#include <stdio.h>
#include <stdlib.h>
+
+#if !defined(_WIN32)
#include <unistd.h>
+#else
+#include <io.h>
+#define fdopen _fdopen
+#if !defined(__MINGW32__)
+#define STDIN_FILENO _fileno(stdin)
+#define STDOUT_FILENO _fileno(stdout)
+#endif
+#endif
#include <brotli/decode.h>
diff --git a/research/deorummolae.cc b/research/deorummolae.cc
index f12acd1..23ac1aa 100644
--- a/research/deorummolae.cc
+++ b/research/deorummolae.cc
@@ -5,6 +5,10 @@
#include "third_party/esaxx/sais.hxx"
+#if defined(_MSC_VER)
+#include <intrin.h> /* __popcnt64 */
+#endif
+
/* Used for quick SA-entry to file mapping. Each file is padded to size that
is a multiple of chunk size. */
#define CHUNK_SIZE 64
@@ -30,7 +34,11 @@
typedef int32_t TextSaIdx;
static size_t popcount(uint64_t u) {
+#if defined(_MSC_VER)
+ return static_cast<size_t>(__popcnt64(u));
+#else
return static_cast<size_t>(__builtin_popcountll(u));
+#endif
}
/* Condense terminators and pad file entries. */
diff --git a/research/dictionary_generator.cc b/research/dictionary_generator.cc
index 715723f..7df55ad 100644
--- a/research/dictionary_generator.cc
+++ b/research/dictionary_generator.cc
@@ -3,7 +3,9 @@
#include <cstdio>
#include <cstring>
#include <fstream>
+#if !defined(_MSC_VER)
#include <glob.h>
+#endif
#include <vector>
#include "./deorummolae.h"
@@ -268,14 +270,19 @@
}
}
+ bool ok = true;
+#if defined(_MSC_VER)
+ const char* resolved_path = argv[i];
+#else
glob_t resolved_paths;
memset(&resolved_paths, 0, sizeof(resolved_paths));
- bool ok = true;
if (glob(argv[i], GLOB_TILDE, NULL, &resolved_paths) == 0) {
for(size_t j = 0; j < resolved_paths.gl_pathc; ++j) {
- std::string content = readFile(resolved_paths.gl_pathv[j]);
+ const char* resolved_path = resolved_paths.gl_pathv[j];
+#endif
+ std::string content = readFile(resolved_path);
if (chunkLen == 0) {
- paths.emplace_back(resolved_paths.gl_pathv[j]);
+ paths.emplace_back(resolved_path);
data.insert(data.end(), content.begin(), content.end());
total += content.size();
sizes.push_back(content.size());
@@ -293,11 +300,13 @@
total += chunk.size();
sizes.push_back(chunk.size());
}
+#if !defined(_MSC_VER)
}
} else {
ok = false;
}
globfree(&resolved_paths);
+#endif
if (!ok) exit(1);
}
diff --git a/scripts/.bintray.json b/scripts/.bintray.json
deleted file mode 100644
index 17f99ed..0000000
--- a/scripts/.bintray.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "package": {
- "name": "bin",
- "repo": "brotli",
- "subject": "eustas"
- },
-
- "version": {"name": "latest"},
-
- "files": [
- {
- "includePattern": "brotli.zip",
- "uploadPattern": "brotli-${TRAVIS_OS_NAME}-${RELEASE_DATE}.zip",
- "matrix_params": {"override": 1}
- }
- ],
-
- "publish": true
-}
diff --git a/scripts/.configure-custom.sh b/scripts/.configure-custom.sh
deleted file mode 100644
index f1f641a..0000000
--- a/scripts/.configure-custom.sh
+++ /dev/null
@@ -1 +0,0 @@
-#!/usr/bin/env bash
diff --git a/scripts/.travis.sh b/scripts/.travis.sh
deleted file mode 100755
index b5ad13a..0000000
--- a/scripts/.travis.sh
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/bin/bash
-
-case "$1" in
- "before_install")
- ;;
- "install")
- case "${TRAVIS_OS_NAME}" in
- "osx")
- brew update >/dev/null
- brew install binutils
-
- case "${CC}" in
- "gcc-"*)
- which ${CC} || brew install $(echo "${CC}" | sed 's/\-/@/') || brew link --overwrite $(echo "${CC}" | sed 's/\-/@/')
- ;;
- esac
-
- case "${BUILD_SYSTEM}" in
- "bazel")
- brew cask install homebrew/cask-versions/adoptopenjdk8
- brew install bazel
- ;;
- esac
- ;;
- "linux")
- case "${CC}" in
- "pgcc")
- wget 'https://raw.githubusercontent.com/nemequ/pgi-travis/de6212d94fd0e7d07a6ef730c23548c337c436a7/install-pgi.sh'
- echo 'acd3ef995ad93cfb87d26f65147395dcbedd4c3c844ee6ec39616f1a347c8df5 install-pgi.sh' | sha256sum -c --strict || exit 1
- /bin/sh install-pgi.sh
- ;;
- esac
- ;;
- esac
- ;;
- "script")
- case "${BUILD_SYSTEM}" in
- "cmake")
- mkdir builddir && cd builddir
- CMAKE_FLAGS=
- if [ "${CROSS_COMPILE}" = "yes" ]; then
- CMAKE_FLAGS="-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_RC_COMPILER=${RC_COMPILER}"
- fi
- cmake ${CMAKE_FLAGS} -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX" -DENABLE_SANITIZER="${SANITIZER}" -DCMAKE_C_FLAGS="${CFLAGS}" .. || exit 1
- make VERBOSE=1 || exit 1
- ctest -V || exit 1
- ;;
- "python")
- python setup.py test
- ;;
- "maven")
- cd java/org/brotli
- mvn install && cd integration && mvn verify
- ;;
- "autotools")
- ./bootstrap && ./configure && make
- ;;
- "fuzz")
- ./c/fuzz/test_fuzzer.sh
- ;;
- "bazel")
- bazel build -c opt ...:all &&
- cd go && bazel test -c opt ...:all && cd .. &&
- cd java && bazel test -c opt ...:all && cd .. &&
- cd js && bazel test -c opt ...:all && cd .. &&
- cd research && bazel build -c opt ...:all && cd ..
- ;;
- esac
- ;;
- "after_success")
- ;;
- "before_deploy")
- case "${BUILD_SYSTEM}" in
- "bazel")
- export RELEASE_DATE=`date +%Y-%m-%d`
- perl -p -i -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : $&/eg' scripts/.bintray.json
- zip -j9 brotli.zip bazel-bin/libbrotli*.a bazel-bin/libbrotli*.so bazel-bin/brotli
- ;;
- esac
- ;;
-esac
diff --git a/scripts/appveyor.yml b/scripts/appveyor.yml
deleted file mode 100644
index e52f65a..0000000
--- a/scripts/appveyor.yml
+++ /dev/null
@@ -1,111 +0,0 @@
-branches:
- only:
- - master
-
-environment:
- matrix:
- - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- BUILD_SYSTEM: CMake
- GENERATOR: Visual Studio 15 2017 Win64
- CONFIG: Release
-
- - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- BUILD_SYSTEM: CMake
- GENERATOR: Visual Studio 15 2017 Win64
- CONFIG: Debug
-
- - BUILD_SYSTEM: CMake
- GENERATOR: Visual Studio 14 2015 Win64
- CONFIG: Debug
-
- - BUILD_SYSTEM: CMake
- GENERATOR: Visual Studio 14 2015
- CONFIG: Debug
-
- - BUILD_SYSTEM: Python
- PYTHON: "C:\\Python27"
- PYTHON_VERSION: "2.7.x"
- PYTHON_ARCH: "32"
-
- - BUILD_SYSTEM: Python
- PYTHON: "C:\\Python36-x64"
- PYTHON_VERSION: "3.6.x"
- PYTHON_ARCH: "64"
-
- - BUILD_SYSTEM: make
- ARCH: "i686"
-
- - BUILD_SYSTEM: make
- ARCH: "x86_64"
-
- - BUILD_SYSTEM: bazel
-
-install:
-- IF "%BUILD_SYSTEM%"=="Python" (
- SET "PATH=%PYTHON%;%PYTHON%\Scripts;%PATH%" &&
- python -m pip install --upgrade pip &&
- pip install --upgrade setuptools
- )
-- IF "%BUILD_SYSTEM%"=="make" (
- IF "%ARCH%"=="i686" (
- SET "TOOLCHAIN=i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32"
- ) ELSE (
- SET "TOOLCHAIN=x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64"
- )
- )
-- IF "%BUILD_SYSTEM%"=="bazel" (
- appveyor DownloadFile https://github.com/bazelbuild/bazel/releases/download/2.2.0/bazel-2.2.0-windows-x86_64.exe -FileName bazel.exe
- )
-
-before_build:
-- FOR /f %%i in ('C:\cygwin64\bin\date.exe +%%Y-%%m-%%d') DO SET "RELEASE_DATE=%%i"
-- IF "%BUILD_SYSTEM%"=="CMake" ( mkdir builddir && cd builddir && cmake -G "%GENERATOR%" .. )
-- IF "%BUILD_SYSTEM%"=="make" (
- SET "CC=gcc" &&
- SET "PATH=C:\mingw-w64\%TOOLCHAIN%\bin;%PATH%" &&
- COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\%TOOLCHAIN%\bin\make.exe
- )
-- SET "ROOT=%APPVEYOR_BUILD_FOLDER%"
-
-build_script:
-- IF "%BUILD_SYSTEM%"=="CMake" ( cmake --build . --config %CONFIG% )
-- IF "%BUILD_SYSTEM%"=="Python" ( python setup.py build_ext )
-- IF "%BUILD_SYSTEM%"=="make" (
- sh -c "make brotli" &&
- cd bin && 7z a -tzip -mx9 brotli-win-%ARCH%-%RELEASE_DATE%.zip brotli.exe &&
- appveyor PushArtifact brotli-win-%ARCH%-%RELEASE_DATE%.zip && cd ..
- )
-- IF "%BUILD_SYSTEM%"=="bazel" (
- cd java &&
- %ROOT%\bazel.exe --batch build -c opt org/brotli/wrapper/...:all &&
- python %ROOT%\scripts\fix-win-bazel-build.py &&
- cd bazel-bin &&
- 7z a -tzip -mx9 brotli-win-bazel-jni-%RELEASE_DATE%.zip brotli_jni.dll &&
- appveyor PushArtifact brotli-win-bazel-jni-%RELEASE_DATE%.zip &&
- cd .. &&
- cd ..
- )
-
-test_script:
-- IF "%BUILD_SYSTEM%"=="CMake" ( ctest --output-on-failure --interactive-debug-mode 0 -C %CONFIG% )
-- IF "%BUILD_SYSTEM%"=="Python" ( python setup.py test )
-- IF "%BUILD_SYSTEM%"=="make" ( sh -c "make test" )
-- IF "%BUILD_SYSTEM%"=="bazel" (
- cd java &&
- %ROOT%\bazel.exe --batch test -c opt --test_output streamed org/brotli/wrapper/...:all &&
- cd ..
- )
-
-deploy:
-- provider: BinTray
- on:
- branch: master
- username: eustas
- api_key:
- secure: B3rM8JYeIHIw6BfOjHggAeyTmxEf8ZDYmyF9gCwqyWaxyxECD9BuN50SiV2KE/RI
- subject: eustas
- repo: brotli
- package: bin
- version: latest
- publish: true
- override: true
diff --git a/scripts/fix-win-bazel-build.py b/scripts/fix-win-bazel-build.py
deleted file mode 100644
index 7a9b211..0000000
--- a/scripts/fix-win-bazel-build.py
+++ /dev/null
@@ -1,36 +0,0 @@
-import fnmatch
-import os
-import os.path
-from shutil import copyfile
-
-print('Searching for manifests...')
-
-matches = []
-for root, dirnames, filenames in os.walk('bazel-bin\\org\\brotli'):
- for filename in fnmatch.filter(filenames, '*.runfiles_manifest'):
- matches.append(os.path.join(root, filename))
-
-for match in matches:
- print('Scanning manifest ' + match)
- runfiles = match[:-len('_manifest')]
- with open(match) as manifest:
- for entry in manifest:
- entry = entry.strip()
- if not entry.startswith("org_brotli_java"):
- continue
- if entry.startswith('org_brotli_java/external'):
- continue
- (alias, space, link) = entry.partition(' ')
- if alias.endswith('.jar') or alias.endswith('.exe'):
- continue
- link = link.replace('/', '\\')
- alias = alias.replace('/', '\\')
- dst = os.path.join(runfiles, alias)
- if not os.path.exists(dst):
- print(link + ' -> ' + dst)
- parent = os.path.dirname(dst)
- if not os.path.exists(parent):
- os.makedirs(parent)
- copyfile(link, dst)
-
-print('Finished resolving symlinks')