aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt222
1 files changed, 173 insertions, 49 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 53e387307c..98ffc77b15 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,13 +1,22 @@
cmake_minimum_required(VERSION 2.8.7)
-project(NEOVIM)
+project(nvim)
+
+if(POLICY CMP0059)
+ cmake_policy(SET CMP0059 OLD) # Needed until cmake 2.8.12. #4389
+endif()
# Point CMake at any custom modules we may ship
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
# Prefer our bundled versions of dependencies.
set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/usr" CACHE PATH "Path prefix for finding dependencies")
-list(INSERT CMAKE_PREFIX_PATH 0 ${DEPS_PREFIX})
-set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${DEPS_PREFIX}/lib/pkgconfig")
+if(CMAKE_CROSSCOMPILING AND NOT UNIX)
+ list(INSERT CMAKE_FIND_ROOT_PATH 0 ${DEPS_PREFIX})
+ list(INSERT CMAKE_PREFIX_PATH 0 ${DEPS_PREFIX}/../host/bin)
+else()
+ list(INSERT CMAKE_PREFIX_PATH 0 ${DEPS_PREFIX})
+ set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${DEPS_PREFIX}/lib/pkgconfig")
+endif()
# used for check_c_compiler_flag
include(CheckCCompilerFlag)
@@ -35,34 +44,37 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
set(USE_FNAME_CASE TRUE)
endif()
+# Set default build type.
+if(NOT CMAKE_BUILD_TYPE)
+ message(STATUS "CMAKE_BUILD_TYPE not given, defaulting to 'Dev'.")
+ set(CMAKE_BUILD_TYPE "Dev" CACHE STRING "Choose the type of build." FORCE)
+endif()
+
# Set available build types for CMake GUIs.
# A different build type can still be set by -DCMAKE_BUILD_TYPE=...
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
- STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
+ STRINGS "Debug" "Dev" "Release" "MinSizeRel" "RelWithDebInfo")
-# Set default build type.
-if(NOT CMAKE_BUILD_TYPE)
- message(STATUS "CMAKE_BUILD_TYPE not given; setting to 'RelWithDebInfo'.")
- set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build." FORCE)
-endif()
+# If not in a git repo (e.g., a tarball) these tokens define the complete
+# version string, else it is combined with the result of `git describe`.
+set(NVIM_VERSION_MAJOR 0)
+set(NVIM_VERSION_MINOR 1)
+set(NVIM_VERSION_PATCH 5)
+set(NVIM_VERSION_PRERELEASE "-dev") # for package maintainers
-# Version tokens
+file(TO_CMAKE_PATH ${CMAKE_CURRENT_LIST_DIR}/.git FORCED_GIT_DIR)
include(GetGitRevisionDescription)
-file(TO_NATIVE_PATH ${CMAKE_CURRENT_LIST_DIR}/.git GIT_DIR)
get_git_head_revision(GIT_REFSPEC NVIM_VERSION_COMMIT)
-if(NOT NVIM_VERSION_COMMIT)
- set(NVIM_VERSION_COMMIT "?")
-endif()
-set(NVIM_VERSION_MAJOR 0)
-set(NVIM_VERSION_MINOR 0)
-set(NVIM_VERSION_PATCH 0)
-set(NVIM_VERSION_PRERELEASE "-alpha")
-# TODO(justinmk): UTC time would be nice here #1071
-git_timestamp(GIT_TIMESTAMP)
-# TODO(justinmk): do not set this for "release" builds #1071
-if(GIT_TIMESTAMP)
- set(NVIM_VERSION_BUILD "+${GIT_TIMESTAMP}")
+if(NVIM_VERSION_COMMIT) # is a git repo
+ git_describe(NVIM_VERSION_MEDIUM)
+ # `git describe` annotates the most recent tagged release; for pre-release
+ # builds we must replace that with the unreleased version.
+ string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+"
+ "v${NVIM_VERSION_MAJOR}.${NVIM_VERSION_MINOR}.${NVIM_VERSION_PATCH}"
+ NVIM_VERSION_MEDIUM
+ ${NVIM_VERSION_MEDIUM})
endif()
+
set(NVIM_VERSION_BUILD_TYPE "${CMAKE_BUILD_TYPE}")
# NVIM_VERSION_CFLAGS set further below.
@@ -74,6 +86,57 @@ if(CMAKE_C_FLAGS_RELEASE MATCHES "-O3")
string(REPLACE "-O3" "-O2" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
endif()
+# Disable logging for release-type builds.
+if(NOT CMAKE_C_FLAGS_RELEASE MATCHES DDISABLE_LOG)
+ set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DDISABLE_LOG")
+endif()
+if(NOT CMAKE_C_FLAGS_MINSIZEREL MATCHES DDISABLE_LOG)
+ set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DDISABLE_LOG")
+endif()
+if(NOT CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES DDISABLE_LOG)
+ set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DDISABLE_LOG")
+endif()
+
+# Enable assertions for RelWithDebInfo.
+if(CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES DNDEBUG)
+ string(REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
+endif()
+
+# Set build flags for custom Dev build type.
+# -DNDEBUG purposely omitted because we want assertions.
+if(MSVC)
+ SET(CMAKE_C_FLAGS_DEV ""
+ CACHE STRING "Flags used by the compiler during development (optimized, but with debug info and logging) builds."
+ FORCE)
+else()
+ if(CMAKE_COMPILER_IS_GNUCC)
+ check_c_compiler_flag(-Og HAS_OG_FLAG)
+ else()
+ set(HAS_OG_FLAG 0)
+ endif()
+
+ if(HAS_OG_FLAG)
+ set(CMAKE_C_FLAGS_DEV "-Og -g"
+ CACHE STRING "Flags used by the compiler during development (optimized, but with debug info and logging) builds."
+ FORCE)
+ else()
+ set(CMAKE_C_FLAGS_DEV "-O2 -g"
+ CACHE STRING "Flags used by the compiler during development (optimized, but with debug info and logging) builds."
+ FORCE)
+ endif()
+endif()
+SET(CMAKE_EXE_LINKER_FLAGS_DEV ""
+ CACHE STRING "Flags used for linking binaries during development (optimized, but with debug info and logging) builds."
+ FORCE)
+SET(CMAKE_SHARED_LINKER_FLAGS_DEV ""
+ CACHE STRING "Flags used by the shared libraries linker during development (optimized, but with debug info and logging) builds."
+ FORCE)
+
+MARK_AS_ADVANCED(
+ CMAKE_C_FLAGS_DEV
+ CMAKE_EXE_LINKER_FLAGS_DEV
+ CMAKE_SHARED_LINKER_FLAGS_DEV)
+
# Enable -Wconversion.
if(NOT MSVC)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion")
@@ -94,7 +157,11 @@ if(${INIT_FLAGS_NAME})
set(CMAKE_REQUIRED_FLAGS "${${INIT_FLAGS_NAME}}")
endif()
+# Include <string.h> because some toolchains define _FORTIFY_SOURCE=2 in
+# internal header files, which should in turn be #included by <string.h>.
check_c_source_compiles("
+#include <string.h>
+
#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 1
#error \"_FORTIFY_SOURCE > 1\"
#endif
@@ -143,11 +210,18 @@ if(MSVC)
else()
add_definitions(-Wall -Wextra -pedantic -Wno-unused-parameter
-Wstrict-prototypes -std=gnu99)
+
+ # On FreeBSD 64 math.h uses unguarded C11 extension, which taints clang
+ # 3.4.1 used there.
+ if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+ add_definitions(-Wno-c11-extensions)
+ endif()
endif()
if(MINGW)
# Use POSIX compatible stdio in Mingw
add_definitions(-D__USE_MINGW_ANSI_STDIO)
+ add_definitions(-D_WIN32_WINNT=0x0600)
endif()
# OpenBSD's GCC (4.2.1) doesn't have -Wvla
@@ -156,12 +230,16 @@ if(HAS_WVLA_FLAG)
add_definitions(-Wvla)
endif()
-check_c_compiler_flag(-fstack-protector-strong HAS_FSTACK_PROTECTOR_STRONG_FLAG)
-check_c_compiler_flag(-fstack-protector HAS_FSTACK_PROTECTOR_FLAG)
-if(HAS_FSTACK_PROTECTOR_STRONG_FLAG)
- add_definitions(-fstack-protector-strong)
-elseif(HAS_FSTACK_PROTECTOR_FLAG)
- add_definitions(-fstack-protector --param ssp-buffer-size=4)
+if(UNIX)
+ # -fstack-protector breaks non Unix builds even in Mingw-w64
+ check_c_compiler_flag(-fstack-protector-strong HAS_FSTACK_PROTECTOR_STRONG_FLAG)
+ check_c_compiler_flag(-fstack-protector HAS_FSTACK_PROTECTOR_FLAG)
+
+ if(HAS_FSTACK_PROTECTOR_STRONG_FLAG)
+ add_definitions(-fstack-protector-strong)
+ elseif(HAS_FSTACK_PROTECTOR_FLAG)
+ add_definitions(-fstack-protector --param ssp-buffer-size=4)
+ endif()
endif()
check_c_compiler_flag(-fdiagnostics-color=auto HAS_DIAG_COLOR_FLAG)
@@ -177,22 +255,6 @@ if(TRAVIS_CI_BUILD)
add_definitions(-Werror)
endif()
-if(CMAKE_COMPILER_IS_GNUCC)
- check_c_compiler_flag(-Og HAS_OG_FLAG)
-else()
- set(HAS_OG_FLAG 0)
-endif()
-
-# Set custom build flags for RelWithDebInfo.
-# -DNDEBUG purposely omitted because we want assertions.
-if(HAS_OG_FLAG)
- set(CMAKE_C_FLAGS_RELWITHDEBINFO "-Og -g"
- CACHE STRING "Flags used by the compiler during release builds with debug info." FORCE)
-elseif(NOT MSVC)
- set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g"
- CACHE STRING "Flags used by the compiler during release builds with debug info." FORCE)
-endif()
-
if(CMAKE_BUILD_TYPE MATCHES Debug)
set(DEBUG 1)
else()
@@ -206,6 +268,10 @@ if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-undefined")
+
+ # For O_CLOEXEC, O_DIRECTORY, and O_NOFOLLOW flags on older systems
+ # (pre POSIX.1-2008: glibc 2.11 and earlier). #4042
+ add_definitions(-D_GNU_SOURCE)
endif()
if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_NAME STREQUAL "SunOS")
@@ -231,7 +297,7 @@ include(CheckLibraryExists)
find_package(LibUV REQUIRED)
include_directories(SYSTEM ${LIBUV_INCLUDE_DIRS})
-find_package(Msgpack REQUIRED)
+find_package(Msgpack 1.0.0 REQUIRED)
include_directories(SYSTEM ${MSGPACK_INCLUDE_DIRS})
find_package(LuaJit REQUIRED)
@@ -260,7 +326,7 @@ if((CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN) AND NOT CMAKE_C_COMPILER_ID MA
message(FATAL_ERROR "Sanitizers are only supported for Clang.")
endif()
-option(ENABLE_JEMALLOC "enable jemalloc" OFF)
+option(ENABLE_JEMALLOC "enable jemalloc" ON)
if (ENABLE_JEMALLOC)
if(CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN)
@@ -288,13 +354,20 @@ endif()
set(CMAKE_THREAD_PREFER_PTHREAD ON)
find_package(Threads REQUIRED)
+# Place targets in bin/ or lib/ for all build configurations
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+foreach(CFGNAME ${CMAKE_CONFIGURATION_TYPES})
+ string(TOUPPER ${CFGNAME} CFGNAME)
+ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CFGNAME} ${CMAKE_BINARY_DIR}/bin)
+ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CFGNAME} ${CMAKE_BINARY_DIR}/lib)
+ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CFGNAME} ${CMAKE_BINARY_DIR}/lib)
+endforeach()
# Find Lua interpreter
include(LuaHelpers)
-set(LUA_DEPENDENCIES lpeg MessagePack bit)
+set(LUA_DEPENDENCIES lpeg mpack bit)
if(NOT LUA_PRG)
foreach(CURRENT_LUA_PRG luajit lua)
# If LUA_PRG is set find_program() will not search
@@ -321,10 +394,13 @@ message(STATUS "Using the Lua interpreter ${LUA_PRG}.")
# Setup busted.
find_program(BUSTED_PRG busted)
+find_program(BUSTED_LUA_PRG busted-lua)
if(NOT BUSTED_OUTPUT_TYPE)
set(BUSTED_OUTPUT_TYPE "utfTerminal")
endif()
+find_program(LUACHECK_PRG luacheck)
+
include(InstallHelpers)
file(GLOB MANPAGES
@@ -335,6 +411,16 @@ install_helper(
FILES ${MANPAGES}
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
+# MIN_LOG_LEVEL for log.h
+if(DEFINED MIN_LOG_LEVEL)
+ if(NOT MIN_LOG_LEVEL MATCHES "^[0-3]$")
+ message(FATAL_ERROR "MIN_LOG_LEVEL must be a number DEBUG (0), INFO (1), WARNING (2) or ERROR (3)")
+ endif()
+ message(STATUS "Log level set to ${MIN_LOG_LEVEL}")
+else()
+ message(STATUS "Log level not specified, defaulting to INFO(1)")
+endif()
+
# Go down the tree.
add_subdirectory(src/nvim)
@@ -359,7 +445,11 @@ if(BUSTED_PRG)
if(POLICY CMP0026)
cmake_policy(SET CMP0026 OLD)
endif()
- get_target_property(TEST_LIBNVIM_PATH nvim-test LOCATION)
+ if(CMAKE_GENERATOR MATCHES "Visual Studio")
+ set(TEST_LIBNVIM_PATH ${CMAKE_BINARY_DIR}/lib/nvim-test.dll)
+ else()
+ get_target_property(TEST_LIBNVIM_PATH nvim-test LOCATION)
+ endif()
configure_file(
test/config/paths.lua.in
@@ -415,3 +505,37 @@ if(BUSTED_PRG)
-P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake
DEPENDS ${BENCHMARK_PREREQS})
endif()
+
+if(BUSTED_LUA_PRG)
+ add_custom_target(functionaltest-lua
+ COMMAND ${CMAKE_COMMAND}
+ -DBUSTED_PRG=${BUSTED_LUA_PRG}
+ -DNVIM_PRG=$<TARGET_FILE:nvim>
+ -DWORKING_DIR=${CMAKE_CURRENT_SOURCE_DIR}
+ -DBUSTED_OUTPUT_TYPE=${BUSTED_OUTPUT_TYPE}
+ -DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/test
+ -DBUILD_DIR=${CMAKE_BINARY_DIR}
+ -DTEST_TYPE=functional
+ -P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake
+ DEPENDS ${FUNCTIONALTEST_PREREQS})
+endif()
+
+if(LUACHECK_PRG)
+ add_custom_target(testlint
+ COMMAND ${CMAKE_COMMAND}
+ -DLUACHECK_PRG=${LUACHECK_PRG}
+ -DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/test
+ -P ${PROJECT_SOURCE_DIR}/cmake/RunTestsLint.cmake)
+endif()
+
+set(CPACK_PACKAGE_NAME "Neovim")
+set(CPACK_PACKAGE_VENDOR "neovim.io")
+set(CPACK_PACKAGE_VERSION ${NVIM_VERSION_MEDIUM})
+set(CPACK_PACKAGE_INSTALL_DIRECTORY "Neovim")
+# Set toplevel directory/installer name as Neovim
+set(CPACK_PACKAGE_FILE_NAME "Neovim")
+set(CPACK_TOPLEVEL_TAG "Neovim")
+set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
+set(CPACK_NSIS_MODIFY_PATH ON)
+set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
+include(CPack)