diff --git a/CMakeLists.txt b/CMakeLists.txt index d64d1fc723..6dedbfd714 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,13 +37,8 @@ include(Util) # Variables #------------------------------------------------------------------------------- set(FUNCS_DATA ${PROJECT_BINARY_DIR}/funcs_data.mpack) -set(GENERATED_RUNTIME_DIR ${PROJECT_BINARY_DIR}/runtime) set(TOUCHES_DIR ${PROJECT_BINARY_DIR}/touches) -# GENERATED_RUNTIME_DIR -set(GENERATED_HELP_TAGS ${GENERATED_RUNTIME_DIR}/doc/tags) -set(GENERATED_SYN_VIM ${GENERATED_RUNTIME_DIR}/syntax/vim/generated.vim) - set_directory_properties(PROPERTIES EP_PREFIX "${DEPS_BUILD_DIR}") @@ -60,6 +55,12 @@ if(${CMAKE_VERSION} VERSION_LESS 3.20) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) endif() +if(${CMAKE_VERSION} VERSION_GREATER_EQUAL 3.26) + set(COPY_DIRECTORY copy_directory_if_different) +else() + set(COPY_DIRECTORY copy_directory) +endif() + # Prefer our bundled versions of dependencies. if(DEFINED ENV{DEPS_BUILD_DIR}) set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/usr" CACHE PATH "Path prefix for finding dependencies") @@ -231,7 +232,7 @@ set(STYLUA_DIRS runtime scripts src test) add_glob_target( TARGET lintlua-luacheck - COMMAND $ + COMMAND $ FLAGS -ll ${PROJECT_SOURCE_DIR}/test/lua_runner.lua ${CMAKE_BINARY_DIR}/usr luacheck -q GLOB_DIRS runtime scripts src test GLOB_PAT *.lua @@ -258,8 +259,8 @@ add_glob_target( TOUCH_STRATEGY PER_DIR) add_custom_target(lintcommit - COMMAND $ -u NONE -l ${PROJECT_SOURCE_DIR}/scripts/lintcommit.lua main) -add_dependencies(lintcommit nvim) + COMMAND $ -u NONE -l ${PROJECT_SOURCE_DIR}/scripts/lintcommit.lua main) +add_dependencies(lintcommit nvim_bin) add_custom_target(lint) add_dependencies(lint lintc lintlua lintsh lintcommit) @@ -280,6 +281,9 @@ install_helper( FILES ${CMAKE_SOURCE_DIR}/src/man/nvim.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) +add_custom_target(nvim ALL) +add_dependencies(nvim nvim_bin nvim_runtime_deps nvim_runtime) + add_subdirectory(src/nvim) add_subdirectory(cmake.config) add_subdirectory(runtime) diff --git a/cmake.config/CMakeLists.txt b/cmake.config/CMakeLists.txt index d333cc216a..f3cc803cf5 100644 --- a/cmake.config/CMakeLists.txt +++ b/cmake.config/CMakeLists.txt @@ -148,7 +148,7 @@ foreach(BUILD_TYPE Debug Release RelWithDebInfo MinSizeRel) set(GEN_RHS "${CMAKE_C_FLAGS_${BUILD_TYPE_UPPER}} ") string(APPEND VERSION_STRING "$<${GEN_CONFIG}:${GEN_RHS}>") - set(GEN_RHS "$<$>:${CMAKE_C_COMPILE_OPTIONS_IPO}>") + set(GEN_RHS "$<$>:${CMAKE_C_COMPILE_OPTIONS_IPO}>") string(APPEND VERSION_STRING "$<${GEN_CONFIG}:${GEN_RHS}>") endforeach() @@ -161,7 +161,7 @@ function(append_target_expression) "" ${ARGN}) - set(TARGET_EXPRESSION "$") + set(TARGET_EXPRESSION "$") if(${CMAKE_VERSION} VERSION_GREATER_EQUAL 3.15) set(TARGET_EXPRESSION "$") endif() diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt index a44713d4ce..c9655ad9b9 100644 --- a/runtime/CMakeLists.txt +++ b/runtime/CMakeLists.txt @@ -1,5 +1,9 @@ -set(SYN_VIM_GENERATOR ${PROJECT_SOURCE_DIR}/src/nvim/generators/gen_vimvim.lua) +set(GENERATED_RUNTIME_DIR ${PROJECT_BINARY_DIR}/runtime) + +set(GENERATED_HELP_TAGS ${GENERATED_RUNTIME_DIR}/doc/tags) set(GENERATED_PACKAGE_DIR ${GENERATED_RUNTIME_DIR}/pack/dist/opt) +set(GENERATED_SYN_VIM ${GENERATED_RUNTIME_DIR}/syntax/vim/generated.vim) +set(SYN_VIM_GENERATOR ${PROJECT_SOURCE_DIR}/src/nvim/generators/gen_vimvim.lua) file(MAKE_DIRECTORY ${GENERATED_RUNTIME_DIR}/syntax/vim) @@ -32,7 +36,7 @@ foreach(PACKAGE ${PACKAGES}) COMMAND "${PROJECT_BINARY_DIR}/bin/nvim" -u NONE -i NONE -e --headless -c "helptags doc" -c quit DEPENDS - nvim + nvim_bin nvim_runtime_deps WORKING_DIRECTORY "${GENERATED_PACKAGE_DIR}/${PACKNAME}" ) @@ -66,7 +70,7 @@ add_custom_command(OUTPUT ${GENERATED_HELP_TAGS} COMMAND "${PROJECT_BINARY_DIR}/bin/nvim" -u NONE -i NONE -e --headless -c "helptags ++t doc" -c quit DEPENDS - nvim + nvim_bin nvim_runtime_deps WORKING_DIRECTORY "${GENERATED_RUNTIME_DIR}" ) @@ -81,7 +85,7 @@ add_custom_target(doc_html ) add_custom_target( - runtime ALL + nvim_runtime DEPENDS ${GENERATED_SYN_VIM} ${GENERATED_HELP_TAGS} diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 98a9301da6..451ab7c303 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -1,7 +1,11 @@ add_library(main_lib INTERFACE) -add_executable(nvim) -set_target_properties(nvim +# Internally we need to make a distinction between "nvim without runtime files" +# (nvim_bin) and "nvim with runtime files" (nvim). +add_executable(nvim_bin EXCLUDE_FROM_ALL) +set_target_properties(nvim_bin PROPERTIES OUTPUT_NAME nvim) + +set_target_properties(nvim_bin PROPERTIES EXPORT_COMPILE_COMMANDS ON ENABLE_EXPORTS TRUE) @@ -115,7 +119,7 @@ elseif(MINGW) target_compile_definitions(main_lib INTERFACE __USE_MINGW_ANSI_STDIO) # Enable wmain - target_link_libraries(nvim PRIVATE -municode) + target_link_libraries(nvim_bin PRIVATE -municode) elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") if(CMAKE_C_COMPILER_VERSION VERSION_LESS 10) target_compile_options(main_lib INTERFACE -Wno-conversion) @@ -134,7 +138,7 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") # workaround for clang-11 on macOS, supported on later versions if(NOT APPLE) - target_link_libraries(nvim PRIVATE -Wl,--no-undefined) + target_link_libraries(nvim_bin PRIVATE -Wl,--no-undefined) endif() endif() @@ -150,16 +154,16 @@ if(CMAKE_SYSTEM_NAME MATCHES "Windows") target_compile_definitions(main_lib INTERFACE _WIN32_WINNT=0x0602 MSWIN) target_link_libraries(main_lib INTERFACE netapi32) elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") - target_link_libraries(nvim PRIVATE "-framework CoreServices") + target_link_libraries(nvim_bin PRIVATE "-framework CoreServices") # Actually export symbols - symbols may not be visible even though # ENABLE_EXPORTS is set to true. See # https://github.com/neovim/neovim/issues/25295 - target_link_options(nvim PRIVATE "-Wl,-export_dynamic") + target_link_options(nvim_bin PRIVATE "-Wl,-export_dynamic") elseif(CMAKE_SYSTEM_NAME MATCHES "OpenBSD") target_link_libraries(main_lib INTERFACE pthread c++abi) elseif(CMAKE_SYSTEM_NAME STREQUAL "SunOS") - target_link_libraries(nvim PRIVATE -lsocket) + target_link_libraries(nvim_bin PRIVATE -lsocket) endif() check_c_compiler_flag(-Wimplicit-fallthrough HAVE_WIMPLICIT_FALLTHROUGH_FLAG) @@ -205,35 +209,35 @@ if(ENABLE_ASAN_UBSAN) if(NOT MSVC) if(CI_BUILD) # Try to recover from all sanitize issues so we get reports about all failures - target_compile_options(nvim PRIVATE -fsanitize-recover=all) + target_compile_options(nvim_bin PRIVATE -fsanitize-recover=all) else() - target_compile_options(nvim PRIVATE -fno-sanitize-recover=all) + target_compile_options(nvim_bin PRIVATE -fno-sanitize-recover=all) endif() - target_compile_options(nvim PRIVATE + target_compile_options(nvim_bin PRIVATE -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=undefined) endif() - target_compile_options(nvim PRIVATE -fsanitize=address) - target_link_libraries(nvim PRIVATE -fsanitize=address -fsanitize=undefined) - target_compile_definitions(nvim PRIVATE ENABLE_ASAN_UBSAN) + target_compile_options(nvim_bin PRIVATE -fsanitize=address) + target_link_libraries(nvim_bin PRIVATE -fsanitize=address -fsanitize=undefined) + target_compile_definitions(nvim_bin PRIVATE ENABLE_ASAN_UBSAN) endif() if(ENABLE_MSAN) message(STATUS "Enabling memory sanitizer for nvim.") - target_compile_options(nvim PRIVATE + target_compile_options(nvim_bin PRIVATE -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -fno-optimize-sibling-calls) - target_link_libraries(nvim PRIVATE -fsanitize=memory -fsanitize-memory-track-origins) + target_link_libraries(nvim_bin PRIVATE -fsanitize=memory -fsanitize-memory-track-origins) endif() if(ENABLE_TSAN) message(STATUS "Enabling thread sanitizer for nvim.") - target_compile_options(nvim PRIVATE -fsanitize=thread -fPIE) - target_link_libraries(nvim PRIVATE -fsanitize=thread) + target_compile_options(nvim_bin PRIVATE -fsanitize=thread -fPIE) + target_link_libraries(nvim_bin PRIVATE -fsanitize=thread) endif() option(CI_BUILD "CI, extra flags will be set" OFF) @@ -254,7 +258,7 @@ if(ENABLE_IWYU) string(APPEND iwyu_flags "-Xiwyu;--no_fwd_decls;") string(APPEND iwyu_flags "-Xiwyu;--mapping_file=${PROJECT_SOURCE_DIR}/cmake.config/iwyu/mapping.imp") - set_target_properties(nvim PROPERTIES C_INCLUDE_WHAT_YOU_USE "${iwyu_flags}") + set_target_properties(nvim_bin PROPERTIES C_INCLUDE_WHAT_YOU_USE "${iwyu_flags}") target_compile_definitions(main_lib INTERFACE EXITFREE) endif() @@ -284,7 +288,7 @@ endif() #------------------------------------------------------------------------------- set(API_METADATA ${PROJECT_BINARY_DIR}/api_metadata.mpack) -set(BINARY_LIB_DIR ${PROJECT_BINARY_DIR}/lib/nvim/) +set(BINARY_LIB_DIR ${PROJECT_BINARY_DIR}/lib/nvim) set(GENERATED_DIR ${PROJECT_BINARY_DIR}/src/nvim/auto) set(GENERATED_INCLUDES_DIR ${PROJECT_BINARY_DIR}/include) set(GENERATOR_DIR ${CMAKE_CURRENT_LIST_DIR}/generators) @@ -436,7 +440,7 @@ if(CI_BUILD) # TODO(bfredl): debug log level also exposes some errors with EXITFREE in ASAN build. else() # Minimize logging for release-type builds. - target_compile_definitions(nvim PRIVATE $<$:NVIM_LOG_DEBUG>) + target_compile_definitions(nvim_bin PRIVATE $<$:NVIM_LOG_DEBUG>) endif() if(ENABLE_ASAN_UBSAN OR ENABLE_MSAN OR ENABLE_TSAN) @@ -685,8 +689,8 @@ if(PREFER_LUA) message(STATUS "luajit not used, skipping unit tests") else() file(GLOB UNIT_TEST_FIXTURES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/test/unit/fixtures/*.c) - target_sources(nvim PRIVATE ${UNIT_TEST_FIXTURES}) - target_compile_definitions(nvim PRIVATE UNIT_TESTING) + target_sources(nvim_bin PRIVATE ${UNIT_TEST_FIXTURES}) + target_compile_definitions(nvim_bin PRIVATE UNIT_TESTING) endif() target_sources(main_lib INTERFACE @@ -700,32 +704,33 @@ target_sources(main_lib INTERFACE target_sources(nlua0 PUBLIC ${NLUA0_SOURCES}) -target_link_libraries(nvim PRIVATE main_lib PUBLIC libuv) -install_helper(TARGETS nvim) +target_link_libraries(nvim_bin PRIVATE main_lib PUBLIC libuv) +install_helper(TARGETS nvim_bin) if(MSVC) - install(FILES $ DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL) + install(FILES $ DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL) endif() if(ENABLE_LTO) include(CheckIPOSupported) check_ipo_supported(RESULT IPO_SUPPORTED) if(IPO_SUPPORTED) - set_target_properties(nvim PROPERTIES + set_target_properties(nvim_bin PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL TRUE) endif() endif() +add_custom_target(nvim_runtime_deps) if(WIN32) # Copy DLLs and third-party tools to bin/ and install them along with nvim - add_custom_target(nvim_runtime_deps ALL - COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_BINARY_DIR}/windows_runtime_deps/ + add_custom_command(TARGET nvim_runtime_deps + COMMAND ${CMAKE_COMMAND} -E ${COPY_DIRECTORY} ${PROJECT_BINARY_DIR}/windows_runtime_deps/ ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) install(DIRECTORY ${PROJECT_BINARY_DIR}/windows_runtime_deps/ DESTINATION ${CMAKE_INSTALL_BINDIR}) - add_custom_target(nvim_dll_deps DEPENDS nvim + add_custom_target(nvim_dll_deps DEPENDS nvim_bin COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/windows_runtime_deps COMMAND ${CMAKE_COMMAND} -D CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} @@ -755,18 +760,11 @@ if(WIN32) add_custom_target(external_blobs COMMAND ${CMAKE_COMMAND} -P ${PROJECT_BINARY_DIR}/external_blobs.cmake) add_dependencies(nvim_runtime_deps external_blobs) -else() - add_custom_target(nvim_runtime_deps) # Stub target to avoid CMP0046. endif() -file(MAKE_DIRECTORY ${BINARY_LIB_DIR}) - # install treesitter parser if bundled if(EXISTS ${DEPS_PREFIX}/lib/nvim/parser) - file(GLOB TREESITTER_PARSERS CONFIGURE_DEPENDS ${DEPS_PREFIX}/lib/nvim/parser/*) - foreach(parser_lib ${TREESITTER_PARSERS}) - file(COPY ${parser_lib} DESTINATION ${BINARY_LIB_DIR}/parser) - endforeach() + add_custom_command(TARGET nvim_runtime_deps COMMAND ${CMAKE_COMMAND} -E ${COPY_DIRECTORY} ${DEPS_PREFIX}/lib/nvim/parser ${BINARY_LIB_DIR}/parser) endif() install(DIRECTORY ${BINARY_LIB_DIR} @@ -842,7 +840,7 @@ add_glob_target( add_custom_target(copy_compile_commands COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/compile_commands.json ${PROJECT_SOURCE_DIR}/compile_commands.json) -add_dependencies(copy_compile_commands nvim) +add_dependencies(copy_compile_commands nvim_bin) add_dependencies(lintc-clang-tidy copy_compile_commands) add_dependencies(clang-analyzer copy_compile_commands) @@ -926,7 +924,7 @@ add_custom_command( OUTPUT ${MPACK_FILES} COMMAND ${PROJECT_SOURCE_DIR}/scripts/gen_vimdoc.py DEPENDS - nvim + nvim_bin ${API_SOURCES} ${LUA_SOURCES} ${VIMDOC_FILES} @@ -938,7 +936,7 @@ add_custom_command( add_custom_command( OUTPUT ${GEN_EVAL_TOUCH} COMMAND ${CMAKE_COMMAND} -E touch ${GEN_EVAL_TOUCH} - COMMAND $ -l ${PROJECT_SOURCE_DIR}/scripts/gen_eval_files.lua + COMMAND $ -l ${PROJECT_SOURCE_DIR}/scripts/gen_eval_files.lua DEPENDS ${API_METADATA} ${NVIM_RUNTIME_DIR}/doc/api.mpack diff --git a/src/nvim/po/CMakeLists.txt b/src/nvim/po/CMakeLists.txt index 68e572911c..a4c95df3f1 100644 --- a/src/nvim/po/CMakeLists.txt +++ b/src/nvim/po/CMakeLists.txt @@ -53,16 +53,16 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG) list(SORT NVIM_RELATIVE_SOURCES) add_custom_command( OUTPUT ${NVIM_POT} - COMMAND $ -u NONE -i NONE -n --headless --cmd "set cpo+=+" + COMMAND $ -u NONE -i NONE -n --headless --cmd "set cpo+=+" -S ${CMAKE_CURRENT_SOURCE_DIR}/tojavascript.vim ${NVIM_POT} ${PROJECT_SOURCE_DIR}/runtime/optwin.vim COMMAND ${XGETTEXT_PRG} -o ${NVIM_POT} --default-domain=nvim --add-comments --keyword=_ --keyword=N_ --keyword=NGETTEXT:1,2 -D ${CMAKE_CURRENT_SOURCE_DIR} -D ${CMAKE_CURRENT_BINARY_DIR} ${NVIM_RELATIVE_SOURCES} optwin.js - COMMAND $ -u NONE -i NONE -n --headless --cmd "set cpo+=+" + COMMAND $ -u NONE -i NONE -n --headless --cmd "set cpo+=+" -S ${CMAKE_CURRENT_SOURCE_DIR}/fixfilenames.vim ${NVIM_POT} ../../../runtime/optwin.vim VERBATIM - DEPENDS ${NVIM_SOURCES} nvim nvim_runtime_deps) + DEPENDS ${NVIM_SOURCES} nvim_bin nvim_runtime_deps) set(LANGUAGE_MO_FILES) set(UPDATE_PO_TARGETS) @@ -88,7 +88,7 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG) set(poFile ${CMAKE_CURRENT_SOURCE_DIR}/${name}.po) add_custom_target(check-po-${name} - COMMAND $ -u NONE -n -e + COMMAND $ -u NONE -n -e -S ${CMAKE_CURRENT_SOURCE_DIR}/check.vim -c "if error == 0 | q | endif" -c cq ${poFile} || ${CMAKE_COMMAND} -E echo "${name}.po failed the check." @@ -182,6 +182,6 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG) BuildMo(${LANGUAGE}) endforeach() - add_custom_target(translations ALL DEPENDS ${LANGUAGE_MO_FILES}) + add_custom_target(nvim_translations ALL DEPENDS ${LANGUAGE_MO_FILES}) add_custom_target(update-po DEPENDS ${UPDATE_PO_TARGETS}) endif() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index da2c29010b..3ae11bd1a7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,7 +7,7 @@ set(TEST_OPTIONS -D CIRRUS_CI=$ENV{CIRRUS_CI} -D CI_BUILD=${CI_BUILD} -D DEPS_INSTALL_DIR=${DEPS_INSTALL_DIR} - -D NVIM_PRG=$ + -D NVIM_PRG=$ -D TEST_DIR=${CMAKE_CURRENT_SOURCE_DIR} -D WORKING_DIR=${PROJECT_SOURCE_DIR}) @@ -18,9 +18,8 @@ if(LUA_HAS_FFI) -D TEST_TYPE=unit ${TEST_OPTIONS} -P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake - DEPENDS nvim USES_TERMINAL) - add_dependencies(unittest lua-dev-deps) + add_dependencies(unittest lua-dev-deps nvim) else() message(WARNING "disabling unit tests: no Luajit FFI in ${LUA_PRG}") endif() @@ -34,16 +33,15 @@ add_custom_target(functionaltest -D TEST_TYPE=functional ${TEST_OPTIONS} -P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake - DEPENDS nvim printenv-test printargs-test shell-test pwsh-test streams-test tty-test ${GENERATED_HELP_TAGS} ${GENERATED_SYN_VIM} + DEPENDS printenv-test printargs-test shell-test pwsh-test streams-test tty-test USES_TERMINAL) +add_dependencies(functionaltest lua-dev-deps nvim) add_custom_target(benchmark COMMAND ${CMAKE_COMMAND} -D TEST_TYPE=benchmark ${TEST_OPTIONS} -P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake - DEPENDS nvim tty-test + DEPENDS tty-test USES_TERMINAL) - -add_dependencies(functionaltest lua-dev-deps) -add_dependencies(benchmark lua-dev-deps) +add_dependencies(benchmark lua-dev-deps nvim) diff --git a/test/functional/fixtures/CMakeLists.txt b/test/functional/fixtures/CMakeLists.txt index 6e64b1e4dc..150407fe46 100644 --- a/test/functional/fixtures/CMakeLists.txt +++ b/test/functional/fixtures/CMakeLists.txt @@ -5,7 +5,7 @@ endif() if(WIN32) target_compile_definitions(test_lib INTERFACE MSWIN) endif() -target_link_libraries(test_lib INTERFACE nvim) +target_link_libraries(test_lib INTERFACE nvim_bin) add_executable(tty-test EXCLUDE_FROM_ALL tty-test.c) add_executable(shell-test EXCLUDE_FROM_ALL shell-test.c)