git: 1d6e02cfc3f0 - stable/13 - MFV: libucl: Update to 0.9.2

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Thu, 02 Oct 2025 08:20:58 UTC
The branch stable/13 has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=1d6e02cfc3f091503f441834840cfcba34c29cae

commit 1d6e02cfc3f091503f441834840cfcba34c29cae
Author:     Muhammad Moinur Rahman <bofh@FreeBSD.org>
AuthorDate: 2025-08-27 18:36:12 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2025-10-02 07:28:55 +0000

    MFV: libucl: Update to 0.9.2
    
    - Add FREEBSD-upgrade instructions
    - Add FREEBSD-Xlist file
    - Remove all unnecessary files which are not required for in-tree build
    
    Approved by: bapt
    Differential Revision:  https://reviews.freebsd.org/D50472
    Event: Oslo Hackathon 202508
    Sponsored by: The FreeBSD Foundation
    
    (cherry picked from commit 2326db40a1d2dd98631d70aae200ca52575139fb)
---
 contrib/libucl/CMakeLists.txt                  | 314 -----------
 contrib/libucl/ChangeLog.md                    | 103 ----
 contrib/libucl/FREEBSD-Xlist                   |  40 ++
 contrib/libucl/FREEBSD-upgrade                 |  39 ++
 contrib/libucl/Makefile.am                     |  81 ---
 contrib/libucl/Makefile.unix                   |  89 ---
 contrib/libucl/Makefile.w32                    |  92 ---
 contrib/libucl/README.md                       | 418 --------------
 contrib/libucl/autogen.sh                      |   2 -
 contrib/libucl/configure.ac                    | 188 -------
 contrib/libucl/doc/Makefile.am                 |   9 -
 contrib/libucl/doc/api.md                      | 506 -----------------
 contrib/libucl/doc/lua_api.md                  | 196 -------
 contrib/libucl/doc/pandoc.template             |  12 -
 contrib/libucl/examples/ucl_cpp.cc             |  26 -
 contrib/libucl/haskell/hucl.hs                 | 123 ----
 contrib/libucl/include/ucl.h                   |   4 +-
 contrib/libucl/libucl.pc                       |  11 -
 contrib/libucl/libucl.pc.in                    |  11 -
 contrib/libucl/lua/Makefile.am                 |  26 -
 contrib/libucl/lua/libucl.rockspec.in          |  26 -
 contrib/libucl/lua/lua_ucl.c                   |  83 ++-
 contrib/libucl/m4/ax_lua.m4                    | 664 ----------------------
 contrib/libucl/m4/gcov.m4                      |  89 ---
 contrib/libucl/python/MANIFEST.in              |   5 -
 contrib/libucl/python/setup.py                 |  75 ---
 contrib/libucl/python/src/uclmodule.c          | 335 -----------
 contrib/libucl/python/tests/__init__.py        |   0
 contrib/libucl/python/tests/compat.py          |   8 -
 contrib/libucl/python/tests/test_dump.py       |  66 ---
 contrib/libucl/python/tests/test_example.py    |  59 --
 contrib/libucl/python/tests/test_load.py       | 122 ----
 contrib/libucl/python/tests/test_validation.py |  50 --
 contrib/libucl/python/ucl.pyi                  |  15 -
 contrib/libucl/src/Makefile.am                 |  30 -
 contrib/libucl/src/mum.h                       |   2 -
 contrib/libucl/src/ucl_emitter.c               |  80 ++-
 contrib/libucl/src/ucl_emitter_streamline.c    |   9 +-
 contrib/libucl/src/ucl_hash.c                  | 146 +++--
 contrib/libucl/src/ucl_msgpack.c               |   4 +-
 contrib/libucl/src/ucl_parser.c                | 214 +++++--
 contrib/libucl/src/ucl_schema.c                |   1 +
 contrib/libucl/src/ucl_util.c                  |  87 +--
 contrib/libucl/stamp-h.in                      |   1 -
 contrib/libucl/tests/.gitignore                |  10 +
 contrib/libucl/tests/Makefile.am               |  45 --
 contrib/libucl/tests/schema/definitions.json   |  32 --
 contrib/libucl/tests/schema/ref.json           |  16 -
 contrib/libucl/tests/schema/refRemote.json     |  76 ---
 contrib/libucl/tests/test_speed.c              |   2 +-
 contrib/libucl/tests/test_streamline.c         |  43 +-
 contrib/libucl/uthash/utlist.h                 | 749 ++++++++++++++++++-------
 contrib/libucl/utils/CMakeLists.txt            |  12 -
 contrib/libucl/utils/Makefile.am               |  23 -
 contrib/libucl/utils/chargen.c                 | 128 -----
 contrib/libucl/utils/objdump.c                 | 185 ------
 contrib/libucl/utils/ucl-tool.c                | 170 ------
 57 files changed, 1072 insertions(+), 4880 deletions(-)

diff --git a/contrib/libucl/CMakeLists.txt b/contrib/libucl/CMakeLists.txt
deleted file mode 100644
index 5fe772a30f88..000000000000
--- a/contrib/libucl/CMakeLists.txt
+++ /dev/null
@@ -1,314 +0,0 @@
-PROJECT(libucl C)
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0 FATAL_ERROR)
-
-SET(LIBUCL_VERSION_MAJOR 0)
-SET(LIBUCL_VERSION_MINOR 5)
-SET(LIBUCL_VERSION_PATCH 0)
-
-SET(LIBUCL_VERSION
-        "${LIBUCL_VERSION_MAJOR}.${LIBUCL_VERSION_MINOR}.${LIBUCL_VERSION_PATCH}")
-
-INCLUDE(CheckCCompilerFlag)
-INCLUDE(CheckCSourceCompiles)
-INCLUDE(FindOpenSSL)
-INCLUDE(GNUInstallDirs)
-
-OPTION(ENABLE_URL_INCLUDE  "Enable urls in ucl includes (requires libcurl or libfetch) [default: OFF]" OFF)
-OPTION(ENABLE_URL_SIGN  "Enable signatures check in ucl includes (requires openssl) [default: OFF]" OFF)
-OPTION(BUILD_SHARED_LIBS "Build Shared Libraries [default: OFF]" OFF)
-OPTION(ENABLE_LUA "Enable lua support [default: OFF]" OFF)
-OPTION(ENABLE_LUAJIT "Enable luajit support [default: OFF]" OFF)
-OPTION(ENABLE_UTILS "Enable building utility binaries [default: OFF]" OFF)
-
-# Find lua installation
-MACRO(FindLua)
-	# Find lua libraries
-	UNSET(LUA_INCLUDE_DIR CACHE)
-	UNSET(LUA_LIBRARY CACHE)
-	CMAKE_PARSE_ARGUMENTS(LUA "" "VERSION_MAJOR;VERSION_MINOR;ROOT" "" ${ARGN})
-
-	IF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
-		MESSAGE(FATAL_ERROR "Invalid FindLua invocation: ${ARGN}")
-	ENDIF()
-
-	IF(ENABLE_LUAJIT MATCHES "ON")
-		MESSAGE(STATUS "Check for luajit ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
-		FIND_PATH(LUA_INCLUDE_DIR luajit.h
-				HINTS
-				"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
-				$ENV{LUA_DIR}
-				PATH_SUFFIXES "include/luajit-2.0"
-				"include/luajit${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
-				"include/luajit${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-				"include/luajit-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-				"include/luajit"
-				"include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
-				"include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-				"include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-				include/lua include
-				PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS}
-		)
-		FIND_LIBRARY(LUA_LIBRARY
-				NAMES luajit
-				"luajit-2.0"
-				"luajit2.0"
-				"luajit${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
-				"luajit${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-				"luajit-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-				HINTS
-				"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
-				$ENV{LUA_DIR}
-				PATH_SUFFIXES lib64 lib
-				PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS}
-				DOC "Lua library"
-		)
-
-		IF(NOT LUA_LIBRARY OR NOT LUA_INCLUDE_DIR)
-			MESSAGE(STATUS "Fallback from luajit to plain lua")
-			SET(ENABLE_LUAJIT "OFF")
-			MESSAGE(STATUS "Check for lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
-			FIND_PATH(LUA_INCLUDE_DIR lua.h
-					HINTS
-					"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
-					$ENV{LUA_DIR}
-					PATH_SUFFIXES "include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
-					"include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-					"include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-					include/lua include
-					PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS}
-			)
-			FIND_LIBRARY(LUA_LIBRARY
-					NAMES lua
-					"lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
-					"lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-					"lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-					HINTS
-					"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
-					$ENV{LUA_DIR}
-					PATH_SUFFIXES lib64 lib
-					PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS}
-					DOC "Lua library"
-			)
-		ENDIF()
-	ELSE(ENABLE_LUAJIT MATCHES "ON")
-		MESSAGE(STATUS "Check for lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
-		FIND_PATH(LUA_INCLUDE_DIR lua.h
-				HINTS
-				"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
-				$ENV{LUA_DIR}
-				PATH_SUFFIXES "include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
-				"include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-				"include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-				include/lua include
-				PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS}
-		)
-		FIND_LIBRARY(LUA_LIBRARY
-				NAMES lua
-				"lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
-				"lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-				"lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
-				HINTS
-				"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
-				$ENV{LUA_DIR}
-				PATH_SUFFIXES lib64 lib
-				PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS}
-				DOC "Lua library"
-		)
-	ENDIF(ENABLE_LUAJIT MATCHES "ON")
-
-	IF(LUA_LIBRARY AND LUA_INCLUDE_DIR)
-		SET(LUA_FOUND 1)
-		IF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
-			SET(LUA_VERSION_MAJOR ${LUA_VERSION_MAJOR})
-			SET(LUA_VERSION_MINOR ${LUA_VERSION_MINOR})
-		ENDIF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
-		IF(ENABLE_LUAJIT MATCHES "ON")
-			MESSAGE(STATUS "Found luajit ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
-		ELSE(ENABLE_LUAJIT MATCHES "ON")
-			MESSAGE(STATUS "Found lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
-		ENDIF(ENABLE_LUAJIT MATCHES "ON")
-	ENDIF(LUA_LIBRARY AND LUA_INCLUDE_DIR)
-ENDMACRO()
-
-IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
-	LIST(APPEND CMAKE_REQUIRED_LIBRARIES rt)
-ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
-
-IF(ENABLE_URL_INCLUDE MATCHES "ON")
-    FIND_LIBRARY(LIBFETCH_LIBRARY NAMES fetch PATHS	PATH_SUFFIXES lib64 lib
-                      PATHS
-                          ~/Library/Frameworks
-                          /Library/Frameworks
-                          /usr/local
-                          /usr
-                          /sw
-                          /opt/local
-                          /opt/csw
-                          /opt
-                     DOC "Path where the libfetch library can be found")
-    IF(LIBFETCH_LIBRARY)
-    	FIND_FILE(HAVE_FETCH_H NAMES fetch.h PATHS /usr/include
-    											   /opt/include
-    											   /usr/local/include
-    				DOC "Path to libfetch header")
-    ELSE(LIBFETCH_LIBRARY)
-    	# Try to find libcurl
-        FIND_PACKAGE(CURL)
-    	IF(NOT CURL_FOUND)
-    		MESSAGE(WARNING "Neither libcurl nor libfetch were found, no support of URL includes in configuration")
-    	ENDIF(NOT CURL_FOUND)
-    ENDIF(LIBFETCH_LIBRARY)
-ENDIF(ENABLE_URL_INCLUDE MATCHES "ON")
-
-set(SYNC_BUILTINS_TEST_SOURCE [====[
-int main()
-{
-    unsigned long val;
-
-    __sync_bool_compare_and_swap(&val, 0, 1);
-    __sync_add_and_fetch(&val, 1);
-    __sync_fetch_and_add(&val, 0);
-    __sync_sub_and_fetch(&val, 1);
-
-    return 0;
-}
-]====])
-
-CHECK_C_SOURCE_COMPILES("${SYNC_BUILTINS_TEST_SOURCE}" HAVE_ATOMIC_BUILTINS)
-IF(NOT HAVE_ATOMIC_BUILTINS)
-    MESSAGE(WARNING "Libucl references could be thread-unsafe because atomic builtins are missing")
-ENDIF(NOT HAVE_ATOMIC_BUILTINS)
-
-SET(CMAKE_C_WARN_FLAGS "")
-CHECK_C_COMPILER_FLAG(-W SUPPORT_W)
-CHECK_C_COMPILER_FLAG(-Wno-pointer-sign SUPPORT_WPOINTER_SIGN)
-CHECK_C_COMPILER_FLAG(-Wno-unused-parameter SUPPORT_WUNUSED_PARAMETER)
-IF(SUPPORT_W)
-    SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -W")
-ENDIF(SUPPORT_W)
-IF(SUPPORT_WPOINTER_SIGN)
-	SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-pointer-sign")
-ENDIF(SUPPORT_WPOINTER_SIGN)
-IF(SUPPORT_WUNUSED_PARAMETER)
-	SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-unused-parameter")
-ENDIF(SUPPORT_WUNUSED_PARAMETER)
-
-SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_WARN_FLAGS}" )
-
-IF(ENABLE_URL_SIGN MATCHES "ON")
-	IF(OPENSSL_FOUND)
-		SET(HAVE_OPENSSL 1)
-		INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}")
-	ENDIF(OPENSSL_FOUND)
-ENDIF(ENABLE_URL_SIGN MATCHES "ON")
-
-SET(UCL_COMPILE_DEFS)
-IF(HAVE_FETCH_H)
-    LIST(APPEND UCL_COMPILE_DEFS -DHAVE_FETCH_H=1)
-ENDIF(HAVE_FETCH_H)
-IF(CURL_FOUND)
-    LIST(APPEND UCL_COMPILE_DEFS -DCURL_FOUND=1)
-ENDIF(CURL_FOUND)
-IF(HAVE_OPENSSL)
-    LIST(APPEND UCL_COMPILE_DEFS -DHAVE_OPENSSL=1)
-ENDIF(HAVE_OPENSSL)
-IF(HAVE_ATOMIC_BUILTINS)
-    LIST(APPEND UCL_COMPILE_DEFS -DHAVE_ATOMIC_BUILTINS=1)
-ENDIF(HAVE_ATOMIC_BUILTINS)
-
-SET(UCLSRC src/ucl_util.c
-		src/ucl_parser.c
-		src/ucl_emitter.c
-		src/ucl_emitter_streamline.c
-		src/ucl_emitter_utils.c
-		src/ucl_hash.c
-		src/ucl_schema.c
-		src/ucl_msgpack.c
-		src/ucl_sexp.c)
-
-SET(UCLHDR include/ucl.h
-		include/ucl++.h)
-
-SET (LIB_TYPE STATIC)
-IF (BUILD_SHARED_LIBS)
-  SET (LIB_TYPE SHARED)
-ENDIF (BUILD_SHARED_LIBS)
-ADD_LIBRARY(ucl ${LIB_TYPE} ${UCLSRC})
-ADD_LIBRARY(ucl::ucl ALIAS ucl)
-SET_TARGET_PROPERTIES(ucl PROPERTIES VERSION ${LIBUCL_VERSION} SOVERSION ${LIBUCL_VERSION_MAJOR})
-TARGET_INCLUDE_DIRECTORIES(ucl
-	PUBLIC
-	  include
-	PRIVATE
-	  src
-	  uthash
-	  klib)
-TARGET_COMPILE_DEFINITIONS(ucl
-    PRIVATE
-    ${UCL_COMPILE_DEFS}
-)
-
-IF(ENABLE_LUA MATCHES "ON")
-	IF(ENABLE_LUAJIT MATCHES "ON")
-		FindLua(VERSION_MAJOR "5" VERSION_MINOR "1" ROOT "${LUA_ROOT}")
-		IF(NOT LUA_FOUND)
-			MESSAGE(FATAL_ERROR "Lua not found, lua support is required")
-		ELSE(NOT LUA_FOUND)
-			INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}")
-		ENDIF(NOT LUA_FOUND)
-	ELSE(ENABLE_LUAJIT MATCHES "ON")
-		FindLua(VERSION_MAJOR "5" VERSION_MINOR "2" ROOT "${LUA_ROOT}")
-		IF(NOT LUA_FOUND)
-			FindLua(VERSION_MAJOR "5" VERSION_MINOR "1" ROOT "${LUA_ROOT}")
-		ENDIF(NOT LUA_FOUND)
-		IF(NOT LUA_FOUND)
-			MESSAGE(FATAL_ERROR "Lua not found, lua support is required")
-		ELSE(NOT LUA_FOUND)
-			INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}")
-		ENDIF(NOT LUA_FOUND)
-	ENDIF(ENABLE_LUAJIT MATCHES "ON")
-	SET(UCL_LUA_SRC lua/lua_ucl.c)
-	ADD_LIBRARY(lua-ucl ${LIB_TYPE} ${UCL_LUA_SRC})
-	ADD_LIBRARY(ucl::lua ALIAS lua-ucl)
-	IF(ENABLE_LUAJIT MATCHES "ON")
-		TARGET_LINK_LIBRARIES(lua-ucl "${LUAJIT_LIBRARY}")
-	ELSE(ENABLE_LUAJIT MATCHES "ON")
-		TARGET_LINK_LIBRARIES(lua-ucl "${LUA_LIBRARY}")
-	ENDIF(ENABLE_LUAJIT MATCHES "ON")
-	TARGET_LINK_LIBRARIES(lua-ucl ucl)
-	TARGET_INCLUDE_DIRECTORIES(lua-ucl PUBLIC include PRIVATE src uthash)
-	SET_TARGET_PROPERTIES(lua-ucl PROPERTIES
-		VERSION ${LIBUCL_VERSION}
-		SOVERSION ${LIBUCL_VERSION_MAJOR}
-		PUBLIC_HEADER include/lua_ucl.h)
-	INSTALL(TARGETS lua-ucl DESTINATION ${CMAKE_INSTALL_LIBDIR}
-			PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
-ENDIF()
-
-IF(HAVE_FETCH_H)
-    TARGET_LINK_LIBRARIES(ucl fetch)
-ELSE(HAVE_FETCH_H)
-    IF(CURL_FOUND)
-        TARGET_LINK_LIBRARIES(ucl ${CURL_LIBRARIES})
-    ENDIF(CURL_FOUND)
-ENDIF(HAVE_FETCH_H)
-IF(ENABLE_URL_SIGN MATCHES "ON")
-	IF(OPENSSL_FOUND)
-		TARGET_LINK_LIBRARIES(ucl ${OPENSSL_LIBRARIES})
-	ENDIF(OPENSSL_FOUND)
-ENDIF(ENABLE_URL_SIGN MATCHES "ON")
-
-IF(UNIX)
-    TARGET_LINK_LIBRARIES(ucl -lm)
-ENDIF(UNIX)
-
-SET_TARGET_PROPERTIES(ucl PROPERTIES
-	PUBLIC_HEADER "${UCLHDR}")
-
-INSTALL(TARGETS ucl DESTINATION ${CMAKE_INSTALL_LIBDIR}
-		PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
-
-IF(ENABLE_UTILS MATCHES "ON")
-    ADD_SUBDIRECTORY(utils)
-ENDIF()
-
diff --git a/contrib/libucl/ChangeLog.md b/contrib/libucl/ChangeLog.md
deleted file mode 100644
index cba29aa9a7b5..000000000000
--- a/contrib/libucl/ChangeLog.md
+++ /dev/null
@@ -1,103 +0,0 @@
-# Version history
-
-## Libucl 0.5
-
-- Streamline emitter has been added, so it is now possible to output partial `ucl` objects
-- Emitter now is more flexible due to emitter_context structure
-
-### 0.5.1
-- Fixed number of bugs and memory leaks
-
-### 0.5.2
-
-- Allow userdata objects to be emitted and destructed
-- Use userdata objects to store lua function references
-
-### Libucl 0.6
-
-- Reworked macro interface
-
-### Libucl 0.6.1
-
-- Various utilities fixes
-
-### Libucl 0.7.0
-
-- Move to klib library from uthash to reduce memory overhead and increase performance
-
-### Libucl 0.7.1
-
-- Added safe iterators API
-
-### Libucl 0.7.2
-
-- Fixed serious bugs in schema and arrays iteration
-
-### Libucl 0.7.3
-
-- Fixed a bug with macros that come after an empty object
-- Fixed a bug in include processing when an incorrect variable has been destroyed (use-after-free)
-
-### Libucl 0.8.0
-
-- Allow to save comments and macros when parsing UCL documents
-- C++ API
-- Python bindings (by Eitan Adler)
-- Add msgpack support for parser and emitter
-- Add Canonical S-expressions parser for libucl
-- CLI interface for parsing and validation (by Maxim Ignatenko)
-- Implement include with priority
-- Add 'nested' functionality to .include macro (by Allan Jude)
-- Allow searching an array of paths for includes (by Allan Jude)
-- Add new .load macro (by Allan Jude)
-- Implement .inherit macro (#100)
-- Add merge strategies
-- Add schema validation to lua API
-- Add support for external references to schema validation
-- Add coveralls integration to libucl
-- Implement tests for 80% of libucl code lines
-- Fix tonns of minor and major bugs
-- Improve documentation
-- Rework function names to the common conventions (old names are preserved for backwards compatibility)
-- Add Coverity scan integration
-- Add fuzz tests
-
-**Incompatible changes**:
-
-- `ucl_object_emit_full` now accepts additional argument `comments` that could be used to emit comments with UCL output
-
-### Libucl 0.8.1
-
-- Create ucl_parser_add_file_full() to be able to specify merge mode and parser type (by Allan Jude)
-- C++ wrapper improvements (by @ftilde)
-- C++ wrapper: add convenience method at() and lookup() (by Yonghee Kim)
-- C++ wrapper: add assignment operator to Ucl class (by Yonghee Kim)
-- C++ wrapper: support variables in parser (by Yonghee Kim)
-- C++ wrapper: refactoring C++ interface (by Yonghee Kim):
-    - use auto variables (if possible)
-    - remove dangling expressions
-    - use std::set::emplace instead of std::set::insert
-    - not use std::move in return statement; considering copy elision
-- C++ wrapper: fix compilation error and warnings (by Zhe Wang)
-- C++ wrapper: fix iteration over objects in which the first value is `false` (by Zhe Wang)
-- C++ wrapper: Macro helper functions (by Chris Meacham)
-- C++ wrapper: Changing the duplicate strategy in the C++ API (by Chris Meacham)
-- C++ wrapper: Added access functions for the size of a UCL_ARRAY (by Chris Meacham)
-- Fix caseless comparison
-- Fix include when EPERM is issued
-- Fix Windows build
-- Allow to reserve space in arrays and hashes
-- Fix bug with including of empty files
-- Move to mum_hash from xxhash
-- Fix msgpack on non-x86
-- python: Add support to Python 3 (by Denis Volpato Martins)
-- python: Add support for Python 2.6 tests (by Denis Volpato Martins)
-- python: Implement validation function and tests (by Denis Volpato Martins)
-- python: Added UCL_NULL handling and tests (by Denis Volpato Martins)
-- Fix schema validation for patternProperties with object data (by Denis Volpato Martins)
-- Remove the dependency on NBBY, add missing <strings.h> include (by Ed Schouten)
-- Allow to emit msgpack from Lua
-- Performance improvements in Lua API
-- Allow to pass opaque objects in Lua API for transparent C passthrough
-- Various bugs fixed
-- Couple of memory leaks plugged
\ No newline at end of file
diff --git a/contrib/libucl/FREEBSD-Xlist b/contrib/libucl/FREEBSD-Xlist
new file mode 100644
index 000000000000..6d8cb4ff8f5b
--- /dev/null
+++ b/contrib/libucl/FREEBSD-Xlist
@@ -0,0 +1,40 @@
+.github
+.gitignore
+CMakeLists.txt
+ChangeLog.md
+Makefile.am
+Makefile.unix
+Makefile.w32
+README.md
+autogen.sh
+configure.ac
+doc/Makefile.am
+doc/api.md
+doc/lua_api.md
+doc/pandoc.template
+examples/ucl_cpp.cc
+haskell/hucl.hs
+libucl.pc.in
+lua/Makefile.am
+lua/libucl.rockspec.in
+m4/.gitignore
+m4/ax_lua.m4
+m4/gcov.m4
+python/MANIFEST.in
+python/setup.py
+python/src/uclmodule.c
+python/tests/__init__.py
+python/tests/compat.py
+python/tests/test_dump.py
+python/tests/test_example.py
+python/tests/test_load.py
+python/tests/test_validation.py
+python/ucl.pyi
+src/Makefile.am
+stamp-h.in
+tests/Makefile.am
+utils/CMakeLists.txt
+utils/Makefile.am
+utils/chargen.c
+utils/objdump.c
+utils/ucl-tool.c
diff --git a/contrib/libucl/FREEBSD-upgrade b/contrib/libucl/FREEBSD-upgrade
new file mode 100644
index 000000000000..b80736d7877b
--- /dev/null
+++ b/contrib/libucl/FREEBSD-upgrade
@@ -0,0 +1,39 @@
+# FreeBSD libucl import instruction
+#
+# At least the following ports are required when importing libucl:
+# - devel/autoconf
+# - devel/automake
+# - devel/git
+# - devel/gmake
+# - devel/libtool
+#
+# 1. Vendor import
+#
+# $ git clone https://github.com/vstakhov/libucl.git /tmp/libucl
+# $ cd /tmp/libucl
+# $ git checkout <REF_BRANCH_TO_BE_IMPORTED>
+# $ cd /usr/src
+# $ git checkout vendor/libucl
+# $ rsync -va --delete --exclude=.git /tmp/libucl/ /usr/src/contrib/libucl/
+# $ git add .
+# $ git commit -m "vendor import libucl <REF_BRANCH_TO_BE_IMPORTED>"
+# $ git tag -a vendor/libucl/<REF_BRANCH_TO_BE_IMPORTED> -m "vendor import libucl <REF_BRANCH_TO_BE_IMPORTED>"
+# $ git push --follow-tags freebsd vendor/libucl/<REF_BRANCH_TO_BE_IMPORTED>
+#
+# 2. Test
+#
+# $ cd /usr/src
+# $ git checkout vendor/libucl/<REF_BRANCH_TO_BE_IMPORTED>
+# $ ./autogen.sh
+# $ ./configure
+# $ gmake
+# $ gmake check
+# $ gmake clean
+#
+# 3. Merge vendor tree
+#
+# $ git subtree merge -P contrib/libucl vendor/libucl/<REF_BRANCH_TO_BE_IMPORTED>
+# $ sh -c 'for F in `cat FREEBSD-Xlist | grep -v FreeBSD`; do rm -rf ./$F ; done'
+#
+# Recheck if there were any new files were added which are not necessary in the
+# contrib tree. If so, remove them and also add them to the FREEBSD-Xlist file.
diff --git a/contrib/libucl/Makefile.am b/contrib/libucl/Makefile.am
deleted file mode 100644
index 5b51bcc3b468..000000000000
--- a/contrib/libucl/Makefile.am
+++ /dev/null
@@ -1,81 +0,0 @@
-ACLOCAL_AMFLAGS = -I m4
-EXTRA_DIST = uthash klib README.md
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = libucl.pc
-
-if LUA_SUB
-  LUA_SUBDIR = lua
-endif
-
-COVERAGE_INFO_FILE = $(top_builddir)/coverage.info
-COVERAGE_REPORT_DIR = $(top_builddir)/coverage
-
-.PHONY = coverage-requirement-check clean-coverage-report
-
-coverage-requirement-check:
-	@if test ! -e $(GCOV); then \
-		echo "Cannot find $(GCOV). Please install gcov."; \
-		exit 1; \
-	fi
-
-coverage: coverage-requirement-check clean-coverage coverage-build coverage-check coverage-report
-	@echo "Please execute 'make clean' before 'make' or 'make check' to remove instrumented object files(compiled with -O0 etc.). Note that 'make clean' also remove coverage data."
-
-coverage-build: coverage-requirement-check
-	@if test `find $(top_builddir) -name "*.gcno" | wc -l` -eq 0; then \
-		echo "Start to remove old non-instrumented object files..."; \
-		$(MAKE) $(AM_MAKEFLAGS) clean; \
-		echo "Successfully removed old non-instrumented object files."; \
-	fi
-	@echo "Start to build libraries with coverage options..."
-	$(MAKE) $(AM_MAKEFLAGS) \
-		CFLAGS="$(CFLAGS) $(COVERAGE_CFLAGS) $(COVERAGE_OPTFLAGS)" \
-		CXXFLAGS="$(CXXFLAGS) $(COVERAGE_CXXFLAGS) $(COVERAGE_OPTFLAGS)" \
-		LDFLAGS="$(LDFLAGS) $(COVERAGE_LDFLAGS)" \
-		LIBS="$(LIBS) $(COVERAGE_LIBS)"
-	@echo "Successfully built libraries with coverage options."
-
-coverage-check: coverage-requirement-check
-	@echo "Start to run tests with instrumented libraries..."
-	$(MAKE) $(AM_MAKEFLAGS) check \
-		CFLAGS="$(CFLAGS) $(COVERAGE_CFLAGS) $(COVERAGE_OPTFLAGS)" \
-		CXXFLAGS="$(CXXFLAGS) $(COVERAGE_CXXFLAGS) $(COVERAGE_OPTFLAGS)" \
-		LDFLAGS="$(LDFLAGS) $(COVERAGE_LDFLAGS)" \
-		LIBS="$(LIBS) $(COVERAGE_LIBS)"
-	@echo "Successfully run tests with instrumented libraries."
-
-coverage-lcov: coverage-check coverage-requirement-check
-	$(LCOV) --capture \
-		--directory "$(top_builddir)/" \
-		--output-file $(COVERAGE_INFO_FILE) \
-		--gcov-tool $(GCOV) \
-		--compat-libtool --checksum
-	$(LCOV) --extract $(COVERAGE_INFO_FILE) `pwd`/src/ucl_\* \
-		--output-file $(COVERAGE_INFO_FILE)
-
-coverage-report: coverage-lcov
-	@echo "Start to create coverage reports..."
-	$(GENHTML) --prefix "$(top_srcdir)" \
-		--output-directory $(COVERAGE_REPORT_DIR) \
-		--title $(PACKAGE_NAME) \
-		--legend --show-details \
-		$(GENHTML_OPTIONS) \
-		$(COVERAGE_INFO_FILE)
-	@echo "Successfully created coverage reports into $(COVERAGE_REPORT_DIR) directory."
-
-clean-coverage-report:
-	-rm -rf $(COVERAGE_INFO_FILE)
-	-rm -rf $(COVERAGE_REPORT_DIR)
-
-clean-coverage: clean-coverage-report
-	-$(LCOV) --gcov-tool $(GCOV) --zerocounters --directory $(top_builddir)
-	@if xargs --version 2>/dev/null; then \
-		find $(top_builddir) -name "*.gcno" | xargs --no-run-if-empty rm; \
-	else \
-		find $(top_builddir) -name "*.gcno" | xargs rm; \
-	fi
-
-clean-local: clean-coverage
-
-SUBDIRS = src tests utils doc $(LUA_SUBDIR)
diff --git a/contrib/libucl/Makefile.unix b/contrib/libucl/Makefile.unix
deleted file mode 100644
index 0653d4843f7e..000000000000
--- a/contrib/libucl/Makefile.unix
+++ /dev/null
@@ -1,89 +0,0 @@
-CC ?= gcc
-DESTDIR ?= /usr/local
-LD ?= gcc
-C_COMMON_FLAGS ?= -fPIC -Wall -W -Wno-unused-parameter -Wno-pointer-sign -I./include -I./uthash -I./src -I./klib
-MAJOR_VERSION = 0
-MINOR_VERSION = 2
-PATCH_VERSION = 9
-VERSION = "$(MAJOR_VERSION).$(MINOR_VERSION).$(PATCH_VERSION)"
-SONAME = libucl.so
-SONAME_FULL = $(SONAME).$(MAJOR_VERSION)
-OBJDIR ?= .obj
-TESTDIR ?= tests
-SRCDIR ?= src
-INCLUDEDIR ?= include
-MKDIR ?= mkdir
-INSTALL ?= install
-RM ?= rm
-RMDIR ?= rmdir
-LN ?= ln
-LD_SHARED_FLAGS ?= -Wl,-soname,$(SONAME) -shared -lm
-LD_UCL_FLAGS ?= -L$(OBJDIR) -Wl,-rpath,$(OBJDIR) -lucl
-LD_ADD ?= -lrt
-COPT_FLAGS ?= -O2
-HDEPS = $(SRCDIR)/ucl_hash.h \
-		$(SRCDIR)/ucl_chartable.h \
-		$(SRCDIR)/ucl_internal.h \
-		$(INCLUDEDIR)/ucl.h \
-		$(SRCDIR)/mum.h
-OBJECTS = $(OBJDIR)/ucl_hash.o \
-		$(OBJDIR)/ucl_util.o \
-		$(OBJDIR)/ucl_parser.o \
-		$(OBJDIR)/ucl_emitter.o \
-		$(OBJDIR)/ucl_schema.o
-
-all: $(OBJDIR) $(OBJDIR)/$(SONAME)
-
-$(OBJDIR)/$(SONAME): $(OBJDIR)/$(SONAME_FULL)
-	$(LN) -sf $(SONAME_FULL) $(OBJDIR)/$(SONAME)
-
-$(OBJDIR)/$(SONAME_FULL): $(OBJECTS)
-	$(CC) -o $(OBJDIR)/$(SONAME_FULL) $(OBJECTS) $(LD_SHARED_FLAGS) $(LDFLAGS) $(SSL_LIBS) $(FETCH_LIBS)
-
-$(OBJDIR):
-	@$(MKDIR) -p $(OBJDIR)
-
-# Compile rules
-$(OBJDIR)/ucl_util.o: $(SRCDIR)/ucl_util.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/ucl_util.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/ucl_util.c
-$(OBJDIR)/ucl_parser.o: $(SRCDIR)/ucl_parser.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/ucl_parser.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/ucl_parser.c
-$(OBJDIR)/ucl_emitter.o: $(SRCDIR)/ucl_emitter.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/ucl_emitter.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/ucl_emitter.c
-$(OBJDIR)/ucl_hash.o: $(SRCDIR)/ucl_hash.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/ucl_hash.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/ucl_hash.c
-$(OBJDIR)/ucl_schema.o: $(SRCDIR)/ucl_schema.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/ucl_schema.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/ucl_schema.c
-
-clean:
-	$(RM) $(OBJDIR)/*.o $(OBJDIR)/$(SONAME_FULL) $(OBJDIR)/$(SONAME) $(OBJDIR)/chargen $(OBJDIR)/test_basic $(OBJDIR)/test_speed $(OBJDIR)/objdump $(OBJDIR)/test_generate $(OBJDIR)/test_schema || true
-	$(RMDIR) $(OBJDIR)
-	
-# Utils
-
-chargen: utils/chargen.c $(OBJDIR)/$(SONAME)
-	$(CC) -o $(OBJDIR)/chargen $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) $(LDFLAGS) utils/chargen.c
-objdump: utils/objdump.c $(OBJDIR)/$(SONAME)
-	$(CC) -o $(OBJDIR)/objdump $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) $(LDFLAGS) utils/objdump.c $(LD_UCL_FLAGS)
-
-# Tests
-
-test: $(OBJDIR) $(OBJDIR)/$(SONAME) $(OBJDIR)/test_basic $(OBJDIR)/test_speed $(OBJDIR)/test_generate $(OBJDIR)/test_schema
-
-run-test: test
-	TEST_DIR=$(TESTDIR) $(TESTDIR)/run_tests.sh $(OBJDIR)/test_basic $(OBJDIR)/test_speed $(OBJDIR)/test_generate $(OBJDIR)/test_schema
-	
-$(OBJDIR)/test_basic: $(TESTDIR)/test_basic.c $(OBJDIR)/$(SONAME)
-	$(CC) -o $(OBJDIR)/test_basic $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) $(LDFLAGS) $(TESTDIR)/test_basic.c $(LD_UCL_FLAGS)
-$(OBJDIR)/test_schema: $(TESTDIR)/test_schema.c $(OBJDIR)/$(SONAME)
-	$(CC) -o $(OBJDIR)/test_schema $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) $(LDFLAGS) $(TESTDIR)/test_schema.c $(LD_UCL_FLAGS)
-$(OBJDIR)/test_speed: $(TESTDIR)/test_speed.c $(OBJDIR)/$(SONAME)
-	$(CC) -o $(OBJDIR)/test_speed $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) $(LDFLAGS) $(TESTDIR)/test_speed.c $(LD_UCL_FLAGS) $(LD_ADD)
-$(OBJDIR)/test_generate: $(TESTDIR)/test_generate.c $(OBJDIR)/$(SONAME)
-	$(CC) -o $(OBJDIR)/test_generate $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) $(LDFLAGS) $(TESTDIR)/test_generate.c $(LD_UCL_FLAGS) $(LD_ADD)
-
-install: $(OBJDIR)/$(SONAME)
-	$(INSTALL) -m0755 $(SONAME) $(DESTDIR)/lib/$(SONAME)
-	$(INSTALL) -m0644 include/ucl.h $(DESTDIR)/include/ucl.h
-
-.PHONY: clean $(OBJDIR)
diff --git a/contrib/libucl/Makefile.w32 b/contrib/libucl/Makefile.w32
deleted file mode 100644
index 5d9398bf1988..000000000000
--- a/contrib/libucl/Makefile.w32
+++ /dev/null
@@ -1,92 +0,0 @@
-CC ?= gcc
-DESTDIR ?= /usr/local
-LD ?= gcc
-C_COMMON_FLAGS ?= -fPIC -Wall -W -Wno-unused-parameter -Wno-pointer-sign -I./include -I./uthash -I./src
-MAJOR_VERSION = 0
-MINOR_VERSION = 2
-PATCH_VERSION = 9
-VERSION = "$(MAJOR_VERSION).$(MINOR_VERSION).$(PATCH_VERSION)"
-SONAME = libucl.dll
-OBJDIR ?= .obj
-TESTDIR ?= tests
-SRCDIR ?= src
-INCLUDEDIR ?= include
-MKDIR ?= mkdir
-INSTALL ?= install
-RM ?= rm
-RMDIR ?= rmdir
-ifeq (Windows_NT, $(OS))
-LN ?= ln
-else
-LN ?= rem ln
-endif
-LD_SHARED_FLAGS ?= -Wl,-soname,$(SONAME) -shared -lm
-LD_UCL_FLAGS ?= -L$(OBJDIR) -Wl,-rpath,$(OBJDIR) -lucl
-LD_ADD ?= -lrt
-COPT_FLAGS ?= -O2
-HDEPS = $(SRCDIR)/ucl_hash.h \
-		$(SRCDIR)/ucl_chartable.h \
-		$(SRCDIR)/ucl_internal.h \
-		$(INCLUDEDIR)/ucl.h \
-		$(SRCDIR)/mum.h
-OBJECTS = $(OBJDIR)/ucl_hash.o \
-		$(OBJDIR)/ucl_util.o \
-		$(OBJDIR)/ucl_parser.o \
-		$(OBJDIR)/ucl_emitter.o \
-		$(OBJDIR)/ucl_emitter_utils.o \
-		$(OBJDIR)/ucl_schema.o
-
-all: $(OBJDIR) $(OBJDIR)/$(SONAME)
-
-$(OBJDIR)/$(SONAME): $(OBJECTS)
-	$(CC) -o $(OBJDIR)/$(SONAME) $(OBJECTS) $(LD_SHARED_FLAGS) $(LDFLAGS) $(SSL_LIBS) $(FETCH_LIBS)
-
-$(OBJDIR):
-	@$(MKDIR) -p $(OBJDIR)
-
-# Compile rules
-$(OBJDIR)/ucl_util.o: $(SRCDIR)/ucl_util.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/ucl_util.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/ucl_util.c
-$(OBJDIR)/ucl_parser.o: $(SRCDIR)/ucl_parser.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/ucl_parser.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/ucl_parser.c
-$(OBJDIR)/ucl_emitter.o: $(SRCDIR)/ucl_emitter.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/ucl_emitter.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/ucl_emitter.c
-$(OBJDIR)/ucl_emitter_utils.o: $(SRCDIR)/ucl_emitter_utils.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/ucl_emitter_utils.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/ucl_emitter_utils.c
-$(OBJDIR)/ucl_hash.o: $(SRCDIR)/ucl_hash.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/ucl_hash.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/ucl_hash.c
-$(OBJDIR)/ucl_schema.o: $(SRCDIR)/ucl_schema.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/ucl_schema.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/ucl_schema.c
-$(OBJDIR)/xxhash.o: $(SRCDIR)/xxhash.c $(HDEPS)
-	$(CC) -o $(OBJDIR)/xxhash.o $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) -c $(SRCDIR)/xxhash.c
-
-clean:
-	$(RM) $(OBJDIR)/*.o $(OBJDIR)/$(SONAME) $(OBJDIR)/$(SONAME) $(OBJDIR)/chargen $(OBJDIR)/test_basic $(OBJDIR)/test_speed $(OBJDIR)/objdump $(OBJDIR)/test_generate
-	$(RMDIR) $(OBJDIR)
-
-# Utils
-
-chargen: utils/chargen.c $(OBJDIR)/$(SONAME)
-	$(CC) -o $(OBJDIR)/chargen $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) $(LDFLAGS) utils/chargen.c
-objdump: utils/objdump.c $(OBJDIR)/$(SONAME)
-	$(CC) -o $(OBJDIR)/objdump $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) $(LDFLAGS) utils/objdump.c $(LD_UCL_FLAGS)
-
-# Tests
-
-test: $(OBJDIR) $(OBJDIR)/$(SONAME) $(OBJDIR)/test_basic $(OBJDIR)/test_speed $(OBJDIR)/test_generate
-
-run-test: test
-	TEST_DIR=$(TESTDIR) $(TESTDIR)/run_tests.sh $(OBJDIR)/test_basic $(OBJDIR)/test_speed $(OBJDIR)/test_generate
-
-$(OBJDIR)/test_basic: $(TESTDIR)/test_basic.c $(OBJDIR)/$(SONAME)
-	$(CC) -o $(OBJDIR)/test_basic $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) $(LDFLAGS) $(TESTDIR)/test_basic.c $(LD_UCL_FLAGS)
-$(OBJDIR)/test_speed: $(TESTDIR)/test_speed.c $(OBJDIR)/$(SONAME)
-	$(CC) -o $(OBJDIR)/test_speed $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) $(LDFLAGS) $(TESTDIR)/test_speed.c $(LD_UCL_FLAGS) $(LD_ADD)
-$(OBJDIR)/test_generate: $(TESTDIR)/test_generate.c $(OBJDIR)/$(SONAME)
-	$(CC) -o $(OBJDIR)/test_generate $(CPPFLAGS) $(COPT_FLAGS) $(CFLAGS) $(C_COMMON_FLAGS) $(SSL_CFLAGS) $(FETCH_FLAGS) $(LDFLAGS) $(TESTDIR)/test_generate.c $(LD_UCL_FLAGS) $(LD_ADD)
-
-install: $(OBJDIR)/$(SONAME)
-	$(INSTALL) -m0755 $(SONAME) $(DESTDIR)/lib/$(SONAME)
-	$(INSTALL) -m0644 include/ucl.h $(DESTDIR)/include/ucl.h
-
-.PHONY: clean $(OBJDIR)
diff --git a/contrib/libucl/README.md b/contrib/libucl/README.md
deleted file mode 100644
index 53d8a651d73b..000000000000
--- a/contrib/libucl/README.md
+++ /dev/null
@@ -1,418 +0,0 @@
-# LIBUCL
-
-[![CircleCI](https://circleci.com/gh/vstakhov/libucl.svg?style=svg)](https://circleci.com/gh/vstakhov/libucl)
-[![Coverity](https://scan.coverity.com/projects/4138/badge.svg)](https://scan.coverity.com/projects/4138)
-[![Coverage Status](https://coveralls.io/repos/github/vstakhov/libucl/badge.svg?branch=master)](https://coveralls.io/github/vstakhov/libucl?branch=master)
-
-**Table of Contents**  *generated with [DocToc](http://doctoc.herokuapp.com/)*
-
-- [Introduction](#introduction)
-- [Basic structure](#basic-structure)
-- [Improvements to the json notation](#improvements-to-the-json-notation)
-	- [General syntax sugar](#general-syntax-sugar)
-	- [Automatic arrays creation](#automatic-arrays-creation)
-	- [Named keys hierarchy](#named-keys-hierarchy)
-	- [Convenient numbers and booleans](#convenient-numbers-and-booleans)
-- [General improvements](#general-improvements)
-	- [Comments](#comments)
-	- [Macros support](#macros-support)
-	- [Variables support](#variables-support)
-	- [Multiline strings](#multiline-strings)
-	- [Single quoted strings](#single-quoted-strings)
-- [Emitter](#emitter)
-- [Validation](#validation)
-- [Performance](#performance)
-- [Conclusion](#conclusion)
-
-## Introduction
-
-This document describes the main features and principles of the configuration
-language called `UCL` - universal configuration language.
-
-If you are looking for the libucl API documentation you can find it at [this page](doc/api.md).
-
-## Basic structure
-
-UCL is heavily infused by `nginx` configuration as the example of a convenient configuration
-system. However, UCL is fully compatible with `JSON` format and is able to parse json files.
-For example, you can write the same configuration in the following ways:
-
-* in nginx like:
-
-```nginx
-param = value;
-section {
-    param = value;
-    param1 = value1;
-    flag = true;
-    number = 10k;
-    time = 0.2s;
-    string = "something";
-    subsection {
-        host = {
-            host = "hostname";
-            port = 900;
-        }
-        host = {
-            host = "hostname";
-            port = 901;
-        }
-    }
-}
-```
-
-* or in JSON:
-
-```json
-{
-    "param": "value",
-    "section": {
-        "param": "value",
-        "param1": "value1",
-        "flag": true,
-        "number": 10000,
-        "time": "0.2s",
-        "string": "something",
-        "subsection": {
-            "host": [
-                {
-                    "host": "hostname",
-                    "port": 900
-                },
-                {
-                    "host": "hostname",
-                    "port": 901
-                }
-            ]
-        }
-    }
-}
-```
-
-## Improvements to the json notation.
-
-There are various things that make ucl configuration more convenient for editing than strict json:
-
-### General syntax sugar
-
*** 6765 LINES SKIPPED ***