aboutsummaryrefslogtreecommitdiff
path: root/third-party/cmake
diff options
context:
space:
mode:
authorJames McCoy <jamessan@jamessan.com>2018-03-28 21:52:06 -0400
committerJames McCoy <jamessan@jamessan.com>2018-03-28 21:54:39 -0400
commit79f9c2d9c650ceab27cdc6707fd6d7fa1de29fc1 (patch)
tree4e0589d75801f3ff6a9678f84f5009102766661e /third-party/cmake
parent4403864da3c48412595d439f36458d1e6ccfc49f (diff)
parent3f3de9b1a95d273463a87516365510dbffcaf3d2 (diff)
downloadrneovim-79f9c2d9c650ceab27cdc6707fd6d7fa1de29fc1.tar.gz
rneovim-79f9c2d9c650ceab27cdc6707fd6d7fa1de29fc1.tar.bz2
rneovim-79f9c2d9c650ceab27cdc6707fd6d7fa1de29fc1.zip
Merge branch 'master' into yagebu/option-fixes
Diffstat (limited to 'third-party/cmake')
-rw-r--r--third-party/cmake/BuildGettext.cmake34
-rw-r--r--third-party/cmake/BuildGperf.cmake17
-rw-r--r--third-party/cmake/BuildLibtermkey.cmake10
-rw-r--r--third-party/cmake/BuildLibuv.cmake29
-rw-r--r--third-party/cmake/BuildLibvterm.cmake29
-rw-r--r--third-party/cmake/BuildLua.cmake4
-rw-r--r--third-party/cmake/BuildLuajit.cmake5
-rw-r--r--third-party/cmake/BuildLuarocks.cmake91
-rw-r--r--third-party/cmake/BuildMsgpack.cmake3
-rw-r--r--third-party/cmake/BuildUnibilium.cmake66
-rw-r--r--third-party/cmake/GettextCMakeLists.txt83
-rw-r--r--third-party/cmake/GperfCMakeLists.txt30
-rw-r--r--third-party/cmake/LibuvCMakeLists.txt27
-rw-r--r--third-party/cmake/Libvterm-tbl2inc_c.cmake163
-rw-r--r--third-party/cmake/LibvtermCMakeLists.txt43
-rw-r--r--third-party/cmake/UnibiliumCMakeLists.txt27
16 files changed, 565 insertions, 96 deletions
diff --git a/third-party/cmake/BuildGettext.cmake b/third-party/cmake/BuildGettext.cmake
new file mode 100644
index 0000000000..1dd206a91b
--- /dev/null
+++ b/third-party/cmake/BuildGettext.cmake
@@ -0,0 +1,34 @@
+if(MSVC)
+
+ ExternalProject_Add(gettext
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${GETTEXT_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/gettext
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/gettext
+ -DURL=${GETTEXT_URL}
+ -DEXPECTED_SHA256=${GETTEXT_SHA256}
+ -DTARGET=gettext
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/gettext init
+ COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/gettext apply --ignore-whitespace
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/gettext-Fix-compilation-on-a-system-without-alloca.patch
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/GettextCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/gettext/gettext-runtime/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/gettext/gettext-runtime
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+
+else()
+ message(FATAL_ERROR "Trying to build gettext in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
+endif()
+
+list(APPEND THIRD_PARTY_DEPS gettext)
diff --git a/third-party/cmake/BuildGperf.cmake b/third-party/cmake/BuildGperf.cmake
index 494d0d9717..fd11aa1998 100644
--- a/third-party/cmake/BuildGperf.cmake
+++ b/third-party/cmake/BuildGperf.cmake
@@ -36,8 +36,6 @@ function(BuildGperf)
INSTALL_COMMAND "${_gperf_INSTALL_COMMAND}")
endfunction()
-set(GPERF_BUILDARGS CC=${HOSTDEPS_C_COMPILER} LD=${HOSTDEPS_C_COMPILER})
-
if(UNIX OR (MINGW AND CMAKE_CROSSCOMPILING))
BuildGperf(
@@ -45,6 +43,21 @@ if(UNIX OR (MINGW AND CMAKE_CROSSCOMPILING))
--prefix=${HOSTDEPS_INSTALL_DIR}
INSTALL_COMMAND ${MAKE_PRG} install)
+elseif(MSVC OR MINGW)
+
+ BuildGperf(
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/GperfCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/gperf/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/gperf/CMakeLists.txt
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+
else()
message(FATAL_ERROR "Trying to build gperf in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
endif()
diff --git a/third-party/cmake/BuildLibtermkey.cmake b/third-party/cmake/BuildLibtermkey.cmake
index 4b581c2a01..b5cd0c4ca6 100644
--- a/third-party/cmake/BuildLibtermkey.cmake
+++ b/third-party/cmake/BuildLibtermkey.cmake
@@ -1,5 +1,3 @@
-find_package(PkgConfig REQUIRED)
-
if(WIN32)
ExternalProject_Add(libtermkey
PREFIX ${DEPS_BUILD_DIR}
@@ -24,6 +22,8 @@ ExternalProject_Add(libtermkey
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
else()
+find_package(PkgConfig REQUIRED)
+
ExternalProject_Add(libtermkey
PREFIX ${DEPS_BUILD_DIR}
URL ${LIBTERMKEY_URL}
@@ -43,11 +43,9 @@ ExternalProject_Add(libtermkey
PREFIX=${DEPS_INSTALL_DIR}
PKG_CONFIG_PATH=${DEPS_LIB_DIR}/pkgconfig
CFLAGS=-fPIC
+ ${DEFAULT_MAKE_CFLAGS}
install)
endif()
list(APPEND THIRD_PARTY_DEPS libtermkey)
-if(NOT WIN32)
- # There is no unibilium build recipe for Windows yet
- add_dependencies(libtermkey unibilium)
-endif()
+add_dependencies(libtermkey unibilium)
diff --git a/third-party/cmake/BuildLibuv.cmake b/third-party/cmake/BuildLibuv.cmake
index 06b527e5a2..f6a9660d1c 100644
--- a/third-party/cmake/BuildLibuv.cmake
+++ b/third-party/cmake/BuildLibuv.cmake
@@ -70,24 +70,19 @@ elseif(MINGW)
elseif(WIN32 AND MSVC)
- find_package(PythonInterp 2.6 REQUIRED)
- if(NOT PYTHONINTERP_FOUND OR PYTHON_VERSION_MAJOR GREATER 2)
- message(FATAL_ERROR "Python2 is required to build libuv on windows, use -DPYTHON_EXECUTABLE to set a python interpreter")
- endif()
-
- include(TargetArch)
- if("${TARGET_ARCH}" STREQUAL "X86_64")
- set(TARGET_ARCH x64)
- elseif(TARGET_ARCH STREQUAL "X86")
- set(TARGET_ARCH x86)
- endif()
- string(TOLOWER ${CMAKE_BUILD_TYPE} LOWERCASE_BUILD_TYPE)
set(UV_OUTPUT_DIR ${DEPS_BUILD_DIR}/src/libuv/${CMAKE_BUILD_TYPE})
- BuildLibUv(
- BUILD_COMMAND set PYTHON=${PYTHON_EXECUTABLE} COMMAND ${DEPS_BUILD_DIR}/src/libuv/vcbuild.bat shared ${LOWERCASE_BUILD_TYPE} ${TARGET_ARCH}
- INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib
- COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin
- COMMAND ${CMAKE_COMMAND} -E copy ${UV_OUTPUT_DIR}/libuv.lib ${DEPS_INSTALL_DIR}/lib
+ BuildLibUv(BUILD_IN_SOURCE
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibuvCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/libuv/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/libuv/CMakeLists.txt
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DBUILD_SHARED_LIBS=ON
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE}
# Some applications (lua-client/luarocks) look for uv.lib instead of libuv.lib
COMMAND ${CMAKE_COMMAND} -E copy ${UV_OUTPUT_DIR}/libuv.lib ${DEPS_INSTALL_DIR}/lib/uv.lib
COMMAND ${CMAKE_COMMAND} -E copy ${UV_OUTPUT_DIR}/libuv.dll ${DEPS_INSTALL_DIR}/bin/
diff --git a/third-party/cmake/BuildLibvterm.cmake b/third-party/cmake/BuildLibvterm.cmake
index 5ea8314da5..e4649986af 100644
--- a/third-party/cmake/BuildLibvterm.cmake
+++ b/third-party/cmake/BuildLibvterm.cmake
@@ -6,7 +6,7 @@ function(BuildLibvterm)
cmake_parse_arguments(_libvterm
""
""
- "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ "PATCH_COMMAND;CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
${ARGN})
if(NOT _libvterm_CONFIGURE_COMMAND AND NOT _libvterm_BUILD_COMMAND
@@ -26,6 +26,7 @@ function(BuildLibvterm)
-DTARGET=libvterm
-DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND "${_libvterm_PATCH_COMMAND}"
CONFIGURE_COMMAND ""
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND "${_libvterm_CONFIGURE_COMMAND}"
@@ -34,11 +35,19 @@ function(BuildLibvterm)
endfunction()
if(WIN32)
- # MinGW
+ if(MSVC)
+ set(LIBVTERM_PATCH_COMMAND
+ ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libvterm init
+ COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libvterm apply --ignore-whitespace
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/libvterm-Remove-VLAs-for-MSVC.patch)
+ endif()
set(LIBVTERM_CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
- ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibvtermCMakeLists.txt
- ${DEPS_BUILD_DIR}/src/libvterm/CMakeLists.txt
- COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/libvterm
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibvtermCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/libvterm/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Libvterm-tbl2inc_c.cmake
+ ${DEPS_BUILD_DIR}/src/libvterm/tbl2inc_c.cmake
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/libvterm
-DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} -fPIC"
@@ -47,12 +56,14 @@ if(WIN32)
set(LIBVTERM_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
else()
set(LIBVTERM_INSTALL_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER}
- PREFIX=${DEPS_INSTALL_DIR}
- CFLAGS=-fPIC
- install)
+ PREFIX=${DEPS_INSTALL_DIR}
+ CFLAGS=-fPIC
+ ${DEFAULT_MAKE_CFLAGS}
+ install)
endif()
-BuildLibvterm(CONFIGURE_COMMAND ${LIBVTERM_CONFIGURE_COMMAND}
+BuildLibvterm(PATCH_COMMAND ${LIBVTERM_PATCH_COMMAND}
+ CONFIGURE_COMMAND ${LIBVTERM_CONFIGURE_COMMAND}
BUILD_COMMAND ${LIBVTERM_BUILD_COMMAND}
INSTALL_COMMAND ${LIBVTERM_INSTALL_COMMAND})
diff --git a/third-party/cmake/BuildLua.cmake b/third-party/cmake/BuildLua.cmake
index ea1371d1d5..da617e3ccd 100644
--- a/third-party/cmake/BuildLua.cmake
+++ b/third-party/cmake/BuildLua.cmake
@@ -71,6 +71,7 @@ set(LUA_CONFIGURE_COMMAND
-e "s@-lncurses@@g"
-i ${DEPS_BUILD_DIR}/src/lua/src/Makefile &&
sed -e "/#define LUA_USE_READLINE/d"
+ -e "s@\\(#define LUA_ROOT[ ]*\"\\)/usr/local@\\1${DEPS_INSTALL_DIR}@"
-i ${DEPS_BUILD_DIR}/src/lua/src/luaconf.h)
set(LUA_INSTALL_TOP_ARG "INSTALL_TOP=${DEPS_INSTALL_DIR}")
set(LUA_BUILD_COMMAND
@@ -84,14 +85,13 @@ BuildLua(CONFIGURE_COMMAND ${LUA_CONFIGURE_COMMAND}
BUILD_COMMAND ${LUA_BUILD_COMMAND}
INSTALL_COMMAND ${LUA_INSTALL_COMMAND})
list(APPEND THIRD_PARTY_DEPS lua)
-add_dependencies(lua busted)
set(BUSTED ${DEPS_INSTALL_DIR}/bin/busted)
set(BUSTED_LUA ${BUSTED}-lua)
add_custom_command(OUTPUT ${BUSTED_LUA}
COMMAND sed -e 's/^exec/exec $$LUA_DEBUGGER/' -e 's/jit//g' < ${BUSTED} > ${BUSTED_LUA} && chmod +x ${BUSTED_LUA}
- DEPENDS lua)
+ DEPENDS lua busted)
add_custom_target(busted-lua
DEPENDS ${DEPS_INSTALL_DIR}/bin/busted-lua)
diff --git a/third-party/cmake/BuildLuajit.cmake b/third-party/cmake/BuildLuajit.cmake
index c8eee282bf..e65a81bba5 100644
--- a/third-party/cmake/BuildLuajit.cmake
+++ b/third-party/cmake/BuildLuajit.cmake
@@ -101,7 +101,10 @@ elseif(MSVC)
COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/luajit.exe ${DEPS_INSTALL_DIR}/bin
COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.dll ${DEPS_INSTALL_DIR}/bin
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib
- COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.lib ${DEPS_INSTALL_DIR}/lib
+ # Luarocks searches for lua51.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.lib ${DEPS_INSTALL_DIR}/lib/lua51.lib
+ # Luv searches for luajit.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.lib ${DEPS_INSTALL_DIR}/lib/luajit.lib
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/include/luajit-2.0
COMMAND ${CMAKE_COMMAND} -DFROM_GLOB=${DEPS_BUILD_DIR}/src/luajit/src/*.h -DTO=${DEPS_INSTALL_DIR}/include/luajit-2.0 -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyFilesGlob.cmake)
diff --git a/third-party/cmake/BuildLuarocks.cmake b/third-party/cmake/BuildLuarocks.cmake
index ef8a8450f1..b5fcf7f3e5 100644
--- a/third-party/cmake/BuildLuarocks.cmake
+++ b/third-party/cmake/BuildLuarocks.cmake
@@ -12,7 +12,7 @@ function(BuildLuarocks)
cmake_parse_arguments(_luarocks
""
""
- "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ "PATCH_COMMAND;CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
${ARGN})
if(NOT _luarocks_CONFIGURE_COMMAND AND NOT _luarocks_BUILD_COMMAND
@@ -32,6 +32,7 @@ function(BuildLuarocks)
-DTARGET=luarocks
-DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND "${_luarocks_PATCH_COMMAND}"
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND "${_luarocks_CONFIGURE_COMMAND}"
BUILD_COMMAND "${_luarocks_BUILD_COMMAND}"
@@ -50,28 +51,43 @@ if(NOT MSVC)
# version already knows, and passing them here breaks the build
set(LUAROCKS_BUILDARGS CC=${HOSTDEPS_C_COMPILER} LD=${HOSTDEPS_C_COMPILER})
endif()
+if(WIN32)
+ # Use our bundled curl.exe for downloading packages
+ set(LUAROCKS_BUILDARGS ${LUAROCKS_BUILDARGS} CURL=${DEPS_BIN_DIR}/curl.exe)
+endif()
+
if(UNIX OR (MINGW AND CMAKE_CROSSCOMPILING))
if(USE_BUNDLED_LUAJIT)
list(APPEND LUAROCKS_OPTS
--with-lua=${HOSTDEPS_INSTALL_DIR}
- --with-lua-include=${HOSTDEPS_INSTALL_DIR}/include/luajit-2.0)
+ --with-lua-include=${HOSTDEPS_INSTALL_DIR}/include/luajit-2.0
+ --lua-suffix=jit)
+ elseif(USE_BUNDLED_LUA)
+ list(APPEND LUAROCKS_OPTS
+ --with-lua=${HOSTDEPS_INSTALL_DIR})
endif()
BuildLuarocks(
CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/src/luarocks/configure
--prefix=${HOSTDEPS_INSTALL_DIR} --force-config ${LUAROCKS_OPTS}
- --lua-suffix=jit
- INSTALL_COMMAND ${MAKE_PRG} bootstrap)
+ INSTALL_COMMAND ${MAKE_PRG} -j1 bootstrap)
elseif(MSVC OR MINGW)
if(MINGW)
- set(MINGW_FLAG /MW)
+ set(COMPILER_FLAG /MW)
+ elseif(MSVC)
+ set(COMPILER_FLAG /MSVC)
endif()
# Ignore USE_BUNDLED_LUAJIT - always ON for native Win32
- BuildLuarocks(INSTALL_COMMAND install.bat /FORCECONFIG /NOREG /NOADMIN /Q /F
+ BuildLuarocks(
+ PATCH_COMMAND
+ ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/luarocks init
+ COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/luarocks apply --ignore-whitespace
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/luarocks-Change-default-downloader-to-curl.patch
+ INSTALL_COMMAND install.bat /FORCECONFIG /NOREG /NOADMIN /Q /F
/LUA ${DEPS_INSTALL_DIR}
/LIB ${DEPS_LIB_DIR}
/BIN ${DEPS_BIN_DIR}
@@ -79,10 +95,12 @@ elseif(MSVC OR MINGW)
/P ${DEPS_INSTALL_DIR}/${LUAROCKS_VERSION} /TREE ${DEPS_INSTALL_DIR}
/SCRIPTS ${DEPS_BIN_DIR}
/CMOD ${DEPS_BIN_DIR}
- ${MINGW_FLAG}
+ ${COMPILER_FLAG}
/LUAMOD ${DEPS_BIN_DIR}/lua)
set(LUAROCKS_BINARY ${DEPS_INSTALL_DIR}/${LUAROCKS_VERSION}/luarocks.bat)
+ add_dependencies(luarocks wintools)
+
else()
message(FATAL_ERROR "Trying to build luarocks in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
endif()
@@ -94,63 +112,88 @@ if(USE_BUNDLED_LUAJIT)
if(MINGW AND CMAKE_CROSSCOMPILING)
add_dependencies(luarocks luajit_host)
endif()
+elseif(USE_BUNDLED_LUA)
+ add_dependencies(luarocks lua)
endif()
-# Each target depends on the previous module, this serializes all calls to
-# luarocks since it is unhappy to be called in parallel.
+# DEPENDS on the previous module, because Luarocks breaks if parallel.
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/mpack
COMMAND ${LUAROCKS_BINARY}
- ARGS build mpack ${LUAROCKS_BUILDARGS}
+ ARGS build mpack 1.0.7-0 ${LUAROCKS_BUILDARGS}
DEPENDS luarocks)
add_custom_target(mpack
DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/mpack)
list(APPEND THIRD_PARTY_DEPS mpack)
-
+# DEPENDS on the previous module, because Luarocks breaks if parallel.
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/lpeg
COMMAND ${LUAROCKS_BINARY}
- ARGS build lpeg ${LUAROCKS_BUILDARGS}
+ ARGS build lpeg 1.0.1-1 ${LUAROCKS_BUILDARGS}
DEPENDS mpack)
add_custom_target(lpeg
DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/lpeg)
list(APPEND THIRD_PARTY_DEPS lpeg)
+# DEPENDS on the previous module, because Luarocks breaks if parallel.
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/inspect
COMMAND ${LUAROCKS_BINARY}
- ARGS build inspect ${LUAROCKS_BUILDARGS}
- DEPENDS mpack)
+ ARGS build inspect 3.1.1-0 ${LUAROCKS_BUILDARGS}
+ DEPENDS lpeg)
add_custom_target(inspect
DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/inspect)
list(APPEND THIRD_PARTY_DEPS inspect)
-if(USE_BUNDLED_BUSTED)
- add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/penlight/1.3.2-2
+if((NOT USE_BUNDLED_LUAJIT) AND USE_BUNDLED_LUA)
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
+ add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/luabitop
COMMAND ${LUAROCKS_BINARY}
- ARGS build penlight 1.3.2-2 ${LUAROCKS_BUILDARGS}
+ ARGS build luabitop 1.0.2-3 ${LUAROCKS_BUILDARGS}
DEPENDS inspect)
+ add_custom_target(luabitop
+ DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/luabitop)
+
+ list(APPEND THIRD_PARTY_DEPS luabitop)
+endif()
+
+if(USE_BUNDLED_BUSTED)
+ if((NOT USE_BUNDLED_LUAJIT) AND USE_BUNDLED_LUA)
+ set(PENLIGHT_DEPENDS luabitop)
+ else()
+ set(PENLIGHT_DEPENDS inspect)
+ endif()
+
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
+ add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/penlight
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS build penlight 1.5.4-1 ${LUAROCKS_BUILDARGS}
+ DEPENDS ${PENLIGHT_DEPENDS})
add_custom_target(penlight
- DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/penlight/1.3.2-2)
+ DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/penlight)
if(WIN32)
set(BUSTED_EXE "${HOSTDEPS_BIN_DIR}/busted.bat")
+ set(LUACHECK_EXE "${HOSTDEPS_BIN_DIR}/luacheck.bat")
else()
set(BUSTED_EXE "${HOSTDEPS_BIN_DIR}/busted")
+ set(LUACHECK_EXE "${HOSTDEPS_BIN_DIR}/luacheck")
endif()
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
add_custom_command(OUTPUT ${BUSTED_EXE}
COMMAND ${LUAROCKS_BINARY}
- ARGS build https://raw.githubusercontent.com/Olivine-Labs/busted/v2.0.rc12-1/busted-2.0.rc12-1.rockspec ${LUAROCKS_BUILDARGS}
+ ARGS build busted 2.0.rc12-1 ${LUAROCKS_BUILDARGS}
DEPENDS penlight)
add_custom_target(busted
DEPENDS ${BUSTED_EXE})
- add_custom_command(OUTPUT ${HOSTDEPS_BIN_DIR}/luacheck
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
+ add_custom_command(OUTPUT ${LUACHECK_EXE}
COMMAND ${LUAROCKS_BINARY}
- ARGS build https://raw.githubusercontent.com/mpeterv/luacheck/master/luacheck-scm-1.rockspec ${LUAROCKS_BUILDARGS}
+ ARGS build luacheck 0.21.2-1 ${LUAROCKS_BUILDARGS}
DEPENDS busted)
add_custom_target(luacheck
- DEPENDS ${HOSTDEPS_BIN_DIR}/luacheck)
+ DEPENDS ${LUACHECK_EXE})
set(LUV_DEPS luacheck luv-static)
if(MINGW AND CMAKE_CROSSCOMPILING)
@@ -160,6 +203,7 @@ if(USE_BUNDLED_BUSTED)
if(USE_BUNDLED_LIBUV)
list(APPEND LUV_ARGS LIBUV_DIR=${HOSTDEPS_INSTALL_DIR})
endif()
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/luv
COMMAND ${LUAROCKS_BINARY}
ARGS make ${LUAROCKS_BUILDARGS} ${LUV_ARGS}
@@ -168,9 +212,10 @@ if(USE_BUNDLED_BUSTED)
add_custom_target(luv
DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/luv)
+ # DEPENDS on the previous module, because Luarocks breaks if parallel.
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/nvim-client
COMMAND ${LUAROCKS_BINARY}
- ARGS build https://raw.githubusercontent.com/neovim/lua-client/0.0.1-26/nvim-client-0.0.1-26.rockspec ${LUAROCKS_BUILDARGS}
+ ARGS build nvim-client 0.0.1-26 ${LUAROCKS_BUILDARGS}
DEPENDS luv)
add_custom_target(nvim-client
DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/nvim-client)
diff --git a/third-party/cmake/BuildMsgpack.cmake b/third-party/cmake/BuildMsgpack.cmake
index 779cb1ebfe..616b6e5f83 100644
--- a/third-party/cmake/BuildMsgpack.cmake
+++ b/third-party/cmake/BuildMsgpack.cmake
@@ -70,9 +70,6 @@ elseif(MSVC)
# Make sure we use the same generator, otherwise we may
# accidentaly end up using different MSVC runtimes
-DCMAKE_GENERATOR=${CMAKE_GENERATOR})
- # Place the DLL in the bin folder
- set(MSGPACK_INSTALL_COMMAND ${MSGPACK_INSTALL_COMMAND}
- COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_INSTALL_DIR}/lib/msgpack.dll ${DEPS_INSTALL_DIR}/bin)
endif()
BuildMsgpack(CONFIGURE_COMMAND ${MSGPACK_CONFIGURE_COMMAND}
diff --git a/third-party/cmake/BuildUnibilium.cmake b/third-party/cmake/BuildUnibilium.cmake
index a5ec6c01eb..f5342e3d34 100644
--- a/third-party/cmake/BuildUnibilium.cmake
+++ b/third-party/cmake/BuildUnibilium.cmake
@@ -1,25 +1,49 @@
if(WIN32)
- message(STATUS "Building Unibilium in Windows is not supported (skipping)")
- return()
+ ExternalProject_Add(unibilium
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${UNIBILIUM_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/unibilium
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/unibilium
+ -DURL=${UNIBILIUM_URL}
+ -DEXPECTED_SHA256=${UNIBILIUM_SHA256}
+ -DTARGET=unibilium
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UnibiliumCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/unibilium/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/msvc-compat/unistd.h
+ ${DEPS_BUILD_DIR}/src/unibilium/msvc-compat/unistd.h
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/unibilium
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+else()
+ ExternalProject_Add(unibilium
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${UNIBILIUM_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/unibilium
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/unibilium
+ -DURL=${UNIBILIUM_URL}
+ -DEXPECTED_SHA256=${UNIBILIUM_SHA256}
+ -DTARGET=unibilium
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND ""
+ BUILD_IN_SOURCE 1
+ BUILD_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER}
+ PREFIX=${DEPS_INSTALL_DIR}
+ CFLAGS=-fPIC
+ INSTALL_COMMAND ${MAKE_PRG} PREFIX=${DEPS_INSTALL_DIR} install)
endif()
-ExternalProject_Add(unibilium
- PREFIX ${DEPS_BUILD_DIR}
- URL ${UNIBILIUM_URL}
- DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/unibilium
- DOWNLOAD_COMMAND ${CMAKE_COMMAND}
- -DPREFIX=${DEPS_BUILD_DIR}
- -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/unibilium
- -DURL=${UNIBILIUM_URL}
- -DEXPECTED_SHA256=${UNIBILIUM_SHA256}
- -DTARGET=unibilium
- -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
- -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
- CONFIGURE_COMMAND ""
- BUILD_IN_SOURCE 1
- BUILD_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER}
- PREFIX=${DEPS_INSTALL_DIR}
- CFLAGS=-fPIC
- INSTALL_COMMAND ${MAKE_PRG} PREFIX=${DEPS_INSTALL_DIR} install)
-
list(APPEND THIRD_PARTY_DEPS unibilium)
diff --git a/third-party/cmake/GettextCMakeLists.txt b/third-party/cmake/GettextCMakeLists.txt
new file mode 100644
index 0000000000..60ee3b6f99
--- /dev/null
+++ b/third-party/cmake/GettextCMakeLists.txt
@@ -0,0 +1,83 @@
+cmake_minimum_required(VERSION 2.8.7)
+project(libintl C)
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
+
+file(READ config.h.in CONFIG_CONTENT)
+string(REPLACE "#undef HAVE_GETCWD" "#define HAVE_GETCWD 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef uintmax_t" "
+ #if _WIN64
+ # define intmax_t long long
+ # define uintmax_t unsigned long long
+ #elif _WIN32
+ # define intmax_t long
+ # define uintmax_t unsigned long
+ #endif"
+ CONFIG_CONTENT ${CONFIG_CONTENT})
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/config.h ${CONFIG_CONTENT})
+
+set(HAVE_NEWLOCALE 0)
+set(HAVE_POSIX_PRINTF 0)
+set(HAVE_SNPRINTF 0)
+set(HAVE_ASPRINTF 0)
+set(HAVE_WPRINTF 0)
+configure_file(intl/libgnuintl.in.h libgnuintl.h)
+
+set(LOCALDIR "gettext")
+add_definitions(-DLOCALEDIR=\"${LOCALDIR}\"
+ -DLOCALE_ALIAS_PATH=\"${LOCALDIR}\"
+ -DLIBDIR=\"${LOCALDIR}\"
+ -DINSTALLDIR=\"${LOCALDIR}\")
+
+add_definitions(-DBUILDING_LIBINTL
+ -DIN_LIBINTL
+ -DENABLE_RELOCATABLE=1
+ -DIN_LIBRARY
+ -DNO_XMALLOC
+ -Dset_relocation_prefix=libintl_set_relocation_prefix
+ -Drelocate=libintl_relocate
+ -DHAVE_CONFIG_H
+ -D_CRT_SECURE_NO_WARNINGS)
+
+FILE(GLOB SOURCES
+ intl/bindtextdom.c
+ intl/dcgettext.c
+ intl/dcigettext.c
+ intl/dcngettext.c
+ intl/dgettext.c
+ intl/dngettext.c
+ intl/explodename.c
+ intl/finddomain.c
+ intl/gettext.c
+ intl/hash-string.c
+ intl/l10nflist.c
+ intl/langprefs.c
+ intl/loadmsgcat.c
+ intl/localcharset.c
+ intl/localealias.c
+ intl/localename.c
+ intl/lock.c
+ intl/log.c
+ intl/ngettext.c
+ intl/plural-exp.c
+ intl/plural.c
+ intl/printf.c
+ intl/relocatable.c
+ intl/setlocale.c
+ intl/textdomain.c
+ intl/threadlib.c
+ intl/version.c)
+
+add_library(libintl ${SOURCES})
+
+include(GNUInstallDirs)
+
+install(FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/libgnuintl.h
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ RENAME libintl.h)
+
+install(TARGETS libintl
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
diff --git a/third-party/cmake/GperfCMakeLists.txt b/third-party/cmake/GperfCMakeLists.txt
new file mode 100644
index 0000000000..32837fc166
--- /dev/null
+++ b/third-party/cmake/GperfCMakeLists.txt
@@ -0,0 +1,30 @@
+cmake_minimum_required(VERSION 2.8.7)
+project(gperf LANGUAGES C CXX)
+
+add_executable(gperf
+ lib/getline.cc
+ lib/hash.cc
+ lib/getopt.c
+ lib/getopt1.c
+ src/version.cc
+ src/positions.cc
+ src/options.cc
+ src/keyword.cc
+ src/keyword-list.cc
+ src/input.cc
+ src/bool-array.cc
+ src/hash-table.cc
+ src/search.cc
+ src/output.cc
+ src/main.cc)
+
+include_directories(lib)
+
+# Copy the config.h template without modifying it
+# because none of the definitions are necessary
+execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/src/config.h.in ${CMAKE_BINARY_DIR}/config/config.h)
+include_directories(${CMAKE_BINARY_DIR}/config)
+
+include(GNUInstallDirs)
+install(TARGETS gperf
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/third-party/cmake/LibuvCMakeLists.txt b/third-party/cmake/LibuvCMakeLists.txt
new file mode 100644
index 0000000000..063e4291f2
--- /dev/null
+++ b/third-party/cmake/LibuvCMakeLists.txt
@@ -0,0 +1,27 @@
+cmake_minimum_required(VERSION 2.8.7)
+project(libuv LANGUAGES C)
+
+file(GLOB UV_SOURCES_COMMON src/*.c)
+file(GLOB UV_SOURCES_WIN src/win/*.c)
+
+add_library(libuv ${UV_SOURCES_COMMON} ${UV_SOURCES_WIN})
+target_compile_definitions(libuv PRIVATE WIN32_LEAN_AND_MEAN "_WIN32_WINNT=0x0600")
+target_link_libraries(libuv iphlpapi psapi shell32 userenv ws2_32)
+target_include_directories(libuv PUBLIC ./include PRIVATE ./src)
+set_target_properties(libuv PROPERTIES DEFINE_SYMBOL BUILDING_UV_SHARED)
+
+install(FILES
+ include/tree.h
+ include/uv.h
+ include/uv-version.h
+ include/uv-errno.h
+ include/uv-threadpool.h
+ include/uv-win.h
+ DESTINATION include)
+
+include(GNUInstallDirs)
+install(TARGETS libuv
+ PUBLIC_HEADER
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
diff --git a/third-party/cmake/Libvterm-tbl2inc_c.cmake b/third-party/cmake/Libvterm-tbl2inc_c.cmake
new file mode 100644
index 0000000000..b1ee0246f1
--- /dev/null
+++ b/third-party/cmake/Libvterm-tbl2inc_c.cmake
@@ -0,0 +1,163 @@
+cmake_minimum_required(VERSION 2.8.7)
+
+set(HEX_ALPHABET "0123456789abcdef")
+
+function(ConvertToHex dec hex)
+ while(dec GREATER 0)
+ math(EXPR _val "${dec} % 16")
+ math(EXPR dec "${dec} / 16")
+ string(SUBSTRING ${HEX_ALPHABET} ${_val} 1 _val)
+ set(_res "${_val}${_res}")
+ endwhile()
+ # Pad the result with the number of zeros
+ # specified by the optional third argument
+ if(${ARGC} EQUAL 3)
+ set(padding ${ARGV2})
+ string(LENGTH ${_res} _resLen)
+ if(_resLen LESS ${padding})
+ math(EXPR _neededPadding "${padding} - ${_resLen}")
+ foreach(i RANGE 1 ${_neededPadding})
+ set(_res "0${_res}")
+ endforeach()
+ endif()
+ endif()
+ set(${hex} "0x${_res}" PARENT_SCOPE)
+endfunction()
+
+function(ConvertFromHex hex dec)
+ string(TOLOWER ${hex} hex)
+ string(LENGTH "${hex}" _strlen)
+ set(_res 0)
+ while(_strlen GREATER 0)
+ math(EXPR _res "${_res} * 16")
+ string(SUBSTRING "${hex}" 0 1 NIBBLE)
+ string(SUBSTRING "${hex}" 1 -1 hex)
+ string(FIND ${HEX_ALPHABET} ${NIBBLE} value)
+ if(value EQUAL -1)
+ message(FATAL_ERROR "Invalid hex character '${NIBBLE}'")
+ endif()
+ math(EXPR _res "${_res} + ${value}")
+ string(LENGTH "${hex}" _strlen)
+ endwhile()
+ set(${dec} ${_res} PARENT_SCOPE)
+endfunction()
+
+# Based on http://www.json.org/JSON_checker/utf8_decode.c
+function(DecodeUtf8 hexBytes codePoint)
+ string(SUBSTRING ${hexBytes} 0 2 hexByte1)
+ ConvertFromHex(${hexByte1} byte1)
+ # Zero continuations (0 to 127)
+ math(EXPR out "${byte1} & 128")
+ if(out EQUAL 0)
+ set(${codePoint} ${byte1} PARENT_SCOPE)
+ return()
+ endif()
+ # One continuation (128 to 2047)
+ math(EXPR out "${byte1} & 224")
+ if(out EQUAL 192)
+ string(SUBSTRING ${hexBytes} 2 2 hexByte2)
+ ConvertFromHex(${hexByte2} byte2)
+ math(EXPR result "((${byte1} & 31) << 6) | ${byte2}")
+ if(result GREATER 127)
+ set(${codePoint} ${result} PARENT_SCOPE)
+ return()
+ endif()
+ else()
+ # Two continuations (2048 to 55295 and 57344 to 65535)
+ math(EXPR result "${byte1} & 240")
+ if(result EQUAL 224)
+ string(SUBSTRING ${hexBytes} 2 2 hexByte2)
+ string(SUBSTRING ${hexBytes} 4 2 hexByte3)
+ ConvertFromHex(${hexByte2} byte2)
+ ConvertFromHex(${hexByte3} byte3)
+ math(EXPR result "${byte2} | ${byte3}")
+ if(result GREATER -1)
+ math(EXPR result "((${byte1} & 15) << 12) | (${byte2} << 6) | ${byte3}")
+ if((result GREATER 2047) AND (result LESS 55296 OR result GREATER 57343))
+ set(${codePoint} ${result} PARENT_SCOPE)
+ return()
+ endif()
+ endif()
+ else()
+ # Three continuations (65536 to 1114111)
+ math(EXPR result "${byte1} & 248")
+ if(result EQUAL 224)
+ string(SUBSTRING ${hexBytes} 2 2 hexByte2)
+ string(SUBSTRING ${hexBytes} 4 2 hexByte3)
+ string(SUBSTRING ${hexBytes} 6 2 hexByte4)
+ ConvertFromHex(${hexByte2} byte2)
+ ConvertFromHex(${hexByte3} byte3)
+ ConvertFromHex(${hexByte4} byte4)
+ math(EXPR result "${byte2} | ${byte3} | ${byte4}")
+ if(result GREATER -1)
+ math(EXPR result "((c & 7) << 18) | (c1 << 12) | (c2 << 6) | c3")
+ if((result GREATER 65535) AND (result LESS 1114112))
+ set(${codePoint} ${result} PARENT_SCOPE)
+ return()
+ endif()
+ endif()
+ endif()
+ endif()
+ endif()
+ message(FATAL_ERROR "Invalid UTF-8 encoding")
+endfunction()
+
+set(inputFile ${CMAKE_ARGV3})
+set(outputFile ${CMAKE_ARGV4})
+# Get the file contents in text and hex-encoded format because
+# CMake doesn't provide functions for converting between the two
+file(READ "${inputFile}" contents)
+file(READ "${inputFile}" hexContents HEX)
+
+# Convert the text contents into a list of lines by escaping
+# the list separator ';' and then replacing new line characters
+# with the list separator
+string(REGEX REPLACE ";" "\\\\;" contents ${contents})
+string(REGEX REPLACE "\n" ";" contents ${contents})
+
+get_filename_component(encname ${inputFile} NAME_WE)
+set(output
+ "static const struct StaticTableEncoding encoding_${encname} = {\n"
+ " { .decode = &decode_table },\n"
+ " {")
+set(hexIndex 0)
+foreach(line ${contents})
+ string(LENGTH ${line} lineLength)
+ # Convert "A" to 0x41
+ string(FIND ${line} "\"" beginQuote)
+ if(NOT ${beginQuote} EQUAL -1)
+ string(FIND ${line} "\"" endQuote REVERSE)
+ if(${beginQuote} EQUAL ${endQuote})
+ message(FATAL_ERROR "Line contains only one quote")
+ endif()
+ math(EXPR beginHexQuote "${hexIndex} + (${beginQuote} + 1)*2")
+ math(EXPR endHexQuote "${hexIndex} + (${endQuote} + 1)*2")
+ math(EXPR quoteLen "${endHexQuote} - ${beginHexQuote} - 1")
+ string(SUBSTRING ${hexContents} ${beginHexQuote} ${quoteLen} hexQuote)
+ DecodeUtf8(${hexQuote} codePoint)
+ ConvertToHex(${codePoint} hexCodePoint 4)
+ STRING(REGEX REPLACE "\"(.+)\"" ${hexCodePoint} line ${line})
+ endif()
+ # Strip comment
+ string(REGEX REPLACE "[ \t\n]*#.*" "" line ${line})
+ # Convert 3/1 to [0x31]
+ string(REGEX REPLACE "^([0-9]+)/([0-9]+).*" "\\1;\\2" numbers ${line})
+ list(GET numbers 0 upperBits)
+ list(GET numbers 1 lowerBits)
+ math(EXPR res "${upperBits}*16 + ${lowerBits}")
+ ConvertToHex(${res} hex 2)
+ string(REGEX REPLACE "^([0-9]+)/([0-9]+)" "[${hex}]" line ${line})
+ # Convert U+0041 to 0x0041
+ string(REPLACE "U+" "0x" line ${line})
+ # Indent and append a comma
+ set(line " ${line},")
+ set(output "${output}\n${line}")
+ # Increment the index by the number of characters in the line,
+ # plus one for the new line character then multiple by two for the hex digit index
+ math(EXPR hexIndex "${hexIndex} + 2*(${lineLength} + 1)")
+endforeach()
+set(output "${output}\n"
+ " }\n"
+ "}\;\n")
+
+file(WRITE ${outputFile} ${output})
diff --git a/third-party/cmake/LibvtermCMakeLists.txt b/third-party/cmake/LibvtermCMakeLists.txt
index 72183e4b4c..27d0d11e9f 100644
--- a/third-party/cmake/LibvtermCMakeLists.txt
+++ b/third-party/cmake/LibvtermCMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.8.11)
project(libvterm LANGUAGES C)
include(GNUInstallDirs)
-find_package(Perl REQUIRED)
+find_package(Perl)
if(MSVC)
add_definitions(/W3 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
@@ -18,11 +18,19 @@ foreach(file ${TBL_FILES})
set(tname encoding/${basename}.inc)
add_custom_command(OUTPUT
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/encoding/
- COMMAND ${PERL_EXECUTABLE} -CSD ${CMAKE_SOURCE_DIR}/tbl2inc_c.pl ${file} > ${CMAKE_BINARY_DIR}/${tname}
+ COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/tbl2inc_c.cmake ${file} ${CMAKE_BINARY_DIR}/${tname}
COMMENT "Generating ${tname}"
OUTPUT ${CMAKE_BINARY_DIR}/${tname}
)
list(APPEND TBL_FILES_HEADERS ${tname})
+ # Only used for verifying that the output of tbl2inc_c.cmake is correct
+ set(tname encoding-test/${basename}.inc)
+ add_custom_command(OUTPUT
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/encoding-test/
+ COMMAND ${PERL_EXECUTABLE} -CSD ${CMAKE_SOURCE_DIR}/tbl2inc_c.pl ${file} > ${CMAKE_BINARY_DIR}/${tname}
+ COMMENT "Generating ${tname}"
+ OUTPUT ${CMAKE_BINARY_DIR}/${tname}
+ )
endforeach()
include_directories(${CMAKE_SOURCE_DIR}/include)
@@ -60,13 +68,24 @@ set_target_properties(harness PROPERTIES
# run-test.pl expects to find the harness in t/.libs/
RUNTIME_OUTPUT_DIRECTORY t/.libs)
-file(GLOB TESTFILES ${CMAKE_SOURCE_DIR}/t/*.test)
-add_custom_target(check)
-foreach(testfile ${TESTFILES})
- get_filename_component(target_name ${testfile} NAME_WE)
- add_custom_target(${target_name}
- COMMAND ${PERL_EXECUTABLE} ${CMAKE_SOURCE_DIR}/t/run-test.pl ${testfile}
- COMMENT "**${target_name} **"
- DEPENDS harness)
- add_dependencies(check ${target_name})
-endforeach()
+if(Perl_FOUND)
+ file(GLOB TESTFILES ${CMAKE_SOURCE_DIR}/t/*.test)
+ add_custom_target(check)
+ foreach(testfile ${TESTFILES})
+ get_filename_component(target_name ${testfile} NAME_WE)
+ add_custom_target(${target_name}
+ COMMAND ${PERL_EXECUTABLE} ${CMAKE_SOURCE_DIR}/t/run-test.pl ${testfile}
+ COMMENT "**${target_name} **"
+ DEPENDS harness)
+ add_dependencies(check ${target_name})
+ endforeach()
+
+ foreach(header_path ${TBL_FILES_HEADERS})
+ get_filename_component(header_name ${header_path} NAME)
+ set(perl_header_path ${CMAKE_BINARY_DIR}/encoding-test/${header_name})
+ add_custom_target(test-${header_name}
+ COMMAND ${CMAKE_COMMAND} -E compare_files
+ ${header_path} ${perl_header_path}
+ DEPENDS ${header_path} ${perl_header_path})
+ endforeach()
+endif()
diff --git a/third-party/cmake/UnibiliumCMakeLists.txt b/third-party/cmake/UnibiliumCMakeLists.txt
new file mode 100644
index 0000000000..3c419654c4
--- /dev/null
+++ b/third-party/cmake/UnibiliumCMakeLists.txt
@@ -0,0 +1,27 @@
+cmake_minimum_required(VERSION 2.8.7)
+project(unibilium LANGUAGES C)
+
+file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/*.c)
+add_library(unibilium ${SRC_FILES})
+set_target_properties(unibilium PROPERTIES PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/unibilium.h
+ VERSION "${VERSION_MAJOR}.${VERSION_MINOR}")
+
+if(NOT WIN32)
+ execute_process(COMMAND "shell ncursesw6-config --terminfo-dirs 2>/dev/null || \
+ ncurses6-config --terminfo-dirs 2>/dev/null || \
+ ncursesw5-config --terminfo-dirs 2>/dev/null || \
+ ncurses5-config --terminfo-dirs 2>/dev/null || \
+ echo '/etc/terminfo:/lib/terminfo:/usr/share/terminfo:/usr/lib/terminfo:/usr/local/share/terminfo:/usr/local/lib/terminfo'"
+ OUTPUT_VARIABLE TERMINFO_DIRS)
+endif()
+target_compile_definitions(unibilium PUBLIC TERMINFO_DIRS ${TERMINFO_DIRS})
+
+if(MSVC)
+ target_include_directories(unibilium PUBLIC ${PROJECT_SOURCE_DIR}/msvc-compat)
+endif()
+
+include(GNUInstallDirs)
+install(TARGETS unibilium
+ PUBLIC_HEADER
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})