Skip to content

Commit 0ad94ee

Browse files
authored
Update (google#620)
* add autotools build * separate semantic and ABI version * extract sources.lst (used by CMake and Automake) * share pkgconfig templates (used by CMake and Automake) * decoder: always set `total_out` * encoder: fix `BROTLI_ENSURE_CAPACITY` macro (no-op after preprocessor) * decoder/encoder: refine `free_func` contract
1 parent 273de5a commit 0ad94ee

17 files changed

+302
-138
lines changed

CMakeLists.txt

+50-130
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,19 @@ string(REGEX REPLACE "^#define BROTLI_VERSION 0x([0-9a-fA-F]+)$" "\\1" _brotli_v
7272
hex_to_dec("${_brotli_version_hex}" _brotli_version)
7373
math(EXPR BROTLI_VERSION_MAJOR "${_brotli_version} >> 24")
7474
math(EXPR BROTLI_VERSION_MINOR "(${_brotli_version} >> 12) & 4095")
75-
math(EXPR BROTLI_VERSION_REVISION "${_brotli_version} & 4095")
76-
mark_as_advanced(BROTLI_VERSION_MAJOR BROTLI_VERSION_MINOR BROTLI_VERSION_REVISION)
75+
math(EXPR BROTLI_VERSION_PATCH "${_brotli_version} & 4095")
76+
set(BROTLI_VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_PATCH}")
77+
mark_as_advanced(BROTLI_VERSION BROTLI_VERSION_MAJOR BROTLI_VERSION_MINOR BROTLI_VERSION_PATCH)
78+
79+
# ABI Version information
80+
file(STRINGS "c/common/version.h" _brotli_abi_info_line REGEX "^#define BROTLI_ABI_VERSION (0x[0-9a-fA-F]+)$")
81+
string(REGEX REPLACE "^#define BROTLI_ABI_VERSION 0x([0-9a-fA-F]+)$" "\\1" _brotli_abi_info_hex "${_brotli_abi_info_line}")
82+
hex_to_dec("${_brotli_abi_info_hex}" _brotli_abi_info)
83+
math(EXPR BROTLI_ABI_CURRENT "${_brotli_abi_info} >> 24")
84+
math(EXPR BROTLI_ABI_REVISION "(${_brotli_abi_info} >> 12) & 4095")
85+
math(EXPR BROTLI_ABI_AGE "${_brotli_abi_info} & 4095")
86+
math(EXPR BROTLI_ABI_COMPATIBILITY "${BROTLI_ABI_CURRENT} - ${BROTLI_ABI_AGE}")
87+
mark_as_advanced(BROTLI_ABI_CURRENT BROTLI_ABI_REVISION BROTLI_ABI_AGE BROTLI_ABI_COMPATIBILITY)
7788

7889
if (ENABLE_SANITIZER)
7990
set(CMAKE_C_FLAGS " ${CMAKE_C_FLAGS} -fsanitize=${ENABLE_SANITIZER}")
@@ -125,39 +136,24 @@ elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
125136
add_definitions(-DOS_MACOSX)
126137
endif()
127138

128-
set(BROTLICOMMON_SOURCES
129-
c/common/dictionary.c)
130-
set(BROTLIDEC_SOURCES
131-
c/dec/bit_reader.c
132-
c/dec/decode.c
133-
c/dec/huffman.c
134-
c/dec/state.c)
135-
set(BROTLIENC_SOURCES
136-
c/enc/backward_references.c
137-
c/enc/backward_references_hq.c
138-
c/enc/bit_cost.c
139-
c/enc/block_splitter.c
140-
c/enc/brotli_bit_stream.c
141-
c/enc/cluster.c
142-
c/enc/compress_fragment.c
143-
c/enc/compress_fragment_two_pass.c
144-
c/enc/dictionary_hash.c
145-
c/enc/encode.c
146-
c/enc/entropy_encode.c
147-
c/enc/histogram.c
148-
c/enc/literal_cost.c
149-
c/enc/memory.c
150-
c/enc/metablock.c
151-
c/enc/static_dict.c
152-
c/enc/utf8_util.c)
153-
154-
add_library(brotlicommon SHARED ${BROTLICOMMON_SOURCES})
155-
add_library(brotlidec SHARED ${BROTLIDEC_SOURCES})
156-
add_library(brotlienc SHARED ${BROTLIENC_SOURCES})
157-
158-
add_library(brotlicommon-static STATIC ${BROTLICOMMON_SOURCES})
159-
add_library(brotlidec-static STATIC ${BROTLIDEC_SOURCES})
160-
add_library(brotlienc-static STATIC ${BROTLIENC_SOURCES})
139+
function(transform_sources_list INPUT_FILE OUTPUT_FILE)
140+
file(READ ${INPUT_FILE} TEXT)
141+
string(REGEX REPLACE "\\\\\n" "~continuation~" TEXT ${TEXT})
142+
string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" TEXT ${TEXT})
143+
string(REPLACE "~continuation~" "\n" TEXT ${TEXT})
144+
file(WRITE ${OUTPUT_FILE} ${TEXT})
145+
endfunction()
146+
147+
transform_sources_list("scripts/sources.lst" "${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake")
148+
include("${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake")
149+
150+
add_library(brotlicommon SHARED ${BROTLI_COMMON_C})
151+
add_library(brotlidec SHARED ${BROTLI_DEC_C})
152+
add_library(brotlienc SHARED ${BROTLI_ENC_C})
153+
154+
add_library(brotlicommon-static STATIC ${BROTLI_COMMON_C})
155+
add_library(brotlidec-static STATIC ${BROTLI_DEC_C})
156+
add_library(brotlienc-static STATIC ${BROTLI_ENC_C})
161157

162158
# Older CMake versions does not understand INCLUDE_DIRECTORIES property.
163159
include_directories(${BROTLI_INCLUDE_DIRS})
@@ -172,8 +168,8 @@ foreach(lib brotlicommon brotlidec brotlienc brotlicommon-static brotlidec-stati
172168
target_link_libraries(${lib} ${LIBM_LIBRARY})
173169
set_property(TARGET ${lib} APPEND PROPERTY INCLUDE_DIRECTORIES ${BROTLI_INCLUDE_DIRS})
174170
set_target_properties(${lib} PROPERTIES
175-
SOVERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
176-
VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
171+
VERSION "${BROTLI_ABI_COMPATIBILITY}.${BROTLI_ABI_AGE}.${BROTLI_ABI_REVISION}"
172+
SOVERSION "${BROTLI_ABI_COMPATIBILITY}"
177173
POSITION_INDEPENDENT_CODE TRUE)
178174
set_property(TARGET ${lib} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIRS}")
179175
endforeach()
@@ -196,7 +192,7 @@ if(BROTLI_PARENT_DIRECTORY)
196192
endif()
197193

198194
# Build the brotli executable
199-
add_executable(brotli c/tools/brotli.c)
195+
add_executable(brotli ${BROTLI_CLI_C})
200196
target_link_libraries(brotli ${BROTLI_LIBRARIES_STATIC})
201197

202198
# Installation
@@ -287,9 +283,7 @@ if(NOT BROTLI_DISABLE_TESTS)
287283
endforeach()
288284
endif()
289285

290-
# Generate a pkg-config file
291-
292-
include(CMakeParseArguments)
286+
# Generate a pkg-config files
293287

294288
function(generate_pkg_config_path outvar path)
295289
string(LENGTH "${path}" path_length)
@@ -334,103 +328,29 @@ function(generate_pkg_config_path outvar path)
334328
set("${outvar}" "${${outvar}}" PARENT_SCOPE)
335329
endfunction(generate_pkg_config_path)
336330

337-
function(generate_pkg_config output_file)
338-
set (options)
339-
set (oneValueArgs NAME DESCRIPTION URL VERSION PREFIX LIBDIR INCLUDEDIR)
340-
set (multiValueArgs DEPENDS_PRIVATE CFLAGS LIBRARIES)
341-
cmake_parse_arguments(GEN_PKG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
342-
unset (options)
343-
unset (oneValueArgs)
344-
unset (multiValueArgs)
345-
346-
if(NOT GEN_PKG_PREFIX)
347-
set(GEN_PKG_PREFIX "${CMAKE_INSTALL_PREFIX}")
348-
endif()
331+
function(transform_pc_file INPUT_FILE OUTPUT_FILE VERSION)
332+
file(READ ${INPUT_FILE} TEXT)
349333

350-
if(NOT GEN_PKG_LIBDIR)
351-
set(GEN_PKG_LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}")
352-
endif()
353-
generate_pkg_config_path(GEN_PKG_LIBDIR "${GEN_PKG_LIBDIR}"
354-
prefix "${GEN_PKG_PREFIX}")
334+
set(PREFIX "${CMAKE_INSTALL_PREFIX}")
335+
string(REGEX REPLACE "@prefix@" "${PREFIX}" TEXT ${TEXT})
336+
string(REGEX REPLACE "@exec_prefix@" "${PREFIX}" TEXT ${TEXT})
355337

356-
if(NOT GEN_PKG_INCLUDEDIR)
357-
set(GEN_PKG_INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
358-
endif()
359-
generate_pkg_config_path(GEN_PKG_INCLUDEDIR "${GEN_PKG_INCLUDEDIR}"
360-
prefix "${GEN_PKG_PREFIX}")
338+
generate_pkg_config_path(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}" prefix "${PREFIX}")
339+
string(REGEX REPLACE "@libdir@" "${LIBDIR}" TEXT ${TEXT})
361340

362-
file(WRITE "${output_file}" "prefix=${GEN_PKG_PREFIX}\n")
363-
file(APPEND "${output_file}" "libdir=${GEN_PKG_LIBDIR}\n")
364-
file(APPEND "${output_file}" "includedir=${GEN_PKG_INCLUDEDIR}\n")
365-
file(APPEND "${output_file}" "\n")
341+
generate_pkg_config_path(INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}" prefix "${PREFIX}")
342+
string(REGEX REPLACE "@includedir@" "${INCLUDEDIR}" TEXT ${TEXT})
366343

367-
if(GEN_PKG_NAME)
368-
file(APPEND "${output_file}" "Name: ${GEN_PKG_NAME}\n")
369-
else()
370-
file(APPEND "${output_file}" "Name: ${CMAKE_PROJECT_NAME}\n")
371-
endif()
344+
string(REGEX REPLACE "@PACKAGE_VERSION@" "${VERSION}" TEXT ${TEXT})
372345

373-
if(GEN_PKG_DESCRIPTION)
374-
file(APPEND "${output_file}" "Description: ${GEN_PKG_DESCRIPTION}\n")
375-
endif()
346+
file(WRITE ${OUTPUT_FILE} ${TEXT})
347+
endfunction()
376348

377-
if(GEN_PKG_URL)
378-
file(APPEND "${output_file}" "URL: ${GEN_PKG_URL}\n")
379-
endif()
349+
transform_pc_file("scripts/libbrotlicommon.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc" "${BROTLI_VERSION}")
380350

381-
if(GEN_PKG_VERSION)
382-
file(APPEND "${output_file}" "Version: ${GEN_PKG_VERSION}\n")
383-
endif()
384-
385-
if(GEN_PKG_DEPENDS_PRIVATE)
386-
file(APPEND "${output_file}" "Requires.private:")
387-
foreach(lib ${GEN_PKG_DEPENDS_PRIVATE})
388-
file(APPEND "${output_file}" " ${lib}")
389-
endforeach()
390-
file(APPEND "${output_file}" "\n")
391-
endif()
392-
393-
if(GEN_PKG_LIBRARIES)
394-
set(libs)
351+
transform_pc_file("scripts/libbrotlidec.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc" "${BROTLI_VERSION}")
395352

396-
file(APPEND "${output_file}" "Libs: -L\${libdir}")
397-
foreach(lib ${GEN_PKG_LIBRARIES})
398-
file(APPEND "${output_file}" " -l${lib}")
399-
endforeach()
400-
file(APPEND "${output_file}" "\n")
401-
endif()
402-
403-
file(APPEND "${output_file}" "Cflags: -I\${includedir}")
404-
if(GEN_PKG_CFLAGS)
405-
foreach(cflag ${GEN_PKG_CFLAGS})
406-
file(APPEND "${output_file}" " ${cflag}")
407-
endforeach()
408-
endif()
409-
file(APPEND "${output_file}" "\n")
410-
endfunction(generate_pkg_config)
411-
412-
generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc"
413-
NAME libbrotlicommon
414-
DESCRIPTION "Shared data used by libbrotlienc and libbrotlidec libraries"
415-
URL "https://github.com/google/brotli"
416-
VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
417-
LIBRARIES brotlicommon)
418-
419-
generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc"
420-
NAME libbrotlidec
421-
DESCRIPTION "Brotli decoder library"
422-
VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
423-
URL "https://github.com/google/brotli"
424-
DEPENDS_PRIVATE libbrotlicommon
425-
LIBRARIES brotlidec)
426-
427-
generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc"
428-
NAME libbrotlienc
429-
DESCRIPTION "Brotli encoder library"
430-
VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
431-
URL "https://github.com/google/brotli"
432-
DEPENDS_PRIVATE libbrotlicommon
433-
LIBRARIES brotlienc)
353+
transform_pc_file("scripts/libbrotlienc.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc" "${BROTLI_VERSION}")
434354

435355
if(NOT BROTLI_BUNDLED_MODE)
436356
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc"

Makefile.am

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
AUTOMAKE_OPTIONS = foreign nostdinc subdir-objects
2+
3+
ACLOCAL_AMFLAGS = -I m4
4+
5+
# Actual ABI version is substituted by bootstrap
6+
LIBBROTLI_VERSION_INFO = -version-info 0:0:0
7+
8+
bin_PROGRAMS = brotli
9+
lib_LTLIBRARIES = libbrotlicommon.la libbrotlidec.la libbrotlienc.la
10+
11+
include scripts/sources.lst
12+
13+
brotliincludedir = $(includedir)/brotli
14+
brotliinclude_HEADERS = $(BROTLI_INCLUDE)
15+
16+
AM_CFLAGS = -I$(top_srcdir)/c/include
17+
18+
brotli_SOURCES = $(BROTLI_CLI_C)
19+
brotli_LDADD = libbrotlidec.la libbrotlienc.la libbrotlicommon.la -lm
20+
#brotli_LDFLAGS = -static
21+
22+
libbrotlicommon_la_SOURCES = $(BROTLI_COMMON_C) $(BROTLI_COMMON_H)
23+
libbrotlicommon_la_LDFLAGS = $(AM_LDFLAGS) $(LIBBROTLI_VERSION_INFO) $(LDFLAGS)
24+
libbrotlidec_la_SOURCES = $(BROTLI_DEC_C) $(BROTLI_DEC_H)
25+
libbrotlidec_la_LDFLAGS = $(AM_LDFLAGS) $(LIBBROTLI_VERSION_INFO) $(LDFLAGS)
26+
libbrotlienc_la_SOURCES = $(BROTLI_ENC_C) $(BROTLI_ENC_H)
27+
libbrotlienc_la_LDFLAGS = $(AM_LDFLAGS) $(LIBBROTLI_VERSION_INFO) $(LDFLAGS)
28+
29+
pkgconfigdir = $(libdir)/pkgconfig
30+
pkgconfig_DATA = \
31+
scripts/libbrotlicommon.pc \
32+
scripts/libbrotlidec.pc \
33+
scripts/libbrotlienc.pc
34+
pkgincludedir= $(brotliincludedir)
35+
36+
dist_doc_DATA = README

README

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
BROTLI DATA COMPRESSIOM LIBRARY
2+
3+
Brotli is a generic-purpose lossless compression algorithm that compresses data
4+
using a combination of a modern variant of the LZ77 algorithm, Huffman coding
5+
and 2nd order context modeling, with a compression ratio comparable to the best
6+
currently available general-purpose compression methods. It is similar in speed
7+
with deflate but offers more dense compression.
8+
9+
The specification of the Brotli Compressed Data Format is defined in RFC 7932
10+
https://tools.ietf.org/html/rfc7932
11+
12+
Brotli is open-sourced under the MIT License, see the LICENSE file.
13+
14+
Brotli mailing list:
15+
https://groups.google.com/forum/#!forum/brotli

bootstrap

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# !/bin/sh -e
2+
3+
mkdir m4 2>/dev/null
4+
5+
BROTLI_ABI_HEX=`sed -n 's/#define BROTLI_ABI_VERSION 0x//p' c/common/version.h`
6+
BROTLI_ABI_INT=`echo $((16#$BROTLI_ABI_HEX))`
7+
BROTLI_ABI_CURRENT=$(($BROTLI_ABI_INT >> 24))
8+
BROTLI_ABI_REVISION=$((($BROTLI_ABI_INT >> 12) & 4095))
9+
BROTLI_ABI_AGE=$(($BROTLI_ABI_INT & 4095))
10+
BROTLI_ABI_INFO="$BROTLI_ABI_CURRENT:$BROTLI_ABI_REVISION:$BROTLI_ABI_AGE"
11+
12+
BROTLI_VERSION_HEX=`sed -n 's/#define BROTLI_VERSION 0x//p' c/common/version.h`
13+
BROTLI_VERSION_INT=`echo $((16#$BROTLI_VERSION_HEX))`
14+
BROTLI_VERSION_MAJOR=$(($BROTLI_VERSION_INT >> 24))
15+
BROTLI_VERSION_MINOR=$((($BROTLI_VERSION_INT >> 12) & 4095))
16+
BROTLI_VERSION_PATCH=$(($BROTLI_VERSION_INT & 4095))
17+
BROTLI_VERSION="$BROTLI_VERSION_MAJOR.$BROTLI_VERSION_MINOR.$BROTLI_VERSION_PATCH"
18+
19+
sed -r "s/[0-9]+:[0-9]+:[0-9]+/$BROTLI_ABI_INFO/" Makefile.am -i
20+
sed -r "s/\[[0-9]+\.[0-9]+\.[0-9]+\]/[$BROTLI_VERSION]/" configure.ac -i
21+
22+
autoreconf --install --force --symlink || exit $

c/common/version.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@
1414
BrotliEncoderVersion methods. */
1515

1616
/* Semantic version, calculated as (MAJOR << 24) | (MINOR << 12) | PATCH */
17-
#define BROTLI_VERSION 0x1000001
17+
#define BROTLI_VERSION 0x1000002
18+
19+
/* This macro is used by build system to produce Libtool-friendly soname. See
20+
https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
21+
*/
22+
23+
/* ABI version, calculated as (CURRENT << 24) | (REVISION << 12) | AGE */
24+
#define BROTLI_ABI_VERSION 0x1002000
1825

1926
#endif /* BROTLI_COMMON_VERSION_H_ */

c/dec/decode.c

+4
Original file line numberDiff line numberDiff line change
@@ -1911,6 +1911,10 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
19111911
size_t* available_out, uint8_t** next_out, size_t* total_out) {
19121912
BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
19131913
BrotliBitReader* br = &s->br;
1914+
/* Ensure that *total_out is set, even if no data will ever be pushed out. */
1915+
if (total_out) {
1916+
*total_out = s->partial_pos_out;
1917+
}
19141918
/* Do not try to process further in a case of unrecoverable error. */
19151919
if ((int)s->error_code < 0) {
19161920
return BROTLI_DECODER_RESULT_ERROR;

c/enc/port.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,21 @@ TEMPLATE_(size_t) TEMPLATE_(uint32_t) TEMPLATE_(uint8_t)
167167
(A)[(J)] = __brotli_swap_tmp; \
168168
}
169169

170+
/*
171+
Dynamically grows array capacity to at least the requested size
172+
M: MemoryManager
173+
T: data type
174+
A: array
175+
C: capacity
176+
R: requested size
177+
*/
170178
#define BROTLI_ENSURE_CAPACITY(M, T, A, C, R) { \
171179
if (C < (R)) { \
172180
size_t _new_size = (C == 0) ? (R) : C; \
173181
T* new_array; \
174182
while (_new_size < (R)) _new_size *= 2; \
175183
new_array = BROTLI_ALLOC((M), T, _new_size); \
176-
if (!BROTLI_IS_OOM(m) && C != 0) \
184+
if (!BROTLI_IS_OOM(M) && C != 0) \
177185
memcpy(new_array, A, C * sizeof(T)); \
178186
BROTLI_FREE((M), A); \
179187
A = new_array; \

c/include/brotli/decode.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,11 @@ BROTLI_DEC_API BROTLI_BOOL BrotliDecoderSetParameter(
159159
*
160160
* @p alloc_func and @p free_func @b MUST be both zero or both non-zero. In the
161161
* case they are both zero, default memory allocators are used. @p opaque is
162-
* passed to @p alloc_func and @p free_func when they are called.
162+
* passed to @p alloc_func and @p free_func when they are called. @p free_func
163+
* should return without doing anything when asked to free a NULL pointer.
163164
*
164165
* @param alloc_func custom memory allocation function
165-
* @param free_func custom memory fee function
166+
* @param free_func custom memory free function
166167
* @param opaque custom memory manager handle
167168
* @returns @c 0 if instance can not be allocated or initialized
168169
* @returns pointer to initialized ::BrotliDecoderState otherwise

c/include/brotli/encode.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,11 @@ BROTLI_ENC_API BROTLI_BOOL BrotliEncoderSetParameter(
209209
*
210210
* @p alloc_func and @p free_func @b MUST be both zero or both non-zero. In the
211211
* case they are both zero, default memory allocators are used. @p opaque is
212-
* passed to @p alloc_func and @p free_func when they are called.
212+
* passed to @p alloc_func and @p free_func when they are called. @p free_func
213+
* should return without doing anything when asked to free a NULL pointer.
213214
*
214215
* @param alloc_func custom memory allocation function
215-
* @param free_func custom memory fee function
216+
* @param free_func custom memory free function
216217
* @param opaque custom memory manager handle
217218
* @returns @c 0 if instance can not be allocated or initialized
218219
* @returns pointer to initialized ::BrotliEncoderState otherwise

configure

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#!/usr/bin/env bash
2-
echo "Use Bazel, CMake or Premake5 to generate projects / build files."
2+
echo "Use Autotools, Bazel, CMake or Premake5 to generate projects / build files."
33
echo " Bazel: http://www.bazel.build/"
44
echo " CMake: https://cmake.org/"
55
echo " Premake5: https://premake.github.io/"
6+
echo "To generate Autotools 'configure' file run './bootstrap'."
7+
echo "Run './configure-cmake' for Autotools-like CMake configuration."
68
echo "Or simply run 'make' to build and test command line tool."

0 commit comments

Comments
 (0)