build: various build improvements

- remove "ran-" prefix from touch files as it's redundant since the
  they're already in the directory named `touches`.
- Include `contrib` when formatting with `make formatlua`.
- Use TARGET_FILE generator expression instead of assuming the
  executable location.
- reuse logic that determines whether to use lua or luajit.
- add translations to the `nvim` target.

Makefile improvements:
- rename variable `CMAKE_PRG` to `CMAKE` to make it more consistent with
  the builtin `MAKE` variable.
- stop propagating flags to generator. Users should use cmake for
  non-standard use cases.
- remove `+` prefix from targets. If the user for whatever reason wants
  to dry-run a target then they should be able to.
This commit is contained in:
dundargoc 2024-01-01 13:08:56 +01:00 committed by dundargoc
parent 32849d5667
commit ae3eed53d6
10 changed files with 53 additions and 73 deletions

View File

@ -228,7 +228,7 @@ endif()
find_program(SHELLCHECK_PRG shellcheck ${LINT_REQUIRED}) find_program(SHELLCHECK_PRG shellcheck ${LINT_REQUIRED})
find_program(STYLUA_PRG stylua ${LINT_REQUIRED}) find_program(STYLUA_PRG stylua ${LINT_REQUIRED})
set(STYLUA_DIRS runtime scripts src test) set(STYLUA_DIRS runtime scripts src test contrib)
add_glob_target( add_glob_target(
TARGET lintlua-luacheck TARGET lintlua-luacheck

View File

@ -9,7 +9,7 @@ filter-true = $(strip $(filter-out 1 on ON true TRUE,$1))
all: nvim all: nvim
CMAKE_PRG ?= $(shell (command -v cmake3 || echo cmake)) CMAKE ?= $(shell (command -v cmake3 || echo cmake))
CMAKE_BUILD_TYPE ?= Debug CMAKE_BUILD_TYPE ?= Debug
CMAKE_FLAGS := -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) CMAKE_FLAGS := -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE)
# Extra CMake flags which extend the default set # Extra CMake flags which extend the default set
@ -28,7 +28,7 @@ override CMAKE_EXTRA_FLAGS += -DCMAKE_INSTALL_PREFIX=$(CMAKE_INSTALL_PREFIX)
checkprefix: checkprefix:
@if [ -f build/.ran-cmake ]; then \ @if [ -f build/.ran-cmake ]; then \
cached_prefix=$(shell $(CMAKE_PRG) -L -N build | 2>/dev/null grep 'CMAKE_INSTALL_PREFIX' | cut -d '=' -f2); \ cached_prefix=$(shell $(CMAKE) -L -N build | 2>/dev/null grep 'CMAKE_INSTALL_PREFIX' | cut -d '=' -f2); \
if ! [ "$(CMAKE_INSTALL_PREFIX)" = "$$cached_prefix" ]; then \ if ! [ "$(CMAKE_INSTALL_PREFIX)" = "$$cached_prefix" ]; then \
printf "Re-running CMake: CMAKE_INSTALL_PREFIX '$(CMAKE_INSTALL_PREFIX)' does not match cached value '%s'.\n" "$$cached_prefix"; \ printf "Re-running CMake: CMAKE_INSTALL_PREFIX '$(CMAKE_INSTALL_PREFIX)' does not match cached value '%s'.\n" "$$cached_prefix"; \
$(RM) build/.ran-cmake; \ $(RM) build/.ran-cmake; \
@ -53,17 +53,6 @@ ifeq (,$(BUILD_TOOL))
endif endif
endif endif
# Only need to handle Ninja here. Make will inherit the VERBOSE variable, and the -j, -l, and -n flags.
ifeq ($(CMAKE_GENERATOR),Ninja)
ifneq ($(VERBOSE),)
BUILD_TOOL += -v
endif
BUILD_TOOL += $(shell printf '%s' '$(MAKEFLAGS)' | grep -o -- ' *-[jl][0-9]\+ *')
ifeq (n,$(findstring n,$(firstword -$(MAKEFLAGS))))
BUILD_TOOL += -n
endif
endif
DEPS_CMAKE_FLAGS ?= DEPS_CMAKE_FLAGS ?=
USE_BUNDLED ?= USE_BUNDLED ?=
@ -81,49 +70,48 @@ endif
SINGLE_MAKE = export MAKEFLAGS= ; $(MAKE) SINGLE_MAKE = export MAKEFLAGS= ; $(MAKE)
nvim: build/.ran-cmake deps nvim: build/.ran-cmake deps
+$(BUILD_TOOL) -C build $(BUILD_TOOL) -C build
libnvim: build/.ran-cmake deps libnvim: build/.ran-cmake deps
+$(BUILD_TOOL) -C build libnvim $(BUILD_TOOL) -C build libnvim
cmake: cmake:
touch CMakeLists.txt touch CMakeLists.txt
$(MAKE) build/.ran-cmake $(MAKE) build/.ran-cmake
build/.ran-cmake: | deps build/.ran-cmake: | deps
cd build && $(CMAKE_PRG) -G '$(CMAKE_GENERATOR)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(MAKEFILE_DIR) $(CMAKE) -B build -G '$(CMAKE_GENERATOR)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(MAKEFILE_DIR)
touch $@ touch $@
deps: | build/.ran-deps-cmake deps: | build/.ran-deps-cmake
ifeq ($(call filter-true,$(USE_BUNDLED)),) ifeq ($(call filter-true,$(USE_BUNDLED)),)
+$(BUILD_TOOL) -C $(DEPS_BUILD_DIR) $(BUILD_TOOL) -C $(DEPS_BUILD_DIR)
endif endif
ifeq ($(call filter-true,$(USE_BUNDLED)),) ifeq ($(call filter-true,$(USE_BUNDLED)),)
$(DEPS_BUILD_DIR): $(DEPS_BUILD_DIR):
mkdir -p "$@" mkdir -p "$@"
build/.ran-deps-cmake:: $(DEPS_BUILD_DIR) build/.ran-deps-cmake:: $(DEPS_BUILD_DIR)
cd $(DEPS_BUILD_DIR) && \ $(CMAKE) -S $(MAKEFILE_DIR)/cmake.deps -B $(DEPS_BUILD_DIR) -G '$(CMAKE_GENERATOR)' \
$(CMAKE_PRG) -G '$(CMAKE_GENERATOR)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \ $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) $(DEPS_CMAKE_FLAGS)
$(DEPS_CMAKE_FLAGS) $(MAKEFILE_DIR)/cmake.deps
endif endif
build/.ran-deps-cmake:: build/.ran-deps-cmake::
mkdir -p build mkdir -p build
touch $@ touch $@
# TODO: cmake 3.2+ add_custom_target() has a USES_TERMINAL flag. # TODO: cmake 3.2+ add_custom_target() has a USES_TERMINAL flag.
oldtest: | nvim build/runtime/doc/tags oldtest: | nvim
+$(SINGLE_MAKE) -C test/old/testdir clean $(SINGLE_MAKE) -C test/old/testdir clean
ifeq ($(strip $(TEST_FILE)),) ifeq ($(strip $(TEST_FILE)),)
+$(SINGLE_MAKE) -C test/old/testdir NVIM_PRG=$(NVIM_PRG) $(MAKEOVERRIDES) $(SINGLE_MAKE) -C test/old/testdir NVIM_PRG=$(NVIM_PRG) $(MAKEOVERRIDES)
else else
@# Handle TEST_FILE=test_foo{,.res,.vim}. @# Handle TEST_FILE=test_foo{,.res,.vim}.
+$(SINGLE_MAKE) -C test/old/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst %.vim,%,$(patsubst %.res,%,$(TEST_FILE))) $(SINGLE_MAKE) -C test/old/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst %.vim,%,$(patsubst %.res,%,$(TEST_FILE)))
endif endif
# Build oldtest by specifying the relative .vim filename. # Build oldtest by specifying the relative .vim filename.
.PHONY: phony_force .PHONY: phony_force
test/old/testdir/%.vim: phony_force nvim test/old/testdir/%.vim: phony_force nvim
+$(SINGLE_MAKE) -C test/old/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst test/old/testdir/%.vim,%,$@) $(SINGLE_MAKE) -C test/old/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst test/old/testdir/%.vim,%,$@)
functionaltest-lua: | nvim functionaltest-lua: | nvim
$(BUILD_TOOL) -C build functionaltest $(BUILD_TOOL) -C build functionaltest
@ -132,23 +120,23 @@ FORMAT=formatc formatlua format
LINT=lintlua lintsh lintc clang-analyzer lintcommit lint LINT=lintlua lintsh lintc clang-analyzer lintcommit lint
TEST=functionaltest unittest TEST=functionaltest unittest
generated-sources benchmark $(FORMAT) $(LINT) $(TEST) doc: | build/.ran-cmake generated-sources benchmark $(FORMAT) $(LINT) $(TEST) doc: | build/.ran-cmake
$(CMAKE_PRG) --build build --target $@ $(CMAKE) --build build --target $@
test: $(TEST) test: $(TEST)
iwyu: build/.ran-cmake iwyu: build/.ran-cmake
cmake --preset iwyu $(CMAKE) --preset iwyu
cmake --build build > build/iwyu.log $(CMAKE) --build build > build/iwyu.log
iwyu-fix-includes --only_re="src/nvim" --ignore_re="(src/nvim/eval/encode.c\ iwyu-fix-includes --only_re="src/nvim" --ignore_re="(src/nvim/eval/encode.c\
|src/nvim/auto/\ |src/nvim/auto/\
|src/nvim/os/lang.c\ |src/nvim/os/lang.c\
|src/nvim/map.c\ |src/nvim/map.c\
)" --nosafe_headers < build/iwyu.log )" --nosafe_headers < build/iwyu.log
cmake -B build -U ENABLE_IWYU $(CMAKE) -B build -U ENABLE_IWYU
cmake --build build $(CMAKE) --build build
clean: clean:
+test -d build && $(BUILD_TOOL) -C build clean || true test -d build && $(BUILD_TOOL) -C build clean || true
$(MAKE) -C test/old/testdir clean $(MAKE) -C test/old/testdir clean
$(MAKE) -C runtime/indent clean $(MAKE) -C runtime/indent clean
@ -157,7 +145,7 @@ distclean:
$(MAKE) clean $(MAKE) clean
install: checkprefix nvim install: checkprefix nvim
+$(BUILD_TOOL) -C build install $(BUILD_TOOL) -C build install
appimage: appimage:
bash scripts/genappimage.sh bash scripts/genappimage.sh

View File

@ -87,6 +87,24 @@ foreach(dep ${DEPENDENCIES})
endif() endif()
endforeach() endforeach()
if(USE_BUNDLED_LUAJIT)
set(LUA_ENGINE LuaJit)
elseif(USE_BUNDLED_LUA)
set(LUA_ENGINE Lua)
else()
find_package(Luajit)
find_package(Lua 5.1 EXACT)
if(LUAJIT_FOUND)
set(LUA_ENGINE LuaJit)
string(APPEND DEPS_INCLUDE_FLAGS " -I${LUAJIT_INCLUDE_DIR}")
elseif(LUA_FOUND)
set(LUA_ENGINE Lua)
string(APPEND DEPS_INCLUDE_FLAGS " -I${LUA_INCLUDE_DIR}")
else()
message(FATAL_ERROR "Could not find system lua or luajit")
endif()
endif()
if(USE_BUNDLED_UNIBILIUM) if(USE_BUNDLED_UNIBILIUM)
include(BuildUnibilium) include(BuildUnibilium)
endif() endif()

View File

@ -1,19 +1,3 @@
set(LPEG_INCLUDE_FLAGS ${DEPS_INCLUDE_FLAGS})
if(NOT USE_BUNDLED_LUAJIT AND NOT USE_BUNDLED_LUA)
find_package(Luajit)
if(LUAJIT_FOUND)
string(CONCAT LPEG_INCLUDE_FLAGS ${DEPS_INCLUDE_FLAGS} " -I${LUAJIT_INCLUDE_DIR}")
else()
find_package(Lua 5.1 EXACT)
if(LUA_FOUND)
string(CONCAT LPEG_INCLUDE_FLAGS ${DEPS_INCLUDE_FLAGS} " -I${LUA_INCLUDE_DIR}")
endif()
endif()
endif()
list(APPEND LPEG_CMAKE_ARGS -DCMAKE_C_FLAGS=${LPEG_INCLUDE_FLAGS})
ExternalProject_Add(lpeg ExternalProject_Add(lpeg
URL ${LPEG_URL} URL ${LPEG_URL}
URL_HASH SHA256=${LPEG_SHA256} URL_HASH SHA256=${LPEG_SHA256}
@ -21,7 +5,7 @@ ExternalProject_Add(lpeg
PATCH_COMMAND ${CMAKE_COMMAND} -E copy PATCH_COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/cmake/LpegCMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LpegCMakeLists.txt
${DEPS_BUILD_DIR}/src/lpeg/CMakeLists.txt ${DEPS_BUILD_DIR}/src/lpeg/CMakeLists.txt
CMAKE_ARGS ${DEPS_CMAKE_ARGS} ${LPEG_CMAKE_ARGS} CMAKE_ARGS ${DEPS_CMAKE_ARGS} -DCMAKE_C_FLAGS=${DEPS_INCLUDE_FLAGS}
CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS} CMAKE_CACHE_ARGS ${DEPS_CMAKE_CACHE_ARGS}
${EXTERNALPROJECT_OPTIONS}) ${EXTERNALPROJECT_OPTIONS})

View File

@ -5,18 +5,7 @@ set(LUV_CMAKE_ARGS
-D BUILD_STATIC_LIBS=ON -D BUILD_STATIC_LIBS=ON
-D BUILD_MODULE=OFF) -D BUILD_MODULE=OFF)
if(USE_BUNDLED_LUAJIT) list(APPEND LUV_CMAKE_ARGS -D WITH_LUA_ENGINE=${LUA_ENGINE})
list(APPEND LUV_CMAKE_ARGS -D WITH_LUA_ENGINE=LuaJit)
elseif(USE_BUNDLED_LUA)
list(APPEND LUV_CMAKE_ARGS -D WITH_LUA_ENGINE=Lua)
else()
find_package(Luajit)
if(LUAJIT_FOUND)
list(APPEND LUV_CMAKE_ARGS -D WITH_LUA_ENGINE=LuaJit)
else()
list(APPEND LUV_CMAKE_ARGS -D WITH_LUA_ENGINE=Lua)
endif()
endif()
if(USE_BUNDLED_LIBUV) if(USE_BUNDLED_LIBUV)
list(APPEND LUV_CMAKE_ARGS -D CMAKE_PREFIX_PATH=${DEPS_INSTALL_DIR}) list(APPEND LUV_CMAKE_ARGS -D CMAKE_PREFIX_PATH=${DEPS_INSTALL_DIR})

View File

@ -89,7 +89,7 @@ function(add_glob_target)
endif() endif()
if(ARG_TOUCH_STRATEGY STREQUAL SINGLE) if(ARG_TOUCH_STRATEGY STREQUAL SINGLE)
set(touch_file ${TOUCHES_DIR}/ran-${ARG_TARGET}) set(touch_file ${TOUCHES_DIR}/${ARG_TARGET})
add_custom_command( add_custom_command(
OUTPUT ${touch_file} OUTPUT ${touch_file}
COMMAND ${CMAKE_COMMAND} -E touch ${touch_file} COMMAND ${CMAKE_COMMAND} -E touch ${touch_file}
@ -103,7 +103,7 @@ function(add_glob_target)
foreach(f ${ARG_FILES}) foreach(f ${ARG_FILES})
string(REGEX REPLACE "^${PROJECT_SOURCE_DIR}/" "" tf ${f}) string(REGEX REPLACE "^${PROJECT_SOURCE_DIR}/" "" tf ${f})
string(REGEX REPLACE "[/.]" "-" tf ${tf}) string(REGEX REPLACE "[/.]" "-" tf ${tf})
set(touch_file ${touch_dir}/ran-${tf}) set(touch_file ${touch_dir}/${tf})
add_custom_command( add_custom_command(
OUTPUT ${touch_file} OUTPUT ${touch_file}
COMMAND ${CMAKE_COMMAND} -E touch ${touch_file} COMMAND ${CMAKE_COMMAND} -E touch ${touch_file}
@ -133,7 +133,7 @@ function(add_glob_target)
file(MAKE_DIRECTORY ${td}) file(MAKE_DIRECTORY ${td})
string(REGEX REPLACE "^${PROJECT_SOURCE_DIR}/" "" tf ${touch_dir}) string(REGEX REPLACE "^${PROJECT_SOURCE_DIR}/" "" tf ${touch_dir})
string(REGEX REPLACE "[/.]" "-" tf ${tf}) string(REGEX REPLACE "[/.]" "-" tf ${tf})
set(touch_file ${td}/ran-${tf}) set(touch_file ${td}/${tf})
add_custom_command( add_custom_command(
OUTPUT ${touch_file} OUTPUT ${touch_file}

View File

@ -1,10 +1,10 @@
-- Run this file as `nvim --clean -u minimal.lua` -- Run this file as `nvim --clean -u minimal.lua`
for name, url in pairs{ for name, url in pairs {
-- ADD PLUGINS _NECESSARY_ TO REPRODUCE THE ISSUE, e.g: -- ADD PLUGINS _NECESSARY_ TO REPRODUCE THE ISSUE, e.g:
-- some_plugin = 'https://github.com/author/plugin.nvim' -- some_plugin = 'https://github.com/author/plugin.nvim'
} do } do
local install_path = vim.fn.fnamemodify('nvim_issue/'..name, ':p') local install_path = vim.fn.fnamemodify('nvim_issue/' .. name, ':p')
if vim.fn.isdirectory(install_path) == 0 then if vim.fn.isdirectory(install_path) == 0 then
vim.fn.system { 'git', 'clone', '--depth=1', url, install_path } vim.fn.system { 'git', 'clone', '--depth=1', url, install_path }
end end

View File

@ -33,7 +33,7 @@ foreach(PACKAGE ${PACKAGES})
add_custom_command(OUTPUT "${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags" add_custom_command(OUTPUT "${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags"
COMMAND ${CMAKE_COMMAND} -E copy_directory COMMAND ${CMAKE_COMMAND} -E copy_directory
${PACKAGE} ${GENERATED_PACKAGE_DIR}/${PACKNAME} ${PACKAGE} ${GENERATED_PACKAGE_DIR}/${PACKNAME}
COMMAND "${PROJECT_BINARY_DIR}/bin/nvim" COMMAND $<TARGET_FILE:nvim_bin>
-u NONE -i NONE -e --headless -c "helptags doc" -c quit -u NONE -i NONE -e --headless -c "helptags doc" -c quit
DEPENDS DEPENDS
nvim_bin nvim_bin
@ -67,7 +67,7 @@ add_custom_command(OUTPUT ${GENERATED_HELP_TAGS}
COMMAND ${CMAKE_COMMAND} -E remove_directory doc COMMAND ${CMAKE_COMMAND} -E remove_directory doc
COMMAND ${CMAKE_COMMAND} -E copy_directory COMMAND ${CMAKE_COMMAND} -E copy_directory
${PROJECT_SOURCE_DIR}/runtime/doc doc ${PROJECT_SOURCE_DIR}/runtime/doc doc
COMMAND "${PROJECT_BINARY_DIR}/bin/nvim" COMMAND $<TARGET_FILE:nvim_bin>
-u NONE -i NONE -e --headless -c "helptags ++t doc" -c quit -u NONE -i NONE -e --headless -c "helptags ++t doc" -c quit
DEPENDS DEPENDS
nvim_bin nvim_bin
@ -77,7 +77,7 @@ add_custom_command(OUTPUT ${GENERATED_HELP_TAGS}
# TODO: This doesn't work. wait for "nvim -l" to land? # TODO: This doesn't work. wait for "nvim -l" to land?
add_custom_target(doc_html add_custom_target(doc_html
COMMAND "${PROJECT_BINARY_DIR}/bin/nvim" COMMAND $<TARGET_FILE:nvim_bin>
-V1 -es --clean -c "lua require('scripts.gen_help_html').gen('./build/runtime/doc', './build/doc_html', nil, 'todo_commit_id')" -c "0cq" -V1 -es --clean -c "lua require('scripts.gen_help_html').gen('./build/runtime/doc', './build/doc_html', nil, 'todo_commit_id')" -c "0cq"
DEPENDS DEPENDS
${GENERATED_HELP_TAGS} ${GENERATED_HELP_TAGS}

View File

@ -3,12 +3,12 @@ add_library(main_lib INTERFACE)
# Internally we need to make a distinction between "nvim without runtime files" # Internally we need to make a distinction between "nvim without runtime files"
# (nvim_bin) and "nvim with runtime files" (nvim). # (nvim_bin) and "nvim with runtime files" (nvim).
add_executable(nvim_bin EXCLUDE_FROM_ALL) add_executable(nvim_bin EXCLUDE_FROM_ALL)
set_target_properties(nvim_bin PROPERTIES OUTPUT_NAME nvim)
set_target_properties(nvim_bin set_target_properties(nvim_bin
PROPERTIES PROPERTIES
EXPORT_COMPILE_COMMANDS ON EXPORT_COMPILE_COMMANDS ON
ENABLE_EXPORTS TRUE) ENABLE_EXPORTS TRUE
OUTPUT_NAME nvim)
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# Dependencies # Dependencies

View File

@ -182,6 +182,7 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG)
BuildMo(${LANGUAGE}) BuildMo(${LANGUAGE})
endforeach() endforeach()
add_custom_target(nvim_translations ALL DEPENDS ${LANGUAGE_MO_FILES}) add_custom_target(nvim_translations DEPENDS ${LANGUAGE_MO_FILES})
add_custom_target(update-po DEPENDS ${UPDATE_PO_TARGETS}) add_custom_target(update-po DEPENDS ${UPDATE_PO_TARGETS})
add_dependencies(nvim nvim_translations)
endif() endif()