diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 222 |
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) |