mirror of
https://github.com/neovim/neovim
synced 2025-07-30 02:11:52 +00:00
Compare commits
46 Commits
Author | SHA1 | Date | |
---|---|---|---|
5b839ced69 | |||
844872cc0a | |||
0e96f7d04c | |||
1cc63abf4a | |||
9f51da3442 | |||
857678c2ec | |||
03bd9147f0 | |||
ee9e3420fd | |||
7b60ec79ea | |||
14357c83c5 | |||
571609fb89 | |||
37a00be7c0 | |||
09306f07c4 | |||
ec101b9fd9 | |||
222d1414dc | |||
7f4fa077cd | |||
00889948dd | |||
1bb861c7a1 | |||
d547d874af | |||
060eeaa14c | |||
9dae939b1f | |||
8c6a4fab66 | |||
1b54344c11 | |||
8f68548384 | |||
25da2430f9 | |||
93f1ec0a59 | |||
5c8e5432c0 | |||
e86997a812 | |||
a0ebba7052 | |||
ae249d81fb | |||
785baceaee | |||
aa0ddc6690 | |||
2cd272decb | |||
08ddfa9851 | |||
beac24d6f3 | |||
5dcf2c77a9 | |||
ce4c8010cc | |||
270f71b571 | |||
3c0f239c3e | |||
1d32521135 | |||
bd057d4b40 | |||
096f8418c5 | |||
84784a8391 | |||
fb11ef0aad | |||
faf3159ab0 | |||
a4699892af |
44
.builds/freebsd.yml
Normal file
44
.builds/freebsd.yml
Normal file
@ -0,0 +1,44 @@
|
||||
image: freebsd/12.x
|
||||
|
||||
packages:
|
||||
- cmake
|
||||
- gmake
|
||||
- ninja
|
||||
- libtool
|
||||
- sha
|
||||
- automake
|
||||
- pkgconf
|
||||
- unzip
|
||||
- wget
|
||||
- gettext
|
||||
- python
|
||||
- libffi
|
||||
|
||||
sources:
|
||||
- https://github.com/neovim/neovim
|
||||
|
||||
environment:
|
||||
SOURCEHUT: 1
|
||||
LANG: en_US.UTF-8
|
||||
CMAKE_EXTRA_FLAGS: -DCI_BUILD=ON -DMIN_LOG_LEVEL=3
|
||||
|
||||
tasks:
|
||||
- build-deps: |
|
||||
cd neovim
|
||||
gmake deps
|
||||
- build: |
|
||||
cd neovim
|
||||
gmake CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_EXTRA_FLAGS="${CMAKE_EXTRA_FLAGS}" nvim
|
||||
- functionaltest: |
|
||||
cd neovim
|
||||
gmake functionaltest
|
||||
- unittest: |
|
||||
cd neovim
|
||||
gmake unittest
|
||||
|
||||
# Unfortunately, oldtest is tanking hard on sourcehut's FreeBSD instance
|
||||
# and not producing any logs as a result. So don't do this task for now.
|
||||
# Ref: https://github.com/neovim/neovim/pull/11477#discussion_r352095005.
|
||||
# - test-oldtest: |
|
||||
# cd neovim
|
||||
# gmake oldtest
|
43
.builds/openbsd.yml
Normal file
43
.builds/openbsd.yml
Normal file
@ -0,0 +1,43 @@
|
||||
# sourcehut CI: https://builds.sr.ht/~jmk/neovim
|
||||
|
||||
image: openbsd/6.9
|
||||
|
||||
packages:
|
||||
- autoconf-2.71
|
||||
- automake-1.16.3
|
||||
- cmake
|
||||
- gettext-runtime-0.21p1
|
||||
- gettext-tools-0.21p1
|
||||
- gmake
|
||||
- libtool
|
||||
- ninja-1.10.2p0
|
||||
- unzip-6.0p14
|
||||
|
||||
sources:
|
||||
- https://github.com/neovim/neovim
|
||||
|
||||
environment:
|
||||
SOURCEHUT: 1
|
||||
LC_CTYPE: en_US.UTF-8
|
||||
CMAKE_EXTRA_FLAGS: -DCI_BUILD=ON -DMIN_LOG_LEVEL=3
|
||||
|
||||
tasks:
|
||||
- build-deps: |
|
||||
export AUTOCONF_VERSION=2.71
|
||||
export AUTOMAKE_VERSION=1.16
|
||||
mkdir neovim/.deps
|
||||
cd neovim/.deps
|
||||
cmake -G Ninja ../third-party/
|
||||
cmake --build . --config RelWithDebInfo
|
||||
- build: |
|
||||
mkdir neovim/build
|
||||
cd neovim/build
|
||||
cmake -G Ninja $CMAKE_EXTRA_FLAGS ..
|
||||
cmake --build . --config RelWithDebInfo
|
||||
./bin/nvim --version
|
||||
- functionaltest: |
|
||||
cd neovim/build
|
||||
cmake --build . --config RelWithDebInfo --target functionaltest
|
||||
- oldtest: |
|
||||
cd neovim
|
||||
gmake oldtest
|
27
.cirrus.yml
27
.cirrus.yml
@ -1,27 +0,0 @@
|
||||
env:
|
||||
CIRRUS_CLONE_DEPTH: '2'
|
||||
LANG: en_US.UTF-8
|
||||
|
||||
freebsd_task:
|
||||
name: FreeBSD
|
||||
only_if: $BRANCH != "master"
|
||||
freebsd_instance:
|
||||
image_family: freebsd-14-0
|
||||
timeout_in: 30m
|
||||
install_script:
|
||||
- pkg install -y cmake gmake ninja unzip wget gettext python git
|
||||
build_deps_script:
|
||||
- gmake deps
|
||||
build_script:
|
||||
- gmake CMAKE_EXTRA_FLAGS="-DCI_BUILD=ON" nvim
|
||||
workaround_script:
|
||||
# Run tests as user "cirrus" instead of root. This is required for the
|
||||
# permission-related tests to work correctly.
|
||||
- pw useradd cirrus -m
|
||||
- chown -R cirrus:cirrus .
|
||||
functionaltest_script:
|
||||
- sudo -u cirrus gmake functionaltest
|
||||
unittest_script:
|
||||
- sudo -u cirrus gmake unittest
|
||||
oldtest_script:
|
||||
- sudo -u cirrus gmake oldtest
|
@ -2,10 +2,10 @@ BasedOnStyle: Google
|
||||
Language: Cpp
|
||||
ColumnLimit: 100
|
||||
IndentWidth: 2
|
||||
TabWidth: 8
|
||||
TabWidth: 2
|
||||
UseTab: Never
|
||||
IndentCaseLabels: false
|
||||
BreakBeforeBraces: Custom
|
||||
IndentCaseLabels: true
|
||||
BreakBeforeBraces: Linux
|
||||
AlignEscapedNewlinesLeft: false
|
||||
AllowShortFunctionsOnASingleLine: false
|
||||
AlignTrailingComments: true
|
||||
@ -14,54 +14,7 @@ PenaltyReturnTypeOnItsOwnLine: 200
|
||||
AllowAllParametersOfDeclarationOnNextLine: false
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
BinPackParameters: true
|
||||
BinPackParameters: false
|
||||
BreakBeforeBinaryOperators: true
|
||||
BreakBeforeTernaryOperators: true
|
||||
ContinuationIndentWidth: 2
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
AlwaysBreakAfterReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: No
|
||||
AlwaysBreakTemplateDeclarations: No
|
||||
AlignEscapedNewlines: DontAlign
|
||||
BinPackArguments: true
|
||||
BraceWrapping:
|
||||
AfterClass: false
|
||||
AfterControlStatement: false
|
||||
AfterEnum: false
|
||||
AfterFunction: true
|
||||
AfterObjCDeclaration: false
|
||||
AfterStruct: false
|
||||
AfterUnion: false
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
IndentBraces: false
|
||||
PointerAlignment: Right
|
||||
SortIncludes: true
|
||||
Cpp11BracedListStyle: false
|
||||
IncludeCategories:
|
||||
- Regex: '<[/[:alnum:].]+>'
|
||||
Priority: 0
|
||||
- Regex: '^"(nvim|vim)/'
|
||||
Priority: 1
|
||||
SortPriority: 1
|
||||
CaseSensitive: false
|
||||
AlignConsecutiveMacros: AcrossEmptyLines
|
||||
IndentPPDirectives: AfterHash
|
||||
SpaceBeforeParens: ControlStatementsExceptControlMacros
|
||||
PPIndentWidth: 1
|
||||
ForEachMacros:
|
||||
- FOR_ALL_AUEVENTS
|
||||
- FOR_ALL_AUPATS_IN_EVENT
|
||||
- FOR_ALL_BUFFERS
|
||||
- FOR_ALL_BUFFERS_BACKWARDS
|
||||
- FOR_ALL_FRAMES
|
||||
- FOR_ALL_QFL_ITEMS
|
||||
- FOR_ALL_SIGNS_IN_BUF
|
||||
- FOR_ALL_TABS
|
||||
- FOR_ALL_TAB_WINDOWS
|
||||
- FOR_ALL_WINDOWS_IN_TAB
|
||||
- RBUFFER_EACH
|
||||
- RBUFFER_EACH_REVERSE
|
||||
- RBUFFER_UNTIL_EMPTY
|
||||
- RBUFFER_UNTIL_FULL
|
||||
- kl_iter
|
||||
ContinuationIndentWidth: 4
|
||||
|
76
.clang-tidy
76
.clang-tidy
@ -1,76 +0,0 @@
|
||||
WarningsAsErrors: '*,-clang-diagnostic-unused-function'
|
||||
Checks: >
|
||||
Enable all warnings by default. This ensures we don't miss new and useful
|
||||
warnings when a new version of clang-tidy is dropped.
|
||||
|
||||
IMPORTANT
|
||||
clang-tidy doesn't support comments but we can simulate comments by just
|
||||
writing text directly here. These are then interpreted as warnings and will
|
||||
be dropped. As long as you start every sentence with a capital letter and
|
||||
don't use commas in your "comments" you should be fine,
|
||||
*,
|
||||
|
||||
Untriaged warnings. Please categorize them accordingly if you find a relevant
|
||||
section for it,
|
||||
-bugprone-assignment-in-if-condition,
|
||||
-bugprone-implicit-widening-of-multiplication-result,
|
||||
-bugprone-multi-level-implicit-pointer-conversion,
|
||||
-bugprone-not-null-terminated-result,
|
||||
-bugprone-suspicious-memory-comparison,
|
||||
-bugprone-switch-missing-default-case,
|
||||
-cert-env33-c,
|
||||
-cert-err33-c,
|
||||
-cert-err34-c,
|
||||
-concurrency-mt-unsafe,
|
||||
-cppcoreguidelines-narrowing-conversions,
|
||||
|
||||
Warnings that may be useful, but are too inconsistent to enable by default
|
||||
May yield useful results with some manual triaging,
|
||||
-bugprone-branch-clone,
|
||||
-bugprone-macro-parentheses,
|
||||
-bugprone-sizeof-expression,
|
||||
-hicpp-multiway-paths-covered,
|
||||
-hicpp-signed-bitwise,
|
||||
-misc-unused-parameters,
|
||||
-modernize-macro-to-enum,
|
||||
-readability-avoid-nested-conditional-operator,
|
||||
-readability-else-after-return,
|
||||
-readability-function-size,
|
||||
-readability-isolate-declaration,
|
||||
|
||||
Warnings that are rarely useful,
|
||||
-altera-*, Checks related to OpenCL programming for FPGAs. Not relevant,
|
||||
-android-*,
|
||||
-bugprone-easily-swappable-parameters,
|
||||
-bugprone-inc-dec-in-conditions,
|
||||
-bugprone-swapped-arguments,
|
||||
-clang-analyzer-*, Already covered by the cmake target "clang-analyzer",
|
||||
-cppcoreguidelines-avoid-non-const-global-variables,
|
||||
-cppcoreguidelines-init-variables,
|
||||
-llvm-header-guard, We use #pragma once,
|
||||
-llvmlibc-restrict-system-libc-headers, We want to use glibc,
|
||||
-misc-include-cleaner, Looks useful but redundant with IWYU. We may replace IWYU with this one day,
|
||||
-misc-misplaced-const,
|
||||
-misc-no-recursion,
|
||||
-performance-no-int-to-ptr,
|
||||
-readability-function-cognitive-complexity,
|
||||
-readability-identifier-length,
|
||||
-readability-magic-numbers,
|
||||
-readability-redundant-declaration, Conflicts with our header generation scripts,
|
||||
-readability-suspicious-call-argument,
|
||||
|
||||
Aliases. These are just duplicates of other warnings and should always be ignored,
|
||||
-bugprone-narrowing-conversions,
|
||||
-cert-dcl37-c,
|
||||
-cert-dcl51-cpp,
|
||||
-cert-exp42-c,
|
||||
-cert-flp37-c,
|
||||
-cert-msc24-c,
|
||||
-cert-msc33-c,
|
||||
-cppcoreguidelines-avoid-magic-numbers,
|
||||
-cppcoreguidelines-macro-to-enum,
|
||||
-google-readability-braces-around-statements,
|
||||
-google-readability-function-size,
|
||||
-hicpp-braces-around-statements,
|
||||
-hicpp-function-size,
|
||||
-llvm-else-after-return,
|
2
.clangd
2
.clangd
@ -1,4 +1,2 @@
|
||||
CompileFlags:
|
||||
CompilationDatabase: build/ # Search build/ directory for compile_commands.json
|
||||
Diagnostics:
|
||||
UnusedIncludes: None
|
||||
|
@ -6,12 +6,7 @@ indent_size = 2
|
||||
tab_width = 8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
|
||||
[*.{c,h,in,lua}]
|
||||
max_line_length = 100
|
||||
|
||||
[*.py]
|
||||
indent_size = 4
|
||||
charset = utf-8
|
||||
|
||||
[{Makefile,**/Makefile,runtime/doc/*.txt}]
|
||||
indent_style = tab
|
||||
|
@ -36,51 +36,3 @@ d90fb1c0bfc1e64c783c385a79e7de87013dadba
|
||||
9c268263b1792d00b3ffdfd7495af2575862656e
|
||||
8c74c895b300bcee5fa937a2329d1d4756567b42
|
||||
40be47e0faef7aa015eb4ba44ceb1ee1a03e97cf
|
||||
4472c56d54f447040f6e8610b261b7efa0d04eb6
|
||||
a68faed02dc8e37b8f10da14dc02e33e6ed93947
|
||||
725cbe7d414f609e769081276f2a034e32a4337b
|
||||
7e3bdc75e44b9139d8afaea4381b53ae78b15746
|
||||
4ba12b3dda34472c193c9fa8ffd7d3bd5b6c04d6
|
||||
849f104c2789c884428fd45501912c6591a78e12
|
||||
38dd53c525054daf83dba27d7d46e90e8b41fa50
|
||||
6059784770c4c88fb6fe528b9f7634192fa1164e
|
||||
ee031eb5256bb83e0d6add2bae6fd943a4186ffe
|
||||
69e11b58b4db0952f11a5ff85aa7150b5f5b8db8
|
||||
271bb32855853b011fceaf0ad2f829bce66b2a19
|
||||
aefdc6783cb77f09786542c90901a9e7120bea42
|
||||
aa4f9c5341f5280f16cce0630ea54b84eef717b3
|
||||
0adc66171a355a12494d87ebb767d509540c7ef9
|
||||
93f24403f8cc760ff47979c596976b53a8b16358
|
||||
1ffd527c837fb2465c9659273bbe5447a1352db2
|
||||
2498e9feb025361576603a0101c86393d211e31e
|
||||
0b3ae64480ea28bb57783c2269a61f0a60ffc55e
|
||||
0fc8597f011e0927e529abd11bf0ddd8d0d1eaab
|
||||
6ff245732a5a8ab821598a38fb0c5805e6bd3779
|
||||
abf758a2977c4e6cab4dfa217f56da853d85851c
|
||||
cb84f5ee530f0f32b92bed5b4ad41344e8b551aa
|
||||
f98b8d2d44d289263b1a3b33b6a7f20644ef671c
|
||||
544ef994df72c3cbe0dca6b856ce2dcbc5169767
|
||||
45fe4d11add933df76a2ea4bf52ce8904f4a778b
|
||||
517f0cc634b985057da5b95cf4ad659ee456a77e
|
||||
04f2f864e270e772c6326cefdf24947f0130e492
|
||||
|
||||
# typos
|
||||
d238b8f6003d34cae7f65ff7585b48a2cd9449fb
|
||||
4547137aaff32b20172870a549d3a28a3c7adf1c
|
||||
08616571f47cc367a5fe59b52295708b9fda3b09
|
||||
09c6ce8c4e4c6415cca9b834539ed0df461373f6
|
||||
0b0c4f7dfa4a9a564cbf44262d4bea9bdefe2dc9
|
||||
4a96e7809f4d9f6ce21869817eb95ff6dcaa1693
|
||||
61205c1defb64ac5466496b5451e4a7f3171e21e
|
||||
64116d78502e0ca611e13adf9323ef2d3fe708c2
|
||||
abc087f4c65ca547cae58518b42aee82ff4a07f6
|
||||
b8dcbcc732baf84fc48d6b272c3ade0bcb129b3b
|
||||
c815aadfccd6bada47ecfb09fe188ee7f7c5caf3
|
||||
caa6992a1071a2ac373bec21085685da4a1790d6
|
||||
df646572c53f55268a5dbb61628d7c3b302d5663
|
||||
e63e5d1dbd3dd4711efa0ecf9e844ff308b370a6
|
||||
eb123b565e201418dd135d2602dc20eea3cead39
|
||||
ff20d40321399fa187bd350f9619cf6418d7eb6e
|
||||
|
||||
# generated docs
|
||||
ea333badd24f691c753d8048f911d1db349bc2cd
|
||||
|
24
.gitattributes
vendored
24
.gitattributes
vendored
@ -1,18 +1,6 @@
|
||||
*.h.in linguist-language=C
|
||||
*.c.in linguist-language=C
|
||||
*CMakeLists.txt linguist-language=CMake
|
||||
|
||||
runtime/doc/* linguist-documentation
|
||||
runtime/doc/builtin.txt linguist-generated
|
||||
|
||||
runtime/lua/vim/_meta/vimfn.lua linguist-generated
|
||||
runtime/lua/vim/_meta/vvars.lua linguist-generated
|
||||
runtime/lua/vim/_meta/api.lua linguist-generated
|
||||
runtime/lua/vim/_meta/api_keysets.lua linguist-generated
|
||||
runtime/lua/vim/_meta/options.lua linguist-generated
|
||||
|
||||
src/xdiff/** linguist-vendored
|
||||
src/cjson/** linguist-vendored
|
||||
src/unicode/** linguist-vendored
|
||||
|
||||
.github/ export-ignore
|
||||
*.h linguist-language=C
|
||||
src/nvim/testdir/test42.in diff
|
||||
.github/ export-ignore
|
||||
.travis.yml export-ignore
|
||||
codecov.yml export-ignore
|
||||
.builds/ export-ignore
|
||||
|
61
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
61
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -6,40 +6,7 @@ body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
*Before reporting:*
|
||||
- Confirm the problem is reproducible on [**master**](https://github.com/neovim/neovim/releases/nightly) or [**latest stable**](https://github.com/neovim/neovim/releases/stable) release
|
||||
- Run `make distclean` when encountering build issues
|
||||
- Search [existing issues](https://github.com/neovim/neovim/issues?q=is%3Aissue+is%3Aopen+label%3Abug,bug-crash) (including [closed](https://github.com/neovim/neovim/issues?q=is%3Aissue+is%3Aclosed+label%3Abug%2Cbug-crash))
|
||||
- Read the [FAQ](https://neovim.io/doc/user/faq.html) and ["Reporting Problems" in CONTRIBUTING.md](https://github.com/neovim/neovim/blob/master/CONTRIBUTING.md#reporting-problems).
|
||||
|
||||
Usage or "How to" questions belong on [stackoverflow](https://vi.stackexchange.com/) and will be closed.
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Problem"
|
||||
description: "Describe the current behavior. May include logs, images, or videos."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Steps to reproduce"
|
||||
description: |
|
||||
- For build failures: list the exact steps including CMake flags (if any).
|
||||
- If the bug pertains to crashing (or segfault), please include a [stacktrace](https://neovim.io/doc/user/dev_tools.html#dev-tools-backtrace).
|
||||
- For startup or shell-related problems: try `env -i TERM=ansi-256color "$(which nvim)"`.
|
||||
- Use the provided [minimal reproduction template](https://github.com/neovim/neovim/blob/master/contrib/minimal.lua) to create a minimal configuration. After you fill it out with necessary information, run with `nvim --clean -u minimal.lua`.
|
||||
- Please do **not** include a package manager in the reproduction steps.
|
||||
placeholder: |
|
||||
nvim --clean
|
||||
:edit foo
|
||||
yiwp
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Expected behavior"
|
||||
description: "Describe the behavior you expect."
|
||||
validations:
|
||||
required: true
|
||||
_Before reporting:_ search [existing issues](https://github.com/neovim/neovim/issues?q=is%3Aissue+is%3Aopen+label%3Abug) and check the [FAQ](https://github.com/neovim/neovim/wiki/FAQ). Usage questions such as "How do I...?" belong on the [Neovim Discourse](https://neovim.discourse.group/c/7-category/7) and will be closed.
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
@ -80,3 +47,29 @@ body:
|
||||
placeholder: "Arch User Repository (AUR)"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "How to reproduce the issue"
|
||||
description: |
|
||||
- Steps to reproduce using `nvim --clean` ("factory defaults").
|
||||
- For build failures: list the exact steps including CMake flags (if any).
|
||||
- For shell-related problems: try `env -i TERM=ansi-256color "$(which nvim)"`.
|
||||
placeholder: |
|
||||
nvim --clean
|
||||
:edit foo
|
||||
yiwp
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Expected behavior"
|
||||
description: "Describe the behavior you expect. May include logs, images, or videos."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Actual behavior"
|
||||
validations:
|
||||
required: true
|
||||
|
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -1,5 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Question
|
||||
url: https://vi.stackexchange.com/
|
||||
url: https://neovim.discourse.group/
|
||||
about: Ask questions about configuration and usage of Neovim
|
||||
|
19
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
19
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@ -6,19 +6,16 @@ body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Before requesting: search [existing feature requests](https://github.com/neovim/neovim/labels/enhancement) and check the [FAQ](https://neovim.io/doc/user/faq.html).
|
||||
Before requesting: search [existing issues](https://github.com/neovim/neovim/labels/enhancement) and check the [FAQ](https://github.com/neovim/neovim/wiki/FAQ).
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: "Feature already in Vim?"
|
||||
description: "Does the feature already exist in Vim? If possible, specify which version (or commit) that introduced it."
|
||||
placeholder: "Yes, Vim 7.3.432"
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Problem"
|
||||
description: "Describe the problem to be solved. Include references to other projects (Vim, Emacs, etc.) if relevant."
|
||||
placeholder: "No smurf icons available. Smurfs are useful because ..."
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Expected behavior"
|
||||
description: "Describe what the new feature or behavior would look like. How does it solve the problem? Is it worth the cost?"
|
||||
label: "Feature description"
|
||||
validations:
|
||||
required: true
|
||||
|
75
.github/ISSUE_TEMPLATE/lsp_bug_report.yml
vendored
75
.github/ISSUE_TEMPLATE/lsp_bug_report.yml
vendored
@ -6,56 +6,7 @@ body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
_Before reporting:_ search [existing issues](https://github.com/neovim/neovim/issues?q=is%3Aissue+is%3Aopen+label%3Abug) and check the [FAQ](https://neovim.io/doc/user/faq.html). Usage questions or "Why isn't X language server/feature working?" belong on [stackoverflow](https://vi.stackexchange.com/) and will be closed.
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Problem"
|
||||
description: "Describe the bug caused by the Nvim LSP client."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 'Steps to reproduce using "nvim -u minimal_init.lua"'
|
||||
description: |
|
||||
- Create a minimal_init.lua using vim.lsp.start:
|
||||
|
||||
```lua
|
||||
--- CHANGE THESE
|
||||
local pattern = 'the-filetype'
|
||||
local cmd = {'name-of-language-server-executable'}
|
||||
-- Add files/folders here that indicate the root of a project
|
||||
local root_markers = {'.git', '.editorconfig'}
|
||||
-- Change to table with settings if required
|
||||
local settings = vim.empty_dict()
|
||||
|
||||
vim.api.nvim_create_autocmd('FileType', {
|
||||
pattern = pattern,
|
||||
callback = function(args)
|
||||
local match = vim.fs.find(root_markers, { path = args.file, upward = true })[1]
|
||||
local root_dir = match and vim.fn.fnamemodify(match, ':p:h') or nil
|
||||
vim.lsp.start({
|
||||
name = 'bugged-ls',
|
||||
cmd = cmd,
|
||||
root_dir = root_dir,
|
||||
settings = settings
|
||||
})
|
||||
end
|
||||
})
|
||||
```
|
||||
|
||||
See `:h lsp-quickstart` and `:h vim.lsp.start` for more information
|
||||
|
||||
- Provide a short code example and describe the folder layout
|
||||
- Describe how to trigger the issue. E.g. using `:lua vim.lsp.buf.*` commands
|
||||
|
||||
_Note_: if the issue is with an autocompletion or other LSP plugin, report to that plugin's issue tracker.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Expected behavior"
|
||||
description: "Describe the behavior you expect. May include logs, images, or videos."
|
||||
_Before reporting:_ search [existing issues](https://github.com/neovim/neovim/issues?q=is%3Aissue+is%3Aopen+label%3Abug) and check the [FAQ](https://github.com/neovim/neovim/wiki/FAQ). Usage questions such as "How do I...?" or "Why isn't X language server/feature working?" belong on the [Neovim Discourse](https://neovim.discourse.group/c/7-category/7) and will be closed.
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
@ -76,6 +27,30 @@ body:
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: ':checkhealth'
|
||||
description: |
|
||||
Paste the results from `nvim -c ":checkhealth nvim lspconfig"`
|
||||
render: markdown
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 'Steps to reproduce using "nvim -u minimal_init.lua"'
|
||||
description: |
|
||||
- Download the minimal config with `curl -LO https://raw.githubusercontent.com/neovim/nvim-lspconfig/master/test/minimal_init.lua` and modify it to include any specific commands or servers pertaining to your issues.
|
||||
- _Note_: if the issue is with an autocompletion or other LSP plugin, report to that plugin's issue tracker.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Expected behavior"
|
||||
description: "Describe the behavior you expect. May include logs, images, or videos."
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Actual behavior"
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: "Log file"
|
||||
|
2
.github/SECURITY.md
vendored
2
.github/SECURITY.md
vendored
@ -1,2 +0,0 @@
|
||||
To report a security vulnerability to Neovim, use
|
||||
https://github.com/neovim/neovim/security/advisories/new
|
33
.github/actions/cache/action.yml
vendored
33
.github/actions/cache/action.yml
vendored
@ -1,33 +0,0 @@
|
||||
name: 'Cache'
|
||||
description: "This action caches neovim dependencies"
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- run: echo "CACHE_KEY=${{ github.workflow }}" >> $GITHUB_ENV
|
||||
shell: bash
|
||||
|
||||
- run: echo "CACHE_KEY=${{ github.job }}" >> $GITHUB_ENV
|
||||
shell: bash
|
||||
|
||||
- if: ${{ matrix }}
|
||||
run: echo "CACHE_KEY=$CACHE_KEY-${{ join(matrix.*, '-') }}" >> $GITHUB_ENV
|
||||
shell: bash
|
||||
|
||||
- if: ${{ matrix.build }}
|
||||
run: echo "CACHE_KEY=$CACHE_KEY-${{ join(matrix.build.*, '-') }}" >> $GITHUB_ENV
|
||||
shell: bash
|
||||
|
||||
- id: image
|
||||
run: echo "version=$ImageVersion" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
|
||||
# Avoid using '**/CMakeLists.txt' (or any pattern starting with '**/') even
|
||||
# if it makes the expression below simpler. hashFiles() has a timer that
|
||||
# will fail the job if it times out, which can happen if there are too many
|
||||
# files to search through.
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: .deps
|
||||
key: ${{ env.CACHE_KEY }}-${{ steps.image.outputs.version }}-${{ hashFiles('cmake**',
|
||||
'.github/**', 'CMakeLists.txt',
|
||||
'runtime/CMakeLists.txt', 'src/nvim/**/CMakeLists.txt') }}
|
29
.github/actions/setup/action.yml
vendored
29
.github/actions/setup/action.yml
vendored
@ -1,29 +0,0 @@
|
||||
name: 'setup'
|
||||
description: "Creates necessary setup for CI"
|
||||
inputs:
|
||||
install_flags:
|
||||
description: 'Install script flags'
|
||||
required: false
|
||||
default: ''
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Set $BIN_DIR
|
||||
shell: bash
|
||||
run: echo "$BIN_DIR" >> $GITHUB_PATH
|
||||
|
||||
- if: ${{ runner.os != 'Windows' }}
|
||||
name: Set ulimit
|
||||
shell: bash
|
||||
run: ulimit -c unlimited
|
||||
|
||||
- if: ${{ runner.os == 'Windows' }}
|
||||
run: .github/scripts/env.ps1
|
||||
shell: pwsh
|
||||
|
||||
- name: Install dependencies
|
||||
run: ./.github/scripts/install_deps.sh ${{ inputs.install_flags }}
|
||||
shell: bash
|
||||
|
||||
- name: Cache
|
||||
uses: ./.github/actions/cache
|
8
.github/dependabot.yml
vendored
8
.github/dependabot.yml
vendored
@ -1,8 +0,0 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
commit-message:
|
||||
prefix: "ci"
|
61
.github/labeler.yml
vendored
Normal file
61
.github/labeler.yml
vendored
Normal file
@ -0,0 +1,61 @@
|
||||
"lsp":
|
||||
- runtime/lua/vim/lsp.lua
|
||||
- runtime/lua/vim/lsp/*
|
||||
|
||||
"lua":
|
||||
- runtime/lua/**/*
|
||||
- src/nvim/lua/*
|
||||
|
||||
"tui":
|
||||
- src/nvim/tui/tui.*
|
||||
|
||||
"treesitter":
|
||||
- src/nvim/lua/treesitter.*
|
||||
- runtime/lua/vim/treesitter.lua
|
||||
- runtime/lua/vim/treesitter/*
|
||||
|
||||
"diagnostic":
|
||||
- runtime/lua/vim/diagnostic.lua
|
||||
|
||||
"dependencies":
|
||||
- third-party/**/*
|
||||
|
||||
"spell":
|
||||
- src/nvim/spell*
|
||||
|
||||
"terminal":
|
||||
- src/nvim/terminal.*
|
||||
|
||||
"column":
|
||||
- src/nvim/mark.h
|
||||
- src/nvim/mark.c
|
||||
- src/nvim/sign*
|
||||
|
||||
"folds":
|
||||
- src/nvim/fold*
|
||||
|
||||
"mouse":
|
||||
- src/nvim/mouse*
|
||||
|
||||
"documentation":
|
||||
- all: ["runtime/doc/*"]
|
||||
|
||||
"clipboard":
|
||||
- runtime/autoload/provider/clipboard.vim
|
||||
|
||||
"diff":
|
||||
- src/nvim/diff.*
|
||||
|
||||
"build":
|
||||
- CMakeLists.txt
|
||||
- "**/CMakeLists.txt"
|
||||
- "**/*.cmake"
|
||||
|
||||
"tests":
|
||||
- all: ["test/**/*"]
|
||||
|
||||
"ci":
|
||||
- .github/labeler.yml
|
||||
- .github/workflows/**/*
|
||||
- .builds/*
|
||||
- ci/**/*
|
56
.github/scripts/close_unresponsive.js
vendored
56
.github/scripts/close_unresponsive.js
vendored
@ -1,56 +0,0 @@
|
||||
function labeledEvent(data) {
|
||||
return data.event === "labeled" && data.label.name === "needs:response";
|
||||
}
|
||||
|
||||
const numberOfDaysLimit = 30;
|
||||
const close_message = `This has been closed since a request for information has \
|
||||
not been answered for ${numberOfDaysLimit} days. It can be reopened when the \
|
||||
requested information is provided.`;
|
||||
|
||||
module.exports = async ({ github, context }) => {
|
||||
const owner = context.repo.owner;
|
||||
const repo = context.repo.repo;
|
||||
|
||||
const issues = await github.rest.issues.listForRepo({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
labels: "needs:response",
|
||||
});
|
||||
const numbers = issues.data.map((e) => e.number);
|
||||
|
||||
for (const number of numbers) {
|
||||
const events = await github.paginate(
|
||||
github.rest.issues.listEventsForTimeline,
|
||||
{
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: number,
|
||||
},
|
||||
(response) => response.data.filter(labeledEvent),
|
||||
);
|
||||
|
||||
const latest_response_label = events[events.length - 1];
|
||||
|
||||
const created_at = new Date(latest_response_label.created_at);
|
||||
const now = new Date();
|
||||
const diff = now - created_at;
|
||||
const diffDays = diff / (1000 * 60 * 60 * 24);
|
||||
|
||||
if (diffDays > numberOfDaysLimit) {
|
||||
github.rest.issues.update({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: number,
|
||||
state_reason: "not_planned",
|
||||
state: "closed",
|
||||
});
|
||||
|
||||
github.rest.issues.createComment({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
issue_number: number,
|
||||
body: close_message,
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
9
.github/scripts/env.ps1
vendored
9
.github/scripts/env.ps1
vendored
@ -1,9 +0,0 @@
|
||||
# This script enables Developer Command Prompt
|
||||
# See https://github.com/microsoft/vswhere/wiki/Start-Developer-Command-Prompt#using-powershell
|
||||
$installationPath = vswhere.exe -latest -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
|
||||
if ($installationPath -and (Test-Path "$installationPath\Common7\Tools\vsdevcmd.bat")) {
|
||||
& "${env:COMSPEC}" /s /c "`"$installationPath\Common7\Tools\vsdevcmd.bat`" -arch=x64 -no_logo && set" | ForEach-Object {
|
||||
$name, $value = $_ -split '=', 2
|
||||
"$name=$value" >> $env:GITHUB_ENV
|
||||
}
|
||||
}
|
47
.github/scripts/install_deps.sh
vendored
47
.github/scripts/install_deps.sh
vendored
@ -1,47 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
while (($# > 0)); do
|
||||
case $1 in
|
||||
--test) # install test dependencies
|
||||
TEST=1
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
os=$(uname -s)
|
||||
if [[ $os == Linux ]]; then
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y build-essential cmake curl gettext ninja-build
|
||||
|
||||
if [[ $CC == clang ]]; then
|
||||
DEFAULT_CLANG_VERSION=$(echo | clang -dM -E - | grep __clang_major | awk '{print $3}')
|
||||
CLANG_VERSION=18
|
||||
if ((DEFAULT_CLANG_VERSION >= CLANG_VERSION)); then
|
||||
echo "Default clang version is $DEFAULT_CLANG_VERSION, which equal or larger than wanted version $CLANG_VERSION. Aborting!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
wget https://apt.llvm.org/llvm.sh
|
||||
chmod +x llvm.sh
|
||||
sudo ./llvm.sh $CLANG_VERSION
|
||||
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-$CLANG_VERSION 100
|
||||
sudo update-alternatives --set clang /usr/bin/clang-$CLANG_VERSION
|
||||
fi
|
||||
|
||||
if [[ -n $TEST ]]; then
|
||||
sudo apt-get install -y locales-all cpanminus attr libattr1-dev gdb fswatch
|
||||
|
||||
# Use default CC to avoid compilation problems when installing Python modules
|
||||
CC=cc python3 -m pip -q install --user --upgrade pynvim
|
||||
fi
|
||||
elif [[ $os == Darwin ]]; then
|
||||
brew update --quiet
|
||||
brew install ninja
|
||||
if [[ -n $TEST ]]; then
|
||||
brew install cpanminus fswatch
|
||||
|
||||
# Use default CC to avoid compilation problems when installing Python modules
|
||||
CC=cc python3 -m pip -q install --user --upgrade --break-system-packages pynvim
|
||||
fi
|
||||
fi
|
91
.github/scripts/labeler_configuration.yml
vendored
91
.github/scripts/labeler_configuration.yml
vendored
@ -1,91 +0,0 @@
|
||||
build:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ CMakeLists.txt, "**/CMakeLists.txt", "**/Makefile", "**/*.cmake", cmake.deps/**/* ]
|
||||
|
||||
checkhealth:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ "**/health.lua" ]
|
||||
|
||||
ci:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ .github/actions/**, .github/workflows/**, .github/scripts/** ]
|
||||
|
||||
clipboard:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ runtime/autoload/provider/clipboard.vim ]
|
||||
|
||||
column:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ src/nvim/sign* ]
|
||||
|
||||
comment:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ runtime/lua/vim/_comment.lua ]
|
||||
|
||||
defaults:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ runtime/lua/vim/_defaults.lua ]
|
||||
|
||||
diagnostic:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ runtime/lua/vim/diagnostic.lua ]
|
||||
|
||||
diff:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ src/nvim/diff.* ]
|
||||
|
||||
documentation:
|
||||
- changed-files:
|
||||
- any-glob-to-all-files: [ runtime/doc/*, "**/*.md" ]
|
||||
|
||||
editorconfig:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ .editorconfig, runtime/lua/editorconfig.lua, runtime/plugin/editorconfig.lua ]
|
||||
|
||||
filetype:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ runtime/lua/vim/filetype.lua, runtime/lua/vim/filetype/detect.lua ]
|
||||
|
||||
filesystem:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ runtime/lua/vim/fs.lua ]
|
||||
|
||||
folds:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ src/nvim/fold* ]
|
||||
|
||||
lsp:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ runtime/lua/vim/lsp.lua, runtime/lua/vim/lsp/* ]
|
||||
|
||||
mouse:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ src/nvim/mouse* ]
|
||||
|
||||
netrw:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ runtime/autoload/netrw.vim, runtime/plugin/netrwPlugin.vim ]
|
||||
|
||||
snippet:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ runtime/lua/vim/snippet.lua ]
|
||||
|
||||
spell:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ src/nvim/spell* ]
|
||||
|
||||
terminal:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ src/nvim/terminal.* ]
|
||||
|
||||
test:
|
||||
- changed-files:
|
||||
- any-glob-to-all-files: [test/**/*]
|
||||
|
||||
treesitter:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ src/nvim/lua/treesitter.*, runtime/lua/vim/treesitter.lua, runtime/lua/vim/treesitter/*, runtime/queries/**/* ]
|
||||
|
||||
tui:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: [ src/nvim/tui/tui.* ]
|
19
.github/scripts/remove_response_label.js
vendored
19
.github/scripts/remove_response_label.js
vendored
@ -1,19 +0,0 @@
|
||||
module.exports = async ({ github, context }) => {
|
||||
const commenter = context.actor;
|
||||
const issue = await github.rest.issues.get({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
});
|
||||
const author = issue.data.user.login;
|
||||
const labels = issue.data.labels.map((e) => e.name);
|
||||
|
||||
if (author === commenter && labels.includes("needs:response")) {
|
||||
github.rest.issues.removeLabel({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
name: "needs:response",
|
||||
});
|
||||
}
|
||||
};
|
127
.github/scripts/reviewers_add.js
vendored
127
.github/scripts/reviewers_add.js
vendored
@ -1,127 +0,0 @@
|
||||
module.exports = async ({ github, context }) => {
|
||||
const pr_data = await github.rest.pulls.get({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: context.issue.number,
|
||||
});
|
||||
const labels = pr_data.data.labels.map((e) => e.name);
|
||||
const reviewers = new Set();
|
||||
|
||||
if (labels.includes("build")) {
|
||||
reviewers.add("dundargoc");
|
||||
reviewers.add("jamessan");
|
||||
reviewers.add("justinmk");
|
||||
}
|
||||
|
||||
if (labels.includes("ci")) {
|
||||
reviewers.add("dundargoc");
|
||||
reviewers.add("jamessan");
|
||||
reviewers.add("justinmk");
|
||||
}
|
||||
|
||||
if (labels.includes("column")) {
|
||||
reviewers.add("lewis6991");
|
||||
}
|
||||
|
||||
if (labels.includes("comment")) {
|
||||
reviewers.add("echasnovski");
|
||||
}
|
||||
|
||||
if (labels.includes("defaults")) {
|
||||
reviewers.add("gpanders");
|
||||
}
|
||||
|
||||
if (labels.includes("diagnostic")) {
|
||||
reviewers.add("gpanders");
|
||||
}
|
||||
|
||||
if (labels.includes("diff")) {
|
||||
reviewers.add("lewis6991");
|
||||
}
|
||||
|
||||
if (labels.includes("documentation")) {
|
||||
reviewers.add("clason");
|
||||
}
|
||||
|
||||
if (labels.includes("editorconfig")) {
|
||||
reviewers.add("gpanders");
|
||||
}
|
||||
|
||||
if (labels.includes("marks")) {
|
||||
reviewers.add("bfredl");
|
||||
}
|
||||
|
||||
if (labels.includes("filetype")) {
|
||||
reviewers.add("clason");
|
||||
reviewers.add("gpanders");
|
||||
}
|
||||
|
||||
if (labels.includes("inccommand")) {
|
||||
reviewers.add("famiu");
|
||||
}
|
||||
|
||||
if (labels.includes("lsp")) {
|
||||
reviewers.add("MariaSolOs");
|
||||
reviewers.add("mfussenegger");
|
||||
}
|
||||
|
||||
if (labels.includes("netrw")) {
|
||||
reviewers.add("justinmk");
|
||||
}
|
||||
|
||||
if (labels.includes("options")) {
|
||||
reviewers.add("famiu");
|
||||
}
|
||||
|
||||
if (labels.includes("platform:nix")) {
|
||||
reviewers.add("teto");
|
||||
}
|
||||
|
||||
if (labels.includes("project-management")) {
|
||||
reviewers.add("bfredl");
|
||||
reviewers.add("justinmk");
|
||||
}
|
||||
|
||||
if (labels.includes("snippet")) {
|
||||
reviewers.add("MariaSolOs");
|
||||
}
|
||||
|
||||
if (labels.includes("statusline")) {
|
||||
reviewers.add("famiu");
|
||||
}
|
||||
|
||||
if (labels.includes("test")) {
|
||||
reviewers.add("justinmk");
|
||||
}
|
||||
|
||||
if (labels.includes("treesitter")) {
|
||||
reviewers.add("bfredl");
|
||||
reviewers.add("clason");
|
||||
reviewers.add("lewis6991");
|
||||
reviewers.add("wookayin");
|
||||
}
|
||||
|
||||
if (labels.includes("tui")) {
|
||||
reviewers.add("gpanders");
|
||||
}
|
||||
|
||||
if (labels.includes("typo")) {
|
||||
reviewers.add("dundargoc");
|
||||
}
|
||||
|
||||
if (labels.includes("vim-patch")) {
|
||||
reviewers.add("seandewar");
|
||||
reviewers.add("zeertzjq");
|
||||
}
|
||||
|
||||
// Remove person that opened the PR since they can't review themselves
|
||||
const pr_opener = pr_data.data.user.login;
|
||||
reviewers.delete(pr_opener);
|
||||
|
||||
github.rest.pulls.requestReviewers({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: context.issue.number,
|
||||
reviewers: Array.from(reviewers),
|
||||
});
|
||||
};
|
16
.github/scripts/reviewers_remove.js
vendored
16
.github/scripts/reviewers_remove.js
vendored
@ -1,16 +0,0 @@
|
||||
module.exports = async ({ github, context }) => {
|
||||
const requestedReviewers = await github.rest.pulls.listRequestedReviewers({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: context.issue.number,
|
||||
});
|
||||
|
||||
const reviewers = requestedReviewers.data.users.map((e) => e.login);
|
||||
|
||||
github.rest.pulls.removeRequestedReviewers({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: context.issue.number,
|
||||
reviewers: reviewers,
|
||||
});
|
||||
};
|
53
.github/workflows/api-docs.yml
vendored
Normal file
53
.github/workflows/api-docs.yml
vendored
Normal file
@ -0,0 +1,53 @@
|
||||
name: Autogenerate API docs
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- 'src/nvim/api/*.[ch]'
|
||||
- 'src/nvim/**.lua'
|
||||
- 'runtime/lua/**.lua'
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-[0-9]+.[0-9]+'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
regen-api-docs:
|
||||
runs-on: ubuntu-20.04
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y python3 luajit
|
||||
conda install -c conda-forge doxygen=1.9.2 msgpack-python
|
||||
echo "$CONDA/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Setup git config
|
||||
run: |
|
||||
git config --global user.name 'marvim'
|
||||
git config --global user.email 'marvim@users.noreply.github.com'
|
||||
|
||||
- run: printf 'DOC_BRANCH=marvim/api-doc-update/%s\n' ${GITHUB_REF#refs/heads/} >> $GITHUB_ENV
|
||||
|
||||
- name: Generate docs
|
||||
id: docs
|
||||
run: |
|
||||
git checkout -b ${DOC_BRANCH}
|
||||
python3 scripts/gen_vimdoc.py
|
||||
printf '::set-output name=UPDATED_DOCS::%s\n' $([ -z "$(git diff)" ]; echo $?)
|
||||
|
||||
- name: Automatic PR
|
||||
if: ${{ steps.docs.outputs.UPDATED_DOCS != 0 }}
|
||||
run: |
|
||||
git add -u
|
||||
git commit -m 'docs: regenerate'
|
||||
git push --force https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY} ${DOC_BRANCH}
|
||||
gh pr create --fill --base ${GITHUB_REF#refs/heads/} --head ${DOC_BRANCH} || true
|
53
.github/workflows/backport.yml
vendored
53
.github/workflows/backport.yml
vendored
@ -1,46 +1,33 @@
|
||||
name: backport
|
||||
name: Backport
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [closed, labeled]
|
||||
issue_comment:
|
||||
types: [created]
|
||||
jobs:
|
||||
backport:
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
name: Backport Pull Request
|
||||
if: github.event.pull_request.merged
|
||||
if: >
|
||||
github.repository_owner == 'neovim' && (
|
||||
github.event_name == 'pull_request' &&
|
||||
github.event.pull_request.merged
|
||||
) || (
|
||||
github.event_name == 'issue_comment' &&
|
||||
github.event.issue.pull_request &&
|
||||
contains(github.event.comment.body, '/backport')
|
||||
)
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/create-github-app-token@v1
|
||||
id: app-token
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
app-id: ${{ vars.BACKPORT_APP }}
|
||||
private-key: ${{ secrets.BACKPORT_KEY }}
|
||||
|
||||
- name: Create backport PR
|
||||
id: backport
|
||||
uses: korthout/backport-action@v3
|
||||
# required to find all branches
|
||||
fetch-depth: 0
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Create backport PRs
|
||||
uses: zeebe-io/backport-action@v0.0.7
|
||||
with:
|
||||
pull_title: "${pull_title}"
|
||||
label_pattern: "^ci:backport ([^ ]+)$"
|
||||
github_token: ${{ steps.app-token.outputs.token }}
|
||||
|
||||
- name: Create failed backport label
|
||||
if: ${{ steps.backport.outputs.was_successful == 'false' }}
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
github.rest.issues.addLabels({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
labels: ['needs:backport']
|
||||
})
|
||||
|
||||
- name: Enable automerge
|
||||
if: ${{ steps.backport.outputs.was_successful == 'true' }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: gh pr merge --rebase --auto ${{ steps.backport.outputs.created_pull_numbers }}
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
github_workspace: ${{ github.workspace }}
|
||||
|
80
.github/workflows/build.yml
vendored
80
.github/workflows/build.yml
vendored
@ -1,80 +0,0 @@
|
||||
name: build
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-[0-9]+.[0-9]+'
|
||||
paths:
|
||||
- '**.cmake'
|
||||
- '**/CMakeLists.txt'
|
||||
- '**/CMakePresets.json'
|
||||
- 'cmake.*/**'
|
||||
- '.github/**'
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
env:
|
||||
BIN_DIR: ${{ github.workspace }}/bin
|
||||
INSTALL_PREFIX: ${{ github.workspace }}/nvim-install
|
||||
|
||||
jobs:
|
||||
old-cmake:
|
||||
name: Test oldest supported cmake
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
env:
|
||||
CMAKE_URL: 'https://cmake.org/files/v3.13/cmake-3.13.0-Linux-x86_64.sh'
|
||||
CMAKE_VERSION: '3.13.0'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
|
||||
- name: Install minimum required version of cmake
|
||||
run: |
|
||||
curl --retry 5 --silent --show-error --fail -o /tmp/cmake-installer.sh "$CMAKE_URL"
|
||||
mkdir -p "$BIN_DIR" /opt/cmake-custom
|
||||
chmod a+x /tmp/cmake-installer.sh
|
||||
/tmp/cmake-installer.sh --prefix=/opt/cmake-custom --skip-license
|
||||
ln -sfn /opt/cmake-custom/bin/cmake "$BIN_DIR/cmake"
|
||||
cmake_version="$(cmake --version | head -1)"
|
||||
echo "$cmake_version" | grep -qF "cmake version $CMAKE_VERSION" || {
|
||||
echo "Unexpected CMake version: $cmake_version"
|
||||
exit 1
|
||||
}
|
||||
|
||||
- name: Build dependencies
|
||||
run: make deps
|
||||
|
||||
- name: Build
|
||||
run: make CMAKE_FLAGS="-D CI_BUILD=ON -D CMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX"
|
||||
|
||||
- name: Install
|
||||
run: make install
|
||||
|
||||
use-existing-src:
|
||||
name: Test USE_EXISTING_SRC_DIR=ON builds with no network access
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
|
||||
- name: Build bundled dependencies
|
||||
run: make deps
|
||||
|
||||
- name: Clean bundled dependencies à la neovim/deps
|
||||
run: |
|
||||
rm -rf ./build
|
||||
find .deps .deps/build -maxdepth 1 '!' \( -name .deps -o -name build -o -name src \) -exec rm -r '{}' +
|
||||
cd .deps/build/src
|
||||
rm -rf ./*-build
|
||||
rm -rf ./*-stamp/*-{configure,build,install,done}
|
||||
for d in *; do (cd "$d"; rm -rf ./autom4te.cache; make clean || true; make distclean || true); done
|
||||
|
||||
- name: Re-build bundled dependencies with no network access
|
||||
run: unshare --map-root-user --net make deps DEPS_CMAKE_FLAGS=-DUSE_EXISTING_SRC_DIR=ON
|
||||
|
||||
- name: Build
|
||||
run: make CMAKE_FLAGS="-D CI_BUILD=ON"
|
33
.github/workflows/build_dummy.yml
vendored
33
.github/workflows/build_dummy.yml
vendored
@ -1,33 +0,0 @@
|
||||
name: build_dummy
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-[0-9]+.[0-9]+'
|
||||
# This needs to be an exact complement of `paths` in the build.yml workflow.
|
||||
# This is required to bypass required checks since a required job is always
|
||||
# needed to run.
|
||||
paths-ignore:
|
||||
- '**.cmake'
|
||||
- '**/CMakeLists.txt'
|
||||
- '**/CMakePresets.json'
|
||||
- 'cmake.*/**'
|
||||
- '.github/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
jobs:
|
||||
old-cmake:
|
||||
name: Test oldest supported cmake
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- run: echo "success"
|
||||
|
||||
use-existing-src:
|
||||
name: Test USE_EXISTING_SRC_DIR=ON builds with no network access
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "success"
|
185
.github/workflows/ci.yml
vendored
Normal file
185
.github/workflows/ci.yml
vendored
Normal file
@ -0,0 +1,185 @@
|
||||
name: CI
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-[0-9]+.[0-9]+'
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-[0-9]+.[0-9]+'
|
||||
|
||||
jobs:
|
||||
unixish:
|
||||
name: ${{ matrix.runner }} ${{ matrix.flavor }} (cc=${{ matrix.cc }})
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- flavor: asan
|
||||
cc: clang-12
|
||||
runner: ubuntu-20.04
|
||||
os: linux
|
||||
- flavor: lint
|
||||
cc: gcc
|
||||
runner: ubuntu-20.04
|
||||
os: linux
|
||||
- flavor: tsan
|
||||
cc: clang-12
|
||||
runner: ubuntu-20.04
|
||||
os: linux
|
||||
- cc: clang
|
||||
runner: macos-10.15
|
||||
os: osx
|
||||
- cc: clang
|
||||
runner: macos-11.0
|
||||
os: osx
|
||||
runs-on: ${{ matrix.runner }}
|
||||
timeout-minutes: 45
|
||||
if: github.event.pull_request.draft == false
|
||||
env:
|
||||
CC: ${{ matrix.cc }}
|
||||
CI_OS_NAME: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Setup common environment variables
|
||||
run: ./.github/workflows/env.sh ${{ matrix.flavor }}
|
||||
|
||||
- name: Install apt packages
|
||||
if: matrix.os == 'linux'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y autoconf automake build-essential ccache cmake cpanminus cscope gcc-multilib gdb gettext gperf language-pack-tr libtool-bin locales ninja-build pkg-config python3 python3-pip python3-setuptools unzip valgrind xclip
|
||||
|
||||
- name: Install new clang
|
||||
if: matrix.flavor == 'asan' || matrix.flavor == 'tsan'
|
||||
run: |
|
||||
wget https://apt.llvm.org/llvm.sh
|
||||
chmod a+x llvm.sh
|
||||
sudo ./llvm.sh 12
|
||||
rm llvm.sh
|
||||
|
||||
- name: Install brew packages
|
||||
if: matrix.os == 'osx'
|
||||
run: |
|
||||
# Workaround brew issues
|
||||
rm -f /usr/local/bin/2to3
|
||||
brew update >/dev/null
|
||||
brew upgrade
|
||||
brew install automake ccache perl cpanminus ninja
|
||||
|
||||
- name: Setup interpreter packages
|
||||
run: |
|
||||
./ci/before_install.sh
|
||||
./ci/install.sh
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: |
|
||||
${{ env.CACHE_NVIM_DEPS_DIR }}
|
||||
~/.ccache
|
||||
key: ${{ matrix.runner }}-${{ matrix.flavor }}-${{ matrix.cc }}-${{ hashFiles('cmake/*', 'third-party/**', '**/CMakeLists.txt') }}-${{ github.base_ref }}
|
||||
|
||||
- name: Build third-party
|
||||
run: ./ci/before_script.sh
|
||||
|
||||
- name: Build and test
|
||||
run: ./ci/script.sh
|
||||
|
||||
- name: Cache dependencies
|
||||
if: ${{ success() }}
|
||||
run: ./ci/before_cache.sh
|
||||
|
||||
windows:
|
||||
runs-on: windows-2016
|
||||
if: github.event.pull_request.draft == false
|
||||
env:
|
||||
DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }}
|
||||
DEPS_PREFIX: ${{ format('{0}/nvim-deps/usr', github.workspace) }}
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config: [ MINGW_64-gcov, MSVC_64 ]
|
||||
name: windows (${{ matrix.config }})
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- uses: actions/cache@v2
|
||||
with:
|
||||
path: ${{ env.DEPS_BUILD_DIR }}
|
||||
key: ${{ matrix.config }}-${{ hashFiles('third-party\**') }}
|
||||
|
||||
- name: Run CI
|
||||
run: powershell ci\build.ps1
|
||||
env:
|
||||
CONFIGURATION: ${{ matrix.config }}
|
||||
|
||||
functionaltest:
|
||||
name: ${{ matrix.runner }} ${{ matrix.flavor }} (cc=${{ matrix.cc }})
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- flavor: functionaltest-lua
|
||||
cc: gcc
|
||||
runner: ubuntu-20.04
|
||||
os: linux
|
||||
runs-on: ${{ matrix.runner }}
|
||||
timeout-minutes: 45
|
||||
env:
|
||||
CC: ${{ matrix.cc }}
|
||||
CI_OS_NAME: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Setup commom environment variables
|
||||
run: ./.github/workflows/env.sh ${{ matrix.flavor }}
|
||||
|
||||
- name: Install apt packages
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y autoconf automake build-essential ccache cmake cpanminus cscope gcc-multilib gdb gettext gperf language-pack-tr libtool-bin locales ninja-build pkg-config python3 python3-pip python3-setuptools unzip valgrind xclip
|
||||
|
||||
- name: Install minimum required version of cmake
|
||||
env:
|
||||
CMAKE_URL: 'https://cmake.org/files/v3.10/cmake-3.10.0-Linux-x86_64.sh'
|
||||
CMAKE_VERSION: '3.10.0'
|
||||
shell: bash
|
||||
run: |
|
||||
curl --retry 5 --silent --show-error --fail -o /tmp/cmake-installer.sh "$CMAKE_URL"
|
||||
mkdir -p "$HOME/.local/bin" /opt/cmake-custom
|
||||
chmod a+x /tmp/cmake-installer.sh
|
||||
/tmp/cmake-installer.sh --prefix=/opt/cmake-custom --skip-license
|
||||
ln -sfn /opt/cmake-custom/bin/cmake "$HOME/.local/bin/cmake"
|
||||
cmake_version="$(cmake --version | head -1)"
|
||||
echo "$cmake_version" | grep -qF "cmake version $CMAKE_VERSION" || {
|
||||
echo "Unexpected CMake version: $cmake_version"
|
||||
exit 1
|
||||
}
|
||||
|
||||
- name: Setup interpreter packages
|
||||
run: |
|
||||
./ci/before_install.sh
|
||||
./ci/install.sh
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: |
|
||||
${{ env.CACHE_NVIM_DEPS_DIR }}
|
||||
~/.ccache
|
||||
key: ${{ matrix.runner }}-${{ matrix.flavor }}-${{ matrix.cc }}-${{ hashFiles('cmake/*', 'third-party/**', '**/CMakeLists.txt') }}-${{ github.base_ref }}
|
||||
|
||||
- name: Build third-party
|
||||
run: ./ci/before_script.sh
|
||||
|
||||
- name: Build and test
|
||||
run: ./ci/script.sh
|
||||
|
||||
- name: Cache dependencies
|
||||
if: ${{ success() }}
|
||||
run: ./ci/before_cache.sh
|
36
.github/workflows/codeql.yml
vendored
36
.github/workflows/codeql.yml
vendored
@ -1,36 +0,0 @@
|
||||
name: "codeql"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ "master" ]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: cpp
|
||||
|
||||
- run: make
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
19
.github/workflows/commitlint.yml
vendored
Normal file
19
.github/workflows/commitlint.yml
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
name: "Commit Linter"
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
jobs:
|
||||
lint-commits:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.pull_request.draft == false
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2.3.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- uses: rhysd/action-setup-vim@v1
|
||||
with:
|
||||
neovim: true
|
||||
- run: nvim --clean -es +"lua require('scripts.lintcommit').main({trace=true})"
|
@ -1,15 +1,19 @@
|
||||
name: coverity
|
||||
name: Coverity
|
||||
on:
|
||||
schedule:
|
||||
- cron: '10 0 * * *' # Run every day at 00:10
|
||||
- cron: '0 10 * * 1' # Run every Monday at 00:10
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
scan:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-18.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y autoconf automake build-essential cmake gettext gperf libtool-bin locales ninja-build pkg-config unzip
|
||||
|
||||
- name: Download Coverity
|
||||
run: |
|
||||
@ -33,7 +37,7 @@ jobs:
|
||||
--form email=$EMAIL \
|
||||
--form file=@cov-scan.tgz \
|
||||
--form version="$(git rev-parse HEAD)" \
|
||||
--form description="Daily GHA scan" \
|
||||
--form description="Weekly GHA scan" \
|
||||
'https://scan.coverity.com/builds?project=neovim%2Fneovim'
|
||||
env:
|
||||
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
|
26
.github/workflows/docs.yml
vendored
26
.github/workflows/docs.yml
vendored
@ -1,26 +0,0 @@
|
||||
name: docs
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
jobs:
|
||||
docs:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.pull_request.draft == false
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
|
||||
- name: Generate docs
|
||||
run: |
|
||||
make doc
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
echo "::error::Job failed, run 'make doc' and commit your doc changes."
|
||||
echo "::error::The doc generation produces the following changes:"
|
||||
git diff --color --exit-code
|
||||
fi
|
||||
|
||||
- name: Validate docs
|
||||
run: make lintdoc
|
65
.github/workflows/env.sh
vendored
Executable file
65
.github/workflows/env.sh
vendored
Executable file
@ -0,0 +1,65 @@
|
||||
#!/bin/bash
|
||||
set -e -u
|
||||
|
||||
FLAVOR=${1:-}
|
||||
|
||||
cat <<EOF >> "$GITHUB_PATH"
|
||||
$HOME/.local/bin
|
||||
EOF
|
||||
|
||||
cat <<EOF >> "$GITHUB_ENV"
|
||||
CACHE_ENABLE=true
|
||||
CI_TARGET=tests
|
||||
CI_BUILD_DIR=$GITHUB_WORKSPACE
|
||||
BUILD_DIR=$GITHUB_WORKSPACE/build
|
||||
DEPS_BUILD_DIR=$HOME/nvim-deps
|
||||
INSTALL_PREFIX=$HOME/nvim-install
|
||||
LOG_DIR=$GITHUB_WORKSPACE/build/log
|
||||
NVIM_LOG_FILE=$GITHUB_WORKSPACE/build/.nvimlog
|
||||
VALGRIND_LOG=$GITHUB_WORKSPACE/build/log/valgrind-%p.log
|
||||
CACHE_NVIM_DEPS_DIR=$HOME/.cache/nvim-deps
|
||||
CACHE_MARKER=$HOME/.cache/nvim-deps/.ci_cache_marker
|
||||
CCACHE_BASEDIR=$GITHUB_WORKSPACE
|
||||
CCACHE_COMPRESS=1
|
||||
CCACHE_SLOPPINESS=time_macros,file_macro
|
||||
CCACHE_DIR=$HOME/.ccache
|
||||
EOF
|
||||
|
||||
DEPS_CMAKE_FLAGS=-DUSE_BUNDLED_GPERF=OFF
|
||||
FUNCTIONALTEST=functionaltest
|
||||
BUILD_FLAGS="CMAKE_FLAGS=-DCI_BUILD=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX:PATH=$HOME/nvim-install -DBUSTED_OUTPUT_TYPE=nvim -DDEPS_PREFIX=$HOME/nvim-deps/usr -DMIN_LOG_LEVEL=3"
|
||||
|
||||
case "$FLAVOR" in
|
||||
asan)
|
||||
BUILD_FLAGS="$BUILD_FLAGS -DPREFER_LUA=ON"
|
||||
cat <<EOF >> "$GITHUB_ENV"
|
||||
CLANG_SANITIZER=ASAN_UBSAN
|
||||
SYMBOLIZER=asan_symbolize-12
|
||||
ASAN_OPTIONS=detect_leaks=1:check_initialization_order=1:log_path=$GITHUB_WORKSPACE/build/log/asan
|
||||
UBSAN_OPTIONS=print_stacktrace=1 log_path=$GITHUB_WORKSPACE/build/log/ubsan
|
||||
EOF
|
||||
;;
|
||||
tsan)
|
||||
cat <<EOF >> "$GITHUB_ENV"
|
||||
TSAN_OPTIONS=log_path=$GITHUB_WORKSPACE/build/log/tsan
|
||||
EOF
|
||||
;;
|
||||
lint)
|
||||
cat <<EOF >> "$GITHUB_ENV"
|
||||
CI_TARGET=lint
|
||||
EOF
|
||||
;;
|
||||
functionaltest-lua)
|
||||
BUILD_FLAGS="$BUILD_FLAGS -DPREFER_LUA=ON"
|
||||
FUNCTIONALTEST=functionaltest-lua
|
||||
DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -DUSE_BUNDLED_LUAJIT=OFF"
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
cat <<EOF >> "$GITHUB_ENV"
|
||||
$BUILD_FLAGS
|
||||
DEPS_CMAKE_FLAGS=$DEPS_CMAKE_FLAGS
|
||||
FUNCTIONALTEST=$FUNCTIONALTEST
|
||||
EOF
|
30
.github/workflows/labeler.yml
vendored
Normal file
30
.github/workflows/labeler.yml
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
name: "Pull Request Labeler"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: opened
|
||||
jobs:
|
||||
triage:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/labeler@main
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
type-scope:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GH_REPO: ${{ github.repository }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
PR_TITLE: ${{ github.event.pull_request.title }}
|
||||
steps:
|
||||
# Extract type and try to add it as a label
|
||||
- run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|([[:alpha:]]+)(\(.*\))?!?:.*|\1|')" || true
|
||||
|
||||
# Extract scope and try to add it as a label
|
||||
- run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|[[:alpha:]]+\((.+)\)!?:.*|\1|')" || true
|
31
.github/workflows/labeler_issue.yml
vendored
31
.github/workflows/labeler_issue.yml
vendored
@ -1,31 +0,0 @@
|
||||
name: "labeler: issue"
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
jobs:
|
||||
labeler:
|
||||
permissions:
|
||||
issues: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: check issue title
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const title = context.payload.issue.title;
|
||||
const titleSplit = title.split(/\b/).map(e => e.toLowerCase());
|
||||
const keywords = ['api', 'treesitter', 'ui', 'lsp'];
|
||||
var match = new Set();
|
||||
for (const keyword of keywords) {
|
||||
if (titleSplit.includes(keyword)) {
|
||||
match.add(keyword)
|
||||
}
|
||||
}
|
||||
if (match.size !== 0) {
|
||||
github.rest.issues.addLabels({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
labels: Array.from(match)
|
||||
})
|
||||
}
|
57
.github/workflows/labeler_pr.yml
vendored
57
.github/workflows/labeler_pr.yml
vendored
@ -1,57 +0,0 @@
|
||||
name: "labeler: PR"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened]
|
||||
jobs:
|
||||
changed-files:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/labeler@v5
|
||||
with:
|
||||
configuration-path: .github/scripts/labeler_configuration.yml
|
||||
|
||||
type-scope:
|
||||
needs: changed-files
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GH_REPO: ${{ github.repository }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
PR_TITLE: ${{ github.event.pull_request.title }}
|
||||
steps:
|
||||
- name: "Extract commit type and add as label"
|
||||
run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|([[:alpha:]]+)(\(.*\))?!?:.*|\1|')" || true
|
||||
- name: "Extract commit scope and add as label"
|
||||
run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|[[:alpha:]]+\((.+)\)!?:.*|\1|')" || true
|
||||
- name: "Extract if the PR is a breaking change and add it as label"
|
||||
run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|[[:alpha:]]+(\(.*\))?!:.*|breaking-change|')" || true
|
||||
|
||||
target-release:
|
||||
needs: ["changed-files", "type-scope"]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- if: startsWith(github.base_ref, 'release')
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
github.rest.issues.addLabels({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
labels: ['target:release']
|
||||
})
|
||||
|
||||
request-reviewer:
|
||||
needs: ["changed-files", "type-scope", "target-release"]
|
||||
permissions:
|
||||
pull-requests: write
|
||||
uses: ./.github/workflows/reviewers_add.yml
|
27
.github/workflows/lintcommit.yml
vendored
27
.github/workflows/lintcommit.yml
vendored
@ -1,27 +0,0 @@
|
||||
name: lintcommit
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
branches:
|
||||
- 'master'
|
||||
jobs:
|
||||
lint-commits:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.pull_request.draft == false
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
|
||||
- uses: ./.github/actions/setup
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake -S cmake.deps --preset ci
|
||||
cmake --build .deps
|
||||
cmake --preset ci
|
||||
cmake --build build
|
||||
|
||||
- name: lintcommit
|
||||
run: cmake --build build --target lintcommit
|
16
.github/workflows/lintcommit_dummy.yml
vendored
16
.github/workflows/lintcommit_dummy.yml
vendored
@ -1,16 +0,0 @@
|
||||
# Dummy workflow of lintcommit.yml. lintcommit is a required check, but it's
|
||||
# only designed to work on master. Since required checks are always required to
|
||||
# run, we can essentially "skip" the lintcommit on release branches with this
|
||||
# dummy check that automatically passes.
|
||||
name: lintcommit_dummy
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
branches:
|
||||
- 'release-[0-9]+.[0-9]+'
|
||||
jobs:
|
||||
lint-commits:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.pull_request.draft == false
|
||||
steps:
|
||||
- run: echo "success"
|
34
.github/workflows/news.yml
vendored
34
.github/workflows/news.yml
vendored
@ -1,34 +0,0 @@
|
||||
name: "news.txt"
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled]
|
||||
branches:
|
||||
- 'master'
|
||||
jobs:
|
||||
check:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.pull_request.draft == false && !contains(github.event.pull_request.labels.*.name, 'ci:skip-news')
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: news.txt needs to be updated
|
||||
run: |
|
||||
for commit in $(git rev-list HEAD~${{ github.event.pull_request.commits }}..HEAD); do
|
||||
message=$(git log -n1 --pretty=format:%s $commit)
|
||||
type="$(echo "$message" | sed -E 's|([[:alpha:]]+)(\(.*\))?!?:.*|\1|')"
|
||||
breaking="$(echo "$message" | sed -E 's|[[:alpha:]]+(\(.*\))?!:.*|breaking-change|')"
|
||||
if [[ "$type" == "feat" ]] || [[ "$breaking" == "breaking-change" ]]; then
|
||||
! git diff HEAD~${{ github.event.pull_request.commits }}..HEAD --quiet runtime/doc/news.txt ||
|
||||
{
|
||||
echo "
|
||||
Pull request includes a new feature or a breaking change, but
|
||||
news.txt hasn't been updated yet. This is just a reminder
|
||||
that news.txt may need to be updated. You can ignore this CI
|
||||
failure if you think the change won't be of interest to
|
||||
users."
|
||||
exit 1
|
||||
}
|
||||
fi
|
||||
done
|
50
.github/workflows/notes.md
vendored
50
.github/workflows/notes.md
vendored
@ -6,39 +6,17 @@ ${NVIM_VERSION}
|
||||
|
||||
### Windows
|
||||
|
||||
#### Zip
|
||||
1. Extract **nvim-win64.zip**
|
||||
2. Run `nvim-qt.exe`
|
||||
|
||||
1. Download **nvim-win64.zip**
|
||||
2. Extract the zip
|
||||
3. Run `nvim.exe` on your CLI of choice
|
||||
### macOS
|
||||
|
||||
#### MSI
|
||||
|
||||
1. Download **nvim-win64.msi**
|
||||
2. Run the MSI
|
||||
3. Run `nvim.exe` on your CLI of choice
|
||||
|
||||
### macOS (x86_64)
|
||||
|
||||
1. Download **nvim-macos-x86_64.tar.gz**
|
||||
2. Run `xattr -c ./nvim-macos-x86_64.tar.gz` (to avoid "unknown developer" warning)
|
||||
3. Extract: `tar xzvf nvim-macos-x86_64.tar.gz`
|
||||
4. Run `./nvim-macos-x86_64/bin/nvim`
|
||||
|
||||
### macOS (arm64)
|
||||
|
||||
1. Download **nvim-macos-arm64.tar.gz**
|
||||
2. Run `xattr -c ./nvim-macos-arm64.tar.gz` (to avoid "unknown developer" warning)
|
||||
3. Extract: `tar xzvf nvim-macos-arm64.tar.gz`
|
||||
4. Run `./nvim-macos-arm64/bin/nvim`
|
||||
1. Download **nvim-macos.tar.gz**
|
||||
2. Extract: `tar xzvf nvim-macos.tar.gz`
|
||||
3. Run `./nvim-osx64/bin/nvim`
|
||||
|
||||
### Linux (x64)
|
||||
|
||||
Minimum glibc version to run these releases is 2.31. People requiring releases
|
||||
that work on older glibc versions can find them at
|
||||
https://github.com/neovim/neovim-releases.
|
||||
|
||||
#### AppImage
|
||||
1. Download **nvim.appimage**
|
||||
2. Run `chmod u+x nvim.appimage && ./nvim.appimage`
|
||||
- If your system does not have FUSE you can [extract the appimage](https://github.com/AppImage/AppImageKit/wiki/FUSE#type-2-appimage):
|
||||
@ -47,24 +25,16 @@ https://github.com/neovim/neovim-releases.
|
||||
./squashfs-root/usr/bin/nvim
|
||||
```
|
||||
|
||||
#### Tarball
|
||||
|
||||
1. Download **nvim-linux64.tar.gz**
|
||||
2. Extract: `tar xzvf nvim-linux64.tar.gz`
|
||||
3. Run `./nvim-linux64/bin/nvim`
|
||||
|
||||
### Other
|
||||
|
||||
- Install by [package manager](https://github.com/neovim/neovim/blob/master/INSTALL.md#install-from-package)
|
||||
- Install by [package manager](https://github.com/neovim/neovim/wiki/Installing-Neovim)
|
||||
|
||||
## SHA256 Checksums
|
||||
|
||||
```
|
||||
${SHA_LINUX_64_TAR}
|
||||
${SHA_LINUX_64}
|
||||
${SHA_APP_IMAGE}
|
||||
${SHA_APP_IMAGE_ZSYNC}
|
||||
${SHA_MACOS_X86_64}
|
||||
${SHA_MACOS_ARM64}
|
||||
${SHA_WIN_64_ZIP}
|
||||
${SHA_WIN_64_MSI}
|
||||
${SHA_MACOS}
|
||||
${SHA_WIN_64}
|
||||
```
|
||||
|
55
.github/workflows/optional.yml
vendored
55
.github/workflows/optional.yml
vendored
@ -1,55 +0,0 @@
|
||||
name: optional
|
||||
on:
|
||||
pull_request:
|
||||
types: [labeled, opened, synchronize, reopened]
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
env:
|
||||
INSTALL_PREFIX: ${{ github.workspace }}/nvim-install
|
||||
# Double test timeout since it's running via qemu
|
||||
TEST_TIMEOUT: 3600
|
||||
# TEST_FILE: test/functional/shada
|
||||
# TEST_FILTER: foo
|
||||
|
||||
jobs:
|
||||
s390x:
|
||||
if: contains(github.event.pull_request.labels.*.name, 'ci:s390x') || github.event_name == 'workflow_dispatch'
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
test: [functionaltest, oldtest]
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 90
|
||||
steps:
|
||||
- run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
|
||||
- uses: docker://multiarch/ubuntu-core:s390x-focal
|
||||
with:
|
||||
# Docker runs the command as root, but we want the build/test to run
|
||||
# as non-root so permissions based tests run correctly
|
||||
args: >
|
||||
bash -c
|
||||
"
|
||||
apt-get -y update &&
|
||||
time DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential cmake curl gettext ninja-build locales-all cpanminus git attr libattr1-dev xdg-utils &&
|
||||
useradd --create-home qemuci &&
|
||||
chown -R qemuci. . &&
|
||||
runuser -u qemuci -- git clone --depth=1 https://github.com/neovim/neovim.git &&
|
||||
cd neovim &&
|
||||
runuser -u qemuci -- git fetch origin ${{ github.ref }}:pr &&
|
||||
runuser -u qemuci -- git switch pr &&
|
||||
runuser -u qemuci -- cmake -S cmake.deps -B .deps -G Ninja -D USE_BUNDLED_LUAJIT=OFF -D USE_BUNDLED_LUA=ON &&
|
||||
runuser -u qemuci -- cmake --build .deps &&
|
||||
runuser -u qemuci -- cmake -B build -G Ninja -D CI_BUILD=ON -D PREFER_LUA=ON &&
|
||||
runuser -u qemuci -- make ${{ matrix.test }}
|
||||
"
|
||||
|
||||
windows-asan:
|
||||
if: contains(github.event.pull_request.labels.*.name, 'ci:windows-asan') || github.event_name == 'workflow_dispatch'
|
||||
uses: ./.github/workflows/test_windows.yml
|
||||
with:
|
||||
build_flags: "-D ENABLE_ASAN_UBSAN=ON"
|
||||
functionaltest_timeout: 40
|
265
.github/workflows/release.yml
vendored
265
.github/workflows/release.yml
vendored
@ -1,4 +1,4 @@
|
||||
name: release
|
||||
name: Release
|
||||
on:
|
||||
schedule:
|
||||
- cron: '5 5 * * *'
|
||||
@ -13,157 +13,151 @@ on:
|
||||
- v[0-9]+.[0-9]+.[0-9]+
|
||||
|
||||
# Build on the oldest supported images, so we have broader compatibility
|
||||
# Build with gcc-10 to prevent triggering #14150 (default is still gcc-9 on 20.04)
|
||||
# Upgrade to gcc-11 to prevent it from using its builtins (#14150)
|
||||
jobs:
|
||||
setup:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
build_type: ${{ steps.build.outputs.build_type }}
|
||||
appimage_tag: ${{ steps.build.outputs.appimage_tag }}
|
||||
steps:
|
||||
# Nightly uses RelWithDebInfo while stable uses Release (which disables
|
||||
# asserts). This helps get better debug info from people brave enough to
|
||||
# use the nightly builds.
|
||||
- if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly')
|
||||
run: |
|
||||
echo 'CMAKE_BUILD_TYPE=Release' >> $GITHUB_ENV
|
||||
echo 'APPIMAGE_TAG=latest' >> $GITHUB_ENV
|
||||
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
|
||||
run: |
|
||||
echo 'CMAKE_BUILD_TYPE=RelWithDebInfo' >> $GITHUB_ENV
|
||||
echo 'APPIMAGE_TAG=nightly' >> $GITHUB_ENV
|
||||
- name: Export build information
|
||||
id: build
|
||||
run: |
|
||||
printf "build_type=${CMAKE_BUILD_TYPE}\n" >> $GITHUB_OUTPUT
|
||||
printf "appimage_tag=${APPIMAGE_TAG}\n" >> $GITHUB_OUTPUT
|
||||
|
||||
linux:
|
||||
runs-on: ubuntu-20.04
|
||||
needs: setup
|
||||
env:
|
||||
CC: gcc-10
|
||||
runs-on: ubuntu-18.04
|
||||
outputs:
|
||||
version: ${{ steps.build.outputs.version }}
|
||||
release: ${{ steps.build.outputs.release }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
# Perform a full checkout #13471
|
||||
fetch-depth: 0
|
||||
- run: ./.github/scripts/install_deps.sh
|
||||
- run: echo "CMAKE_BUILD_TYPE=${{ needs.setup.outputs.build_type }}" >> $GITHUB_ENV
|
||||
- name: appimage
|
||||
run: ./scripts/genappimage.sh ${{ needs.setup.outputs.appimage_tag }}
|
||||
- name: tar.gz
|
||||
run: cpack --config build/CPackConfig.cmake -G TGZ
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: appimage
|
||||
path: |
|
||||
build/bin/nvim.appimage
|
||||
build/bin/nvim.appimage.zsync
|
||||
retention-days: 1
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: nvim-linux64
|
||||
path: |
|
||||
build/nvim-linux64.tar.gz
|
||||
retention-days: 1
|
||||
- name: Export version
|
||||
id: build
|
||||
run: |
|
||||
printf 'version<<END\n' >> $GITHUB_OUTPUT
|
||||
./build/bin/nvim --version | head -n 3 >> $GITHUB_OUTPUT
|
||||
printf 'END\n' >> $GITHUB_OUTPUT
|
||||
|
||||
macos:
|
||||
needs: setup
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
runner: [ macos-12, macos-14 ]
|
||||
include:
|
||||
- runner: macos-12
|
||||
arch: x86_64
|
||||
- runner: macos-14
|
||||
arch: arm64
|
||||
runs-on: ${{ matrix.runner }}
|
||||
env:
|
||||
MACOSX_DEPLOYMENT_TARGET: 11.0
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
# Perform a full checkout #13471
|
||||
fetch-depth: 0
|
||||
- name: Install dependencies
|
||||
run: ./.github/scripts/install_deps.sh
|
||||
|
||||
- name: Build deps
|
||||
run: |
|
||||
cmake -S cmake.deps -B .deps -G Ninja \
|
||||
-D CMAKE_BUILD_TYPE=${{ needs.setup.outputs.build_type }} \
|
||||
-D CMAKE_FIND_FRAMEWORK=NEVER
|
||||
cmake --build .deps
|
||||
|
||||
- name: Build neovim
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y autoconf automake build-essential cmake gcc-11 gettext gperf libtool-bin locales ninja-build pkg-config unzip
|
||||
- if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly')
|
||||
run: printf 'NVIM_BUILD_TYPE=Release\n' >> $GITHUB_ENV
|
||||
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
|
||||
run: printf 'NVIM_BUILD_TYPE=RelWithDebInfo\n' >> $GITHUB_ENV
|
||||
- name: Build release
|
||||
id: build
|
||||
run: |
|
||||
cmake -B build -G Ninja \
|
||||
-D CMAKE_BUILD_TYPE=${{ needs.setup.outputs.build_type }} \
|
||||
-D ENABLE_LIBINTL=OFF \
|
||||
-D CMAKE_FIND_FRAMEWORK=NEVER
|
||||
cmake --build build
|
||||
|
||||
- name: Package
|
||||
run: cpack --config build/CPackConfig.cmake
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
CC=gcc-11 make CMAKE_BUILD_TYPE=${NVIM_BUILD_TYPE} CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH="
|
||||
printf '::set-output name=version::%s\n' "$(./build/bin/nvim --version | head -n 3 | sed -z 's/\n/%0A/g')"
|
||||
printf '::set-output name=release::%s\n' "$(./build/bin/nvim --version | head -n 1)"
|
||||
make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-linux64" install
|
||||
cd "$GITHUB_WORKSPACE/build/release"
|
||||
tar cfz nvim-linux64.tar.gz nvim-linux64
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: nvim-macos-${{ matrix.arch }}
|
||||
path: build/nvim-macos-${{ matrix.arch }}.tar.gz
|
||||
name: nvim-linux64
|
||||
path: build/release/nvim-linux64.tar.gz
|
||||
retention-days: 1
|
||||
|
||||
appimage:
|
||||
runs-on: ubuntu-18.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y autoconf automake build-essential cmake gcc-11 gettext gperf libtool-bin locales ninja-build pkg-config unzip
|
||||
- if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly')
|
||||
run: CC=gcc-11 make appimage-latest
|
||||
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
|
||||
run: CC=gcc-11 make appimage-nightly
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: appimage
|
||||
path: build/bin/nvim.appimage
|
||||
retention-days: 1
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: appimage
|
||||
path: build/bin/nvim.appimage.zsync
|
||||
retention-days: 1
|
||||
|
||||
macOS:
|
||||
runs-on: macos-10.15
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Install brew packages
|
||||
run: |
|
||||
rm -f /usr/local/bin/2to3
|
||||
brew update >/dev/null
|
||||
brew upgrade
|
||||
brew install automake ninja
|
||||
- if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly')
|
||||
run: printf 'NVIM_BUILD_TYPE=Release\n' >> $GITHUB_ENV
|
||||
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
|
||||
run: printf 'NVIM_BUILD_TYPE=RelWithDebInfo\n' >> $GITHUB_ENV
|
||||
- name: Build release
|
||||
run: |
|
||||
make CMAKE_BUILD_TYPE=${NVIM_BUILD_TYPE} CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11"
|
||||
make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-osx64" install
|
||||
- name: Create package
|
||||
run: |
|
||||
cd "$GITHUB_WORKSPACE/build/release"
|
||||
mkdir -p nvim-osx64/libs
|
||||
libs=($(otool -L nvim-osx64/bin/nvim | sed 1d | sed -E -e 's|^[[:space:]]*||' -e 's| .*||'))
|
||||
echo "libs:"
|
||||
for lib in "${libs[@]}"; do
|
||||
if echo "$lib" | grep -q -E 'libSystem|CoreFoundation' 2>/dev/null; then
|
||||
echo " [skipped] $lib"
|
||||
else
|
||||
echo " $lib"
|
||||
relname="libs/${lib##*/}"
|
||||
cp -L "$lib" "nvim-osx64/$relname"
|
||||
install_name_tool -change "$lib" "@executable_path/../$relname" nvim-osx64/bin/nvim
|
||||
fi
|
||||
done
|
||||
tar cfz nvim-macos.tar.gz nvim-osx64
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: nvim-macos
|
||||
path: build/release/nvim-macos.tar.gz
|
||||
retention-days: 1
|
||||
|
||||
windows:
|
||||
needs: setup
|
||||
runs-on: windows-2019
|
||||
runs-on: windows-2016
|
||||
env:
|
||||
DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }}
|
||||
DEPS_PREFIX: ${{ format('{0}/nvim-deps/usr', github.workspace) }}
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- config: MSVC_64
|
||||
archive: nvim-win64
|
||||
name: windows (${{ matrix.config }})
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
# Perform a full checkout #13471
|
||||
fetch-depth: 0
|
||||
- run: .github/scripts/env.ps1
|
||||
- name: Build deps
|
||||
run: |
|
||||
cmake -S cmake.deps -B .deps -G Ninja -DCMAKE_BUILD_TYPE=${{ needs.setup.outputs.build_type }}
|
||||
cmake --build .deps
|
||||
- name: build package
|
||||
run: |
|
||||
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{ needs.setup.outputs.build_type }}
|
||||
cmake --build build --target package
|
||||
- uses: actions/upload-artifact@v4
|
||||
- run: powershell ci\build.ps1 -NoTests
|
||||
env:
|
||||
CONFIGURATION: ${{ matrix.config }}
|
||||
- run: move build\Neovim.zip build\${{ matrix.archive }}.zip
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: nvim-win64
|
||||
path: |
|
||||
build/nvim-win64.msi
|
||||
build/nvim-win64.zip
|
||||
name: ${{ matrix.archive }}
|
||||
path: build/${{ matrix.archive }}.zip
|
||||
retention-days: 1
|
||||
|
||||
publish:
|
||||
needs: [linux, macos, windows]
|
||||
runs-on: ubuntu-latest
|
||||
needs: [linux, appimage, macOS, windows]
|
||||
runs-on: ubuntu-20.04
|
||||
env:
|
||||
GH_REPO: ${{ github.repository }}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
# Must perform checkout first, since it deletes the target directory
|
||||
# before running, and would therefore delete the downloaded artifacts
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
- uses: actions/download-artifact@v2
|
||||
|
||||
- name: Install dependencies
|
||||
run: sudo apt-get update && sudo apt-get install -y gettext-base
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y gettext-base
|
||||
|
||||
- if: github.event_name == 'workflow_dispatch'
|
||||
run: echo "TAG_NAME=${{ github.event.inputs.tag_name }}" >> $GITHUB_ENV
|
||||
@ -174,12 +168,16 @@ jobs:
|
||||
TAG_NAME=${{ github.ref }}
|
||||
echo "TAG_NAME=${TAG_NAME#refs/tags/}" >> $GITHUB_ENV
|
||||
- if: env.TAG_NAME == 'nightly'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
(echo 'SUBJECT=Nvim development (prerelease) build';
|
||||
echo 'PRERELEASE=--prerelease') >> $GITHUB_ENV
|
||||
gh release delete nightly --yes || true
|
||||
git push origin :nightly || true
|
||||
- if: env.TAG_NAME != 'nightly'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
(echo 'SUBJECT=Nvim release build';
|
||||
echo 'PRERELEASE=') >> $GITHUB_ENV
|
||||
@ -191,7 +189,7 @@ jobs:
|
||||
run: |
|
||||
cd ./nvim-linux64
|
||||
sha256sum nvim-linux64.tar.gz > nvim-linux64.tar.gz.sha256sum
|
||||
echo "SHA_LINUX_64_TAR=$(cat nvim-linux64.tar.gz.sha256sum)" >> $GITHUB_ENV
|
||||
echo "SHA_LINUX_64=$(cat nvim-linux64.tar.gz.sha256sum)" >> $GITHUB_ENV
|
||||
- name: Generate App Image SHA256 checksums
|
||||
run: |
|
||||
cd ./appimage
|
||||
@ -202,30 +200,23 @@ jobs:
|
||||
cd ./appimage
|
||||
sha256sum nvim.appimage.zsync > nvim.appimage.zsync.sha256sum
|
||||
echo "SHA_APP_IMAGE_ZSYNC=$(cat nvim.appimage.zsync.sha256sum)" >> $GITHUB_ENV
|
||||
- name: Generate macos x86_64 SHA256 checksums
|
||||
- name: Generate macOS SHA256 checksums
|
||||
run: |
|
||||
cd ./nvim-macos-x86_64
|
||||
sha256sum nvim-macos-x86_64.tar.gz > nvim-macos-x86_64.tar.gz.sha256sum
|
||||
echo "SHA_MACOS_X86_64=$(cat nvim-macos-x86_64.tar.gz.sha256sum)" >> $GITHUB_ENV
|
||||
- name: Generate macos arm64 SHA256 checksums
|
||||
run: |
|
||||
cd ./nvim-macos-arm64
|
||||
sha256sum nvim-macos-arm64.tar.gz > nvim-macos-arm64.tar.gz.sha256sum
|
||||
echo "SHA_MACOS_ARM64=$(cat nvim-macos-arm64.tar.gz.sha256sum)" >> $GITHUB_ENV
|
||||
cd ./nvim-macos
|
||||
sha256sum nvim-macos.tar.gz > nvim-macos.tar.gz.sha256sum
|
||||
echo "SHA_MACOS=$(cat nvim-macos.tar.gz.sha256sum)" >> $GITHUB_ENV
|
||||
- name: Generate Win64 SHA256 checksums
|
||||
run: |
|
||||
cd ./nvim-win64
|
||||
sha256sum nvim-win64.zip > nvim-win64.zip.sha256sum
|
||||
echo "SHA_WIN_64_ZIP=$(cat nvim-win64.zip.sha256sum)" >> $GITHUB_ENV
|
||||
sha256sum nvim-win64.msi > nvim-win64.msi.sha256sum
|
||||
echo "SHA_WIN_64_MSI=$(cat nvim-win64.msi.sha256sum)" >> $GITHUB_ENV
|
||||
echo "SHA_WIN_64=$(cat nvim-win64.zip.sha256sum)" >> $GITHUB_ENV
|
||||
- name: Publish release
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
NVIM_VERSION: ${{ needs.linux.outputs.version }}
|
||||
DEBUG: api
|
||||
run: |
|
||||
envsubst < "$GITHUB_WORKSPACE/.github/workflows/notes.md" > "$RUNNER_TEMP/notes.md"
|
||||
gh release create $TAG_NAME $PRERELEASE --notes-file "$RUNNER_TEMP/notes.md" --title "$SUBJECT" --target $GITHUB_SHA nvim-macos/* nvim-linux64/* appimage/* nvim-win64/*
|
||||
if [ "$TAG_NAME" != "nightly" ]; then
|
||||
gh release create stable $PRERELEASE --notes-file "$RUNNER_TEMP/notes.md" --title "$SUBJECT" --target $GITHUB_SHA nvim-macos-x86_64/* nvim-macos-arm64/* nvim-linux64/* appimage/* nvim-win64/*
|
||||
gh release create stable $PRERELEASE --notes-file "$RUNNER_TEMP/notes.md" --title "$SUBJECT" --target $GITHUB_SHA nvim-macos/* nvim-linux64/* appimage/* nvim-win64/*
|
||||
fi
|
||||
gh release create $TAG_NAME $PRERELEASE --notes-file "$RUNNER_TEMP/notes.md" --title "$SUBJECT" --target $GITHUB_SHA nvim-macos-x86_64/* nvim-macos-arm64/* nvim-linux64/* appimage/* nvim-win64/*
|
||||
|
35
.github/workflows/response.yml
vendored
35
.github/workflows/response.yml
vendored
@ -1,35 +0,0 @@
|
||||
name: no_response
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 1 * * *' # Run every day at 01:30
|
||||
workflow_dispatch:
|
||||
issue_comment:
|
||||
|
||||
jobs:
|
||||
close:
|
||||
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const script = require('./.github/scripts/close_unresponsive.js')
|
||||
await script({github, context})
|
||||
|
||||
remove_label:
|
||||
if: github.event_name == 'issue_comment'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const script = require('./.github/scripts/remove_response_label.js')
|
||||
await script({github, context})
|
19
.github/workflows/reviewers_add.yml
vendored
19
.github/workflows/reviewers_add.yml
vendored
@ -1,19 +0,0 @@
|
||||
name: "reviewers: add"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [labeled, ready_for_review, reopened]
|
||||
workflow_call:
|
||||
jobs:
|
||||
request-reviewer:
|
||||
if: github.event.pull_request.state == 'open' && github.event.pull_request.draft == false && !endsWith(github.actor, '[bot]')
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: 'Request reviewers'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const script = require('./.github/scripts/reviewers_add.js')
|
||||
await script({github, context})
|
17
.github/workflows/reviewers_remove.yml
vendored
17
.github/workflows/reviewers_remove.yml
vendored
@ -1,17 +0,0 @@
|
||||
name: "reviewers: remove"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [converted_to_draft, closed]
|
||||
jobs:
|
||||
remove-reviewers:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: 'Remove reviewers'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const script = require('./.github/scripts/reviewers_remove.js')
|
||||
await script({github, context})
|
33
.github/workflows/squash-typos.yml
vendored
Normal file
33
.github/workflows/squash-typos.yml
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
name: Squash Typo Pull Requests
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types: labeled
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}
|
||||
jobs:
|
||||
build:
|
||||
if: github.event.label.name == 'typo'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@v2
|
||||
|
||||
- name: Setup git config
|
||||
run: |
|
||||
git config --global user.name 'marvim'
|
||||
git config --global user.email 'marvim@users.noreply.github.com'
|
||||
|
||||
- run: python scripts/squash_typos.py
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.number }}
|
266
.github/workflows/test.yml
vendored
266
.github/workflows/test.yml
vendored
@ -1,266 +0,0 @@
|
||||
name: test
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-[0-9]+.[0-9]+'
|
||||
pull_request:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-[0-9]+.[0-9]+'
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
env:
|
||||
ASAN_OPTIONS: detect_leaks=1:check_initialization_order=1:log_path=${{ github.workspace }}/build/log/asan:intercept_tls_get_addr=0
|
||||
BIN_DIR: ${{ github.workspace }}/bin
|
||||
BUILD_DIR: ${{ github.workspace }}/build
|
||||
INSTALL_PREFIX: ${{ github.workspace }}/nvim-install
|
||||
LOG_DIR: ${{ github.workspace }}/build/log
|
||||
NVIM_LOG_FILE: ${{ github.workspace }}/build/.nvimlog
|
||||
TSAN_OPTIONS: log_path=${{ github.workspace }}/build/log/tsan
|
||||
VALGRIND_LOG: ${{ github.workspace }}/build/log/valgrind-%p.log
|
||||
# TEST_FILE: test/functional/core/startup_spec.lua
|
||||
# TEST_FILTER: foo
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 10
|
||||
env:
|
||||
CC: clang
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
|
||||
- name: Install stylua
|
||||
run: |
|
||||
wget --directory-prefix="$BIN_DIR" https://github.com/JohnnyMorganz/StyLua/releases/latest/download/stylua-linux-x86_64.zip
|
||||
(cd "$BIN_DIR"; unzip stylua*.zip)
|
||||
|
||||
- name: Build third-party deps
|
||||
run: |
|
||||
cmake -S cmake.deps -B .deps -G Ninja
|
||||
cmake --build .deps
|
||||
|
||||
- run: cmake -B build -G Ninja -D CI_LINT=ON
|
||||
|
||||
- if: "!cancelled()"
|
||||
name: Determine if run should be aborted
|
||||
id: abort_job
|
||||
run: echo "status=${{ job.status }}" >> $GITHUB_OUTPUT
|
||||
|
||||
- if: success() || failure() && steps.abort_job.outputs.status == 'success'
|
||||
name: stylua
|
||||
run: cmake --build build --target lintlua-stylua
|
||||
|
||||
- if: success() || failure() && steps.abort_job.outputs.status == 'success'
|
||||
name: luacheck
|
||||
run: cmake --build build --target lintlua-luacheck
|
||||
|
||||
- if: success() || failure() && steps.abort_job.outputs.status == 'success'
|
||||
name: lintsh
|
||||
run: cmake --build build --target lintsh
|
||||
|
||||
- if: success() || failure() && steps.abort_job.outputs.status == 'success'
|
||||
name: clint.py
|
||||
run: cmake --build build --target lintc-clint
|
||||
|
||||
- if: success() || failure() && steps.abort_job.outputs.status == 'success'
|
||||
name: clang-tidy
|
||||
run: cmake --build build --target lintc-clang-tidy
|
||||
|
||||
- if: success() || failure() && steps.abort_job.outputs.status == 'success'
|
||||
name: uncrustify
|
||||
run: cmake --build build --target lintc-uncrustify
|
||||
|
||||
clang-analyzer:
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 20
|
||||
env:
|
||||
CC: clang
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
- name: Build third-party deps
|
||||
run: |
|
||||
cmake -S cmake.deps --preset ci
|
||||
cmake --build .deps
|
||||
cmake --preset ci
|
||||
- run: cmake --build build --target clang-analyzer
|
||||
|
||||
posix:
|
||||
name: ${{ matrix.build.os }} ${{ matrix.build.flavor }} ${{ matrix.build.cc }} ${{ matrix.test }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# The `os` field is not needed to differentiate between the different
|
||||
# matrix builds. It is needed to not change the required checks (which
|
||||
# uses jobs names) each time we bump the runner version. It may be
|
||||
# possible to remove if we e.g. start using `-latest` runner versions
|
||||
# or if github introduces a wildcard for required checks in the future.
|
||||
build:
|
||||
[
|
||||
{ runner: ubuntu-22.04, os: ubuntu, flavor: asan, cc: clang, flags: -D ENABLE_ASAN_UBSAN=ON },
|
||||
{ runner: ubuntu-22.04, os: ubuntu, flavor: tsan, cc: clang, flags: -D ENABLE_TSAN=ON },
|
||||
{ runner: ubuntu-22.04, os: ubuntu, cc: gcc },
|
||||
{ runner: macos-12, os: macos, flavor: 12, cc: clang, flags: -D CMAKE_FIND_FRAMEWORK=NEVER, deps_flags: -D CMAKE_FIND_FRAMEWORK=NEVER },
|
||||
{ runner: macos-14, os: macos, cc: clang, flags: -D CMAKE_FIND_FRAMEWORK=NEVER, deps_flags: -D CMAKE_FIND_FRAMEWORK=NEVER },
|
||||
{ runner: ubuntu-22.04, os: ubuntu, flavor: puc-lua, cc: gcc, deps_flags: -D USE_BUNDLED_LUAJIT=OFF -D USE_BUNDLED_LUA=ON, flags: -D PREFER_LUA=ON },
|
||||
]
|
||||
test: [unittest, functionaltest, oldtest]
|
||||
exclude:
|
||||
- test: unittest
|
||||
build: { flavor: tsan }
|
||||
- test: unittest
|
||||
build: { flavor: puc-lua }
|
||||
- test: oldtest
|
||||
build: { flavor: tsan }
|
||||
runs-on: ${{ matrix.build.runner }}
|
||||
timeout-minutes: 45
|
||||
env:
|
||||
CC: ${{ matrix.build.cc }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
with:
|
||||
install_flags: "--test"
|
||||
|
||||
- name: Create log dir
|
||||
run: mkdir -p "$LOG_DIR"
|
||||
|
||||
- if: ${{ matrix.test != 'unittest' }}
|
||||
name: Set up interpreter packages
|
||||
run: |
|
||||
echo "Install neovim RubyGem."
|
||||
gem install --no-document --bindir "$BIN_DIR" --user-install --pre neovim
|
||||
|
||||
echo "Install neovim npm package"
|
||||
npm install -g neovim
|
||||
npm link neovim
|
||||
|
||||
sudo cpanm -n Neovim::Ext || cat "$HOME/.cpanm/build.log"
|
||||
perl -W -e 'use Neovim::Ext; print $Neovim::Ext::VERSION'
|
||||
|
||||
- name: Build third-party deps
|
||||
run: |
|
||||
cmake -S cmake.deps --preset ci -D CMAKE_BUILD_TYPE=Debug ${{ matrix.build.deps_flags }}
|
||||
cmake --build .deps
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake --preset ci -D CMAKE_BUILD_TYPE=Debug -D CMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX ${{ matrix.build.flags }}
|
||||
cmake --build build
|
||||
|
||||
- name: ${{ matrix.test }}
|
||||
timeout-minutes: 20
|
||||
run: make ${{ matrix.test }}
|
||||
|
||||
- name: Install
|
||||
run: |
|
||||
cmake --install build
|
||||
"$INSTALL_PREFIX/bin/nvim" --version
|
||||
if ! "$INSTALL_PREFIX/bin/nvim" -u NONE -e -c ':help' -c ':qall'; then
|
||||
echo "Running ':help' in the installed nvim failed."
|
||||
echo "Maybe the helptags have not been generated properly."
|
||||
echo 'Failed running :help'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check that all runtime files were installed
|
||||
for file in $(git -C runtime ls-files '*.vim' '*.ps' '*.dict' '*.py' '*.tutor' '*.awk' '*.sh' '*.bat'); do
|
||||
if ! test -e "$INSTALL_PREFIX/share/nvim/runtime/$file"; then
|
||||
printf "It appears that %s is not installed." "$file"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Check that generated syntax file has function names, #5060.
|
||||
genvimsynf=syntax/vim/generated.vim
|
||||
gpat='syn keyword vimFuncName .*eval'
|
||||
if ! grep -q "$gpat" "$INSTALL_PREFIX/share/nvim/runtime/$genvimsynf"; then
|
||||
echo "It appears that $genvimsynf does not contain $gpat."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- if: '!cancelled()'
|
||||
name: Show logs
|
||||
run: cat $(find "$LOG_DIR" -type f)
|
||||
|
||||
windows:
|
||||
uses: ./.github/workflows/test_windows.yml
|
||||
|
||||
# This job tests the following things:
|
||||
# - Check if Release, MinSizeRel and RelWithDebInfo compiles correctly.
|
||||
# - Test the above build types with the GCC compiler specifically.
|
||||
# Empirically the difference in warning levels between GCC and other
|
||||
# compilers is particularly big.
|
||||
# - Test if the build works with multi-config generators. We mostly use
|
||||
# single-config generators so it's nice to have a small sanity check for
|
||||
# multi-config.
|
||||
build-types:
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 10
|
||||
env:
|
||||
CC: gcc
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
|
||||
- name: Build third-party deps
|
||||
run: |
|
||||
cmake -S cmake.deps -B .deps -G "Ninja Multi-Config"
|
||||
cmake --build .deps
|
||||
|
||||
- name: Configure
|
||||
run: cmake --preset ci -G "Ninja Multi-Config"
|
||||
|
||||
- name: Release
|
||||
run: cmake --build build --config Release
|
||||
|
||||
- name: RelWithDebInfo
|
||||
run: cmake --build build --config RelWithDebInfo
|
||||
|
||||
- name: MinSizeRel
|
||||
run: cmake --build build --config MinSizeRel
|
||||
|
||||
with-external-deps:
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 10
|
||||
env:
|
||||
CC: gcc
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo add-apt-repository ppa:neovim-ppa/stable
|
||||
sudo apt-get install -y \
|
||||
libluajit-5.1-dev \
|
||||
libmsgpack-dev \
|
||||
libtermkey-dev \
|
||||
libunibilium-dev \
|
||||
libuv1-dev \
|
||||
lua-filesystem \
|
||||
lua-lpeg \
|
||||
luajit \
|
||||
lua-luv-dev
|
||||
# libtree-sitter-dev \
|
||||
# libvterm-dev
|
||||
|
||||
# Remove comments from packages once we start using these external
|
||||
# dependencies.
|
||||
|
||||
- name: Build third-party deps
|
||||
run: |
|
||||
cmake -S cmake.deps --preset external_deps
|
||||
cmake --build .deps
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake --preset ci
|
||||
cmake --build build
|
72
.github/workflows/test_windows.yml
vendored
72
.github/workflows/test_windows.yml
vendored
@ -1,72 +0,0 @@
|
||||
name: windows
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
build_flags:
|
||||
type: string
|
||||
functionaltest_timeout:
|
||||
default: 20
|
||||
type: number
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
windows:
|
||||
runs-on: windows-2022
|
||||
timeout-minutes: 45
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
test: [functional, old]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
|
||||
- name: Build deps
|
||||
run: |
|
||||
cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE='RelWithDebInfo'
|
||||
cmake --build .deps
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake --preset ci -D CMAKE_BUILD_TYPE='RelWithDebInfo' ${{ inputs.build_flags }}
|
||||
cmake --build build
|
||||
|
||||
- name: Install test deps
|
||||
run: |
|
||||
$PSNativeCommandArgumentPassing = 'Legacy'
|
||||
|
||||
& build\bin\nvim.exe "--version"
|
||||
|
||||
# Ensure that the "win32" feature is set.
|
||||
& build\bin\nvim -u NONE --headless -c 'exe !has(\"win32\").\"cq\"'
|
||||
|
||||
python -m pip install pynvim
|
||||
# Sanity check
|
||||
python -c "import pynvim; print(str(pynvim))"
|
||||
|
||||
node --version
|
||||
npm.cmd --version
|
||||
|
||||
npm.cmd install -g neovim
|
||||
Get-Command -CommandType Application neovim-node-host.cmd
|
||||
npm.cmd link neovim
|
||||
|
||||
- if: ${{ matrix.test == 'functional' }}
|
||||
name: functionaltest
|
||||
timeout-minutes: ${{ inputs.functionaltest_timeout }}
|
||||
run: cmake --build build --target functionaltest
|
||||
|
||||
- if: ${{ matrix.test == 'old' }}
|
||||
uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
update: true
|
||||
pacboy: >-
|
||||
make:p gcc:p diffutils:p
|
||||
release: false
|
||||
|
||||
- if: ${{ matrix.test == 'old' }}
|
||||
name: oldtest
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
cd test/old/testdir
|
||||
mingw32-make VERBOSE=1
|
@ -2,31 +2,28 @@ name: vim-patches
|
||||
on:
|
||||
schedule:
|
||||
- cron: '3 3 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
update-vim-patches:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
env:
|
||||
VIM_SOURCE_DIR: ${{ github.workspace }}/vim-src
|
||||
VIM_SOURCE_DIR: ${{ format('{0}/vim-src', github.workspace) }}
|
||||
VERSION_BRANCH: marvim/ci-version-update
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: vim/vim
|
||||
path: ${{ env.VIM_SOURCE_DIR }}
|
||||
fetch-depth: 0
|
||||
|
||||
- run: sudo apt-get install libfuse2
|
||||
|
||||
- run: |
|
||||
gh release download -R neovim/neovim -p nvim.appimage
|
||||
chmod a+x nvim.appimage
|
||||
@ -34,7 +31,7 @@ jobs:
|
||||
mv nvim.appimage $HOME/.local/bin/nvim
|
||||
printf '%s\n' "$HOME/.local/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Set up git config
|
||||
- name: Setup git config
|
||||
run: |
|
||||
git config --global user.name 'marvim'
|
||||
git config --global user.email 'marvim@users.noreply.github.com'
|
||||
@ -43,13 +40,13 @@ jobs:
|
||||
id: update-version
|
||||
run: |
|
||||
git checkout -b ${VERSION_BRANCH}
|
||||
nvim -V1 -es -i NONE +'luafile scripts/vimpatch.lua' +q
|
||||
printf 'NEW_PATCHES=%s\n' $([ -z "$(git diff)" ]; echo $?) >> $GITHUB_OUTPUT
|
||||
nvim -i NONE -u NONE --headless +'luafile scripts/vimpatch.lua' +q
|
||||
printf '::set-output name=NEW_PATCHES::%s\n' $([ -z "$(git diff)" ]; echo $?)
|
||||
|
||||
- name: Automatic PR
|
||||
if: ${{ steps.update-version.outputs.NEW_PATCHES != 0 }}
|
||||
run: |
|
||||
git add -u
|
||||
git commit -m 'docs: update version.c'
|
||||
git commit -m 'version.c: update [skip ci]'
|
||||
git push --force https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY} ${VERSION_BRANCH}
|
||||
gh pr create --draft --fill --label vim-patch --base ${GITHUB_REF#refs/heads/} --head ${VERSION_BRANCH} || true
|
||||
gh pr create --fill --label vim-patch --base ${GITHUB_REF#refs/heads/} --head ${VERSION_BRANCH} || true
|
38
.gitignore
vendored
38
.gitignore
vendored
@ -1,8 +1,6 @@
|
||||
# Tools
|
||||
/.direnv/
|
||||
/venv/
|
||||
compile_commands.json
|
||||
/.envrc
|
||||
|
||||
# IDEs
|
||||
/.vs/
|
||||
@ -16,7 +14,6 @@ compile_commands.json
|
||||
/.clangd/
|
||||
/.cache/clangd/
|
||||
/.ccls-cache/
|
||||
/.clang-tidy
|
||||
|
||||
.DS_Store
|
||||
*.mo
|
||||
@ -37,22 +34,21 @@ compile_commands.json
|
||||
*.rej
|
||||
|
||||
# Generated by old (Vim) tests.
|
||||
/test/old/testdir/del
|
||||
/test/old/testdir/test*.out
|
||||
/test/old/testdir/test*.res
|
||||
/test/old/testdir/test*.log
|
||||
/test/old/testdir/messages
|
||||
/test/old/testdir/starttime
|
||||
/test/old/testdir/viminfo
|
||||
/test/old/testdir/test.ok
|
||||
/test/old/testdir/*.failed
|
||||
/test/old/testdir/X*
|
||||
/test/old/testdir/valgrind.*
|
||||
/test/old/testdir/.gdbinit
|
||||
/src/nvim/testdir/del
|
||||
/src/nvim/testdir/test*.out
|
||||
/src/nvim/testdir/test*.res
|
||||
/src/nvim/testdir/test*.log
|
||||
/src/nvim/testdir/messages
|
||||
/src/nvim/testdir/viminfo
|
||||
/src/nvim/testdir/test.ok
|
||||
/src/nvim/testdir/*.failed
|
||||
/src/nvim/testdir/X*
|
||||
/src/nvim/testdir/valgrind.*
|
||||
/src/nvim/testdir/.gdbinit
|
||||
/runtime/indent/testdir/*.out
|
||||
+runtime/indent/testdir/*.fail
|
||||
# Generated by test/old/testdir/runnvim.sh.
|
||||
/test/old/testdir/*.tlog
|
||||
# Generated by src/nvim/testdir/runnvim.sh.
|
||||
/src/nvim/testdir/*.tlog
|
||||
|
||||
# Generated by unit tests.
|
||||
/test/includes/post/
|
||||
@ -75,11 +71,3 @@ tags
|
||||
|
||||
# vim patches
|
||||
/vim-*.patch
|
||||
|
||||
# nix build results
|
||||
/result
|
||||
/result-*
|
||||
/contrib/result
|
||||
/contrib/result-*
|
||||
|
||||
CMakeUserPresets.json
|
||||
|
21
.luacheckrc
21
.luacheckrc
@ -19,10 +19,6 @@ cache = true
|
||||
ignore = {
|
||||
"631", -- max_line_length
|
||||
"212/_.*", -- unused argument, for vars with "_" prefix
|
||||
"214", -- used variable with unused hint ("_" prefix)
|
||||
"121", -- setting read-only global variable 'vim'
|
||||
"122", -- setting read-only field of global variable 'vim'
|
||||
"581", -- negation of a relational operator- operator can be flipped (not for tables)
|
||||
}
|
||||
|
||||
-- Global objects defined by the C code
|
||||
@ -30,23 +26,6 @@ read_globals = {
|
||||
"vim",
|
||||
}
|
||||
|
||||
globals = {
|
||||
"vim.g",
|
||||
"vim.b",
|
||||
"vim.w",
|
||||
"vim.o",
|
||||
"vim.bo",
|
||||
"vim.wo",
|
||||
"vim.go",
|
||||
"vim.env"
|
||||
}
|
||||
|
||||
exclude_files = {
|
||||
'test/functional/fixtures/lua/syntax_error.lua',
|
||||
'runtime/lua/vim/treesitter/_meta.lua',
|
||||
'runtime/lua/vim/_meta/vimfn.lua',
|
||||
'runtime/lua/vim/_meta/api.lua',
|
||||
'runtime/lua/vim/re.lua',
|
||||
'runtime/lua/coxpcall.lua',
|
||||
'src/nvim/eval.lua',
|
||||
}
|
||||
|
31
.luarc.json
31
.luarc.json
@ -1,31 +0,0 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json",
|
||||
"runtime": {
|
||||
"version": "LuaJIT"
|
||||
},
|
||||
"workspace": {
|
||||
"library": [
|
||||
"runtime/lua",
|
||||
"${3rd}/busted/library",
|
||||
"${3rd}/luv/library"
|
||||
],
|
||||
"ignoreDir": [
|
||||
"test"
|
||||
],
|
||||
"checkThirdParty": "Disable"
|
||||
},
|
||||
"diagnostics": {
|
||||
"groupFileStatus": {
|
||||
"strict": "Opened",
|
||||
"strong": "Opened"
|
||||
},
|
||||
"groupSeverity": {
|
||||
"strong": "Warning",
|
||||
"strict": "Warning"
|
||||
},
|
||||
"unusedLocalExclude": [ "_*" ],
|
||||
"disable": [
|
||||
"luadoc-miss-see-name"
|
||||
]
|
||||
}
|
||||
}
|
143
.mailmap
143
.mailmap
@ -1,143 +0,0 @@
|
||||
Abdelhakeem <abdelhakeem.osama@hotmail.com> Abdelhakeem Osama
|
||||
Alvaro Muñoz <alvaro@pwntester.com> Alvaro Muñoz
|
||||
Andreas Johansson <andreas@ndrs.xyz> <ndreas@users.noreply.github.com>
|
||||
Andrew Pyatkov <mrbiggfoot@gmail.com> <mrbiggfoot@users.noreply.github.com>
|
||||
Anmol Sethi <hi@nhooyr.io> <anmol@aubble.com>
|
||||
Anmol Sethi <hi@nhooyr.io> <me@anmol.io>
|
||||
Anmol Sethi <hi@nhooyr.io> <nhooyr@users.noreply.github.com>
|
||||
BK1603 <chouhan.shreyansh2702@gmail.com> Shreyansh Chouhan
|
||||
Billy Su <g4691821@gmail.com> Billy SU
|
||||
Billy Vong <billyvg@gmail.com> <billyvg@users.noreply.github.com>
|
||||
Carlos Hernandez <carlos@techbyte.ca> <hurricanehrndz@users.noreply.github.com>
|
||||
Chris Kipp <ckipp@pm.me> ckipp01
|
||||
Christian Clason <c.clason@uni-graz.at> <christian.clason@uni-due.de>
|
||||
Cédric Barreteau <> <cbarrete@users.noreply.github.com>
|
||||
Dan Aloni <alonid@gmail.com> <dan@kernelim.com>
|
||||
Daniel Hahler <git@thequod.de> <github@thequod.de>
|
||||
Eisuke Kawashima <e-kwsm@users.noreply.github.com> E Kawashima
|
||||
ElPiloto <luis.r.piloto@gmail.com> Luis Piloto
|
||||
Eliseo Martínez <eliseomarmol@gmail.com> Eliseo Martínez
|
||||
Fabian Viöl <f.vioel@googlemail.com> Fabian
|
||||
Florian Walch <florian@fwalch.com> <fwalch@users.noreply.github.com>
|
||||
Gabriel Cruz <gabs.oficial98@gmail.com> <LTKills@users.noreply.github.com>
|
||||
Gaelan Steele <gbs@canishe.com> Gaelan
|
||||
Gavin D. Howard <gavin@schedmd.com> <yzena.tech@gmail.com>
|
||||
George Zhao <zhaozg@gmail.com> <zhaozg@aliyun.com>
|
||||
George Zhao <zhaozg@gmail.com> George Zhao
|
||||
Gregory Anders <greg@gpanders.com> <8965202+gpanders@users.noreply.github.com>
|
||||
Gregory Anders <greg@gpanders.com> Greg Anders
|
||||
Grzegorz Milka <grzegorzmilka@gmail.com> Grzegorz
|
||||
Harm te Hennepe <dhtehennepe@gmail.com> <d.h.tehennepe@student.utwente.nl>
|
||||
Harm te Hennepe <dhtehennepe@gmail.com> <harm@tehennepe.org>
|
||||
Hirokazu Hata <h.hata.ai.t@gmail.com> <h-michael@users.noreply.github.com>
|
||||
Ihor Antonov <ngortheone@gmail.com> <ngortheone@users.noreply.github.com>
|
||||
J Phani Mahesh <phanimahesh@gmail.com> <github@phanimahesh.me>
|
||||
Jack Bracewell <FriedSock@users.noreply.github.com> <jack.bracewell@unboxedconsulting.com>
|
||||
Jack Bracewell <FriedSock@users.noreply.github.com> <jbtwentythree@gmail.com>
|
||||
Jacques Germishuys <jacquesg@striata.com> <jacquesg@users.noreply.github.com>
|
||||
Jaehwang Jung <tomtomjhj@gmail.com> Jaehwang Jerry Jung
|
||||
Jakub Łuczyński <doubleloop@o2.pl> <doubleloop@users.noreply.github.com>
|
||||
James McCoy <jamessan@jamessan.com> <vega.james@gmail.com>
|
||||
Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> <janedmundlazo@hotmail.com>
|
||||
Jan Viljanen <jan.a.viljanen@gmail.com> <jan.viljanen@greenpeace.org>
|
||||
Javier Lopez <graulopezjavier@gmail.com> Javier López
|
||||
Jit Yao Yap <jityao@gmail.com> <jityao+github@gmail.com>
|
||||
Jit Yao Yap <jityao@gmail.com> Jit
|
||||
John Gehrig <jdg.gehrig@gmail.com> <jgehrig@users.noreply.github.com>
|
||||
John Schmidt <john.schmidt.h@gmail.com> John
|
||||
John Szakmeister <john@szakmeister.net> <jszakmeister@users.noreply.github.com>
|
||||
Jonathan de Boyne Pollard <J.deBoynePollard-newsgroups@NTLWorld.com> <jdebp@users.noreply.github.com>
|
||||
Jonathan de Boyne Pollard <J.deBoynePollard-newsgroups@NTLWorld.com> <postmaster@localhost>
|
||||
Jurica Bradaric <jbradaric@gmail.com> <jbradaric@users.noreply.github.com>
|
||||
Jurica Bradaric <jbradaric@gmail.com> <jurica.bradaric@avl.com>
|
||||
KillTheMule <KillTheMule@users.noreply.github.com> <github@pipsfrank.de>
|
||||
Kwon-Young Choi <kwon-young.choi@hotmail.fr> Kwon-Young
|
||||
Lewis Russell <lewis6991@gmail.com> <me@lewisr.dev>
|
||||
Lucas Hoffmann <l-m-h@web.de> <lucc@posteo.de>
|
||||
Lucas Hoffmann <l-m-h@web.de> <lucc@users.noreply.github.com>
|
||||
Luuk van Baal <luukvbaal@gmail.com> <31730729+luukvbaal@users.noreply.github.com>
|
||||
Luuk van Baal <luukvbaal@gmail.com> luukvbaal
|
||||
Marco Hinz <mh.codebro@gmail.com> <mh.codebro+github@gmail.com>
|
||||
Marvim the Paranoid Android <marvim@users.noreply.github.com> marvim
|
||||
Mateusz Czapliński <czapkofan@gmail.com> Mateusz Czaplinski
|
||||
Mathias Fussenegger <f.mathias@zignar.net> <mfussenegger@users.noreply.github.com>
|
||||
Mathias Fussenegger <f.mathias@zignar.net> Mathias Fußenegger
|
||||
Matt Wozniski <godlygeek@gmail.com> <godlygeek+git@gmail.com>
|
||||
Matthieu Coudron <mattator@gmail.com> <coudron@iij.ad.jp>
|
||||
Matthieu Coudron <mattator@gmail.com> <matthieu.coudron@upmc.fr>
|
||||
Matthieu Coudron <mattator@gmail.com> <mcoudron@hotmail.com>
|
||||
Matthieu Coudron <mattator@gmail.com> <teto@users.noreply.github.com>
|
||||
MichaHoffmann <michoffmann.potsdam@gmail.com> Michael Hoffmann
|
||||
MichaHoffmann <michoffmann.potsdam@gmail.com> micha
|
||||
Michael Ennen <mike.ennen@gmail.com> <brcolow@users.noreply.github.com>
|
||||
Michael Ennen <mike.ennen@gmail.com> brcolow
|
||||
Michael Reed <m.reed@mykolab.com> <Pyrohh@users.noreply.github.com>
|
||||
Michael Schupikov <michael@schupikov.de> <DarkDeepBlue@users.noreply.github.com>
|
||||
Nicolas Hillegeer <nicolas@hillegeer.com> <nicolashillegeer@gmail.com>
|
||||
Panashe M. Fundira <fundirap@gmail.com> Panashe Fundira
|
||||
Patrice Peterson <patrice.peterson@mailbox.org> runiq
|
||||
Pavel Platto <hinidu@gmail.com> Hinidu
|
||||
Petter Wahlman <petter@wahlman.no> <pwahlman@cisco.com>
|
||||
Poh Zi How <poh.zihow@gmail.com> pohzipohzi
|
||||
Rich Wareham <rjw57@cam.ac.uk> <rjw57@cantab.net>
|
||||
Rui Abreu Ferreira <equalsraf@users.noreply.github.com> @equalsraf
|
||||
Rui Abreu Ferreira <raf-ep@gmx.com> <equalsraf@users.noreply.github.com>
|
||||
Rui Abreu Ferreira <raf-ep@gmx.com> <rap-ep@gmx.com>
|
||||
Sam Wilson <tecywiz121@hotmail.com> <sawilson@akamai.com>
|
||||
Sander Bosma <sanderbosma@gmail.com> sander2
|
||||
Santos Gallegos <stsewd@protonmail.com> <santos_g@outlook.com>
|
||||
Sebastian Parborg <darkdefende@gmail.com> DarkDefender
|
||||
Shirasaka <tk.shirasaka@gmail.com> tk-shirasaka
|
||||
Shota <shotat@users.noreply.github.com> shotat
|
||||
Shougo Matsushita <Shougo.Matsu@gmail.com> Shougo
|
||||
Stephan Seitz <stephan.seitz@fau.de> <stephan.lauf@yahoo.de>
|
||||
Steven Sojka <Steven.Sojka@tdameritrade.com> <steelsojka@gmail.com>
|
||||
Steven Sojka <steelsojka@gmail.com> <steelsojka@users.noreply.github.com>
|
||||
TJ DeVries <devries.timothyj@gmail.com> <timothydvrs1234@gmail.com>
|
||||
Thomas Fehér <thomas.feher@yahoo.de> <thomasfeher@web.de>
|
||||
Thomas Vigouroux <thomas.vigouroux@protonmail.com> <tomvig38@gmail.com> <39092278+vigoux@users.noreply.github.com>
|
||||
Utkarsh Maheshwari <UtkarshME96@gmail.com> UTkarsh Maheshwari
|
||||
Utkarsh Maheshwari <utkarshme96@gmail.com> <UtkarshME96@gmail.com>
|
||||
VVKot <volodymyr.kot.ua@gmail.com> Volodymyr Kot
|
||||
Victor Adam <victor.adam@cofelyineo-gdfsuez.com> <Victor.Adam@derpymail.org>
|
||||
Wang Shidong <wsdjeg@outlook.com> <wsdjeg@users.noreply.github.com>
|
||||
Wei Huang <daviseago@gmail.com> davix
|
||||
Xu Cheng <xucheng@me.com> <xu-cheng@users.noreply.github.com>
|
||||
Yamakaky <yamakaky@gmail.com> <yamakaky@yamaworld.fr>
|
||||
Yegappan Lakshmanan <yegappan@yahoo.com> <4298407+yegappan@users.noreply.github.com>
|
||||
Yichao Zhou <broken.zhoug@gmail.com> Yichao Zhou <broken.zhou@gmail.com>
|
||||
Yichao Zhou <broken.zhoug@gmail.com> zhou13 <broken.zhou@gmail.com>
|
||||
Yorick Peterse <git@yorickpeterse.com> <yorick@yorickpeterse.com>
|
||||
ZyX <kp-pav@yandex.ru> <kp-pav@ya.ru>
|
||||
ZyX <kp-pav@yandex.ru> Nikolai Aleksandrovich Pavlov
|
||||
aph <a.hewson@gmail.com> Ashley Hewson
|
||||
bfredl <bjorn.linse@gmail.com>
|
||||
butwerenotthereyet <58348703+butwerenotthereyet@users.noreply.github.com> We're Yet
|
||||
chemzqm <chemzqm@gmail.com> Qiming zhao
|
||||
chentau <tchen1998@gmail.com> Tony Chen
|
||||
dedmass <carlo.abelli@gmail.com> Carlo Abelli
|
||||
dundargoc <gocdundar@gmail.com> <33953936+dundargoc@users.noreply.github.com>
|
||||
dundargoc <gocdundar@gmail.com> Dundar Goc
|
||||
equal-l2 <eng.equall2@gmail.com> <equal-l2@users.noreply.github.com>
|
||||
francisco souza <fsouza@users.noreply.github.com> <108725+fsouza@users.noreply.github.com>
|
||||
glacambre <code@lacamb.re> <me@r4>
|
||||
glacambre <code@lacamb.re> Ghjuvan Lacambre
|
||||
glepnir <glephunter@gmail.com> Raphael
|
||||
glepnir <glepnir@gopherhub.org> Raphael
|
||||
glepnir <glepnir@neovim.pro> Raphael
|
||||
ii14 <ii14@users.noreply.github.com> <59243201+ii14@users.noreply.github.com>
|
||||
jdrouhard <john@jmdtech.org> <github@jmdtech.org>
|
||||
kuuote <znmxodq1@gmail.com> <36663503+kuuote@users.noreply.github.com>
|
||||
matveyt <matthewtarasov@gmail.com> <35012635+matveyt@users.noreply.github.com>
|
||||
nate <nateozemon@gmail.com> nateozem
|
||||
ray-x <rayx.cn@gmail.com> rayx
|
||||
relnod <mail@paul-schiffers.de> <relnod@users.noreply.github.com>
|
||||
rockerBOO <rockerboo@gmail.com> Dave Lage
|
||||
rpigott <rpigott@berkeley.edu> Ronan Pigott
|
||||
sach1t <sach0010t@gmail.com> <sach1t@users.noreply.github.com>
|
||||
shade-of-noon <73705427+shade-of-noon@users.noreply.github.com> Edwin Pujols
|
||||
shadmansaleh <shadmansaleh3@gmail.com> <13149513+shadmansaleh@users.noreply.github.com>
|
||||
shadmansaleh <shadmansaleh3@gmail.com> Shadman
|
||||
sohnryang <loop.infinitely@gmail.com> 손량
|
||||
timeyyy <timeyyy_da_man@hotmail.com> Timothy C Eichler
|
||||
timeyyy <timeyyy_da_man@hotmail.com> timothy eichler
|
@ -1,6 +0,0 @@
|
||||
column_width = 100
|
||||
line_endings = "Unix"
|
||||
indent_type = "Spaces"
|
||||
indent_width = 2
|
||||
quote_style = "AutoPreferSingle"
|
||||
call_parentheses = "Input"
|
@ -1,14 +0,0 @@
|
||||
/build/
|
||||
/.deps/
|
||||
/runtime/lua/coxpcall.lua
|
||||
/runtime/lua/vim/_meta
|
||||
/runtime/lua/vim/re.lua
|
||||
|
||||
test/functional/ui/decorations_spec.lua
|
||||
test/functional/ui/float_spec.lua
|
||||
test/functional/ui/multigrid_spec.lua
|
||||
/test/functional/fixtures/lua/syntax_error.lua
|
||||
/test/functional/legacy/030_fileformats_spec.lua
|
||||
/test/functional/legacy/044_099_regexp_multibyte_magic_spec.lua
|
||||
/test/functional/legacy/093_mksession_cursor_cols_latin1_spec.lua
|
||||
/test/functional/lua/luaeval_spec.lua
|
220
.travis.yml
Normal file
220
.travis.yml
Normal file
@ -0,0 +1,220 @@
|
||||
dist: bionic
|
||||
|
||||
language: c
|
||||
|
||||
env:
|
||||
global:
|
||||
# Encrypted environment variables, see
|
||||
# http://docs.travis-ci.com/user/encryption-keys/
|
||||
#
|
||||
# SNAP_SECRET_KEY: generated by:
|
||||
# travis encrypt SNAP_SECRET_KEY=xx --add
|
||||
# https://github.com/neovim/neovim/pull/11428
|
||||
# snapcraft key expires after 1 year. Steps to refresh it:
|
||||
# 1. snapcraft enable-ci travis --refresh
|
||||
# 2. mv .snapcraft/travis_snapcraft.cfg ci/snap/travis_snapcraft.cfg
|
||||
# 3. Copy after_success command to ci/snap/deploy.sh from .travis.yml
|
||||
# 4. Undo changes to .travis.yml
|
||||
- secure: hd0qn2u8ABbJg5Bx4pBRcUQbKYFmcSHoecyHIPTCnGJT+NI41Bvm/IkN/N5DhBF+LbD3Q2nmR/dzI5H/dqS7RxMFvEx1DuFLendFHHX3MYf0AuKpXYY3gwgMTmqx8p/v6srlU7RBGWNGzHCWqksAem+EIWCe3I7WvfdKo1/DV/Y=
|
||||
|
||||
- PATH="$HOME/.local/bin:$PATH"
|
||||
# Set "false" to force rebuild of third-party dependencies.
|
||||
- CACHE_ENABLE=true
|
||||
# Build directory for Neovim.
|
||||
- BUILD_DIR="$TRAVIS_BUILD_DIR/build"
|
||||
# Build directory for third-party dependencies.
|
||||
- DEPS_BUILD_DIR="$HOME/nvim-deps"
|
||||
# Install directory for Neovim.
|
||||
- INSTALL_PREFIX="$HOME/nvim-install"
|
||||
# Log directory for Clang sanitizers and Valgrind.
|
||||
- LOG_DIR="$BUILD_DIR/log"
|
||||
# Nvim log file.
|
||||
- NVIM_LOG_FILE="$BUILD_DIR/.nvimlog"
|
||||
# Default CMake flags.
|
||||
- CMAKE_FLAGS="-DCI_BUILD=ON
|
||||
-DCMAKE_BUILD_TYPE=Debug
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX
|
||||
-DBUSTED_OUTPUT_TYPE=nvim
|
||||
-DDEPS_PREFIX=$DEPS_BUILD_DIR/usr
|
||||
-DMIN_LOG_LEVEL=3"
|
||||
- DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_GPERF=OFF"
|
||||
# Environment variables for Clang sanitizers.
|
||||
- ASAN_OPTIONS="detect_leaks=1:check_initialization_order=1:log_path=$LOG_DIR/asan"
|
||||
- TSAN_OPTIONS="log_path=$LOG_DIR/tsan"
|
||||
- UBSAN_OPTIONS="print_stacktrace=1 log_path=$LOG_DIR/ubsan"
|
||||
# Environment variables for Valgrind.
|
||||
- VALGRIND_LOG="$LOG_DIR/valgrind-%p.log"
|
||||
- CACHE_NVIM_DEPS_DIR="$HOME/.cache/nvim-deps"
|
||||
# If this file exists, the cache is valid (compile was successful).
|
||||
- CACHE_MARKER="$CACHE_NVIM_DEPS_DIR/.ci_cache_marker"
|
||||
# default target name for functional tests
|
||||
- FUNCTIONALTEST=functionaltest
|
||||
- CI_TARGET=tests
|
||||
# Environment variables for ccache
|
||||
- CCACHE_COMPRESS=1
|
||||
- CCACHE_SLOPPINESS=time_macros,file_macro
|
||||
- CCACHE_BASEDIR="$TRAVIS_BUILD_DIR"
|
||||
- CI_OS_NAME="$TRAVIS_OS_NAME"
|
||||
|
||||
anchors:
|
||||
envs: &common-job-env
|
||||
# Do not fall back to cache for "master" for PR on "release" branch:
|
||||
# adds the target branch to the cache key.
|
||||
FOR_TRAVIS_CACHE=v1-$TRAVIS_BRANCH
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages: &common-apt-packages
|
||||
- apport
|
||||
- autoconf
|
||||
- automake
|
||||
- build-essential
|
||||
- clang
|
||||
- cmake
|
||||
- cpanminus
|
||||
- cscope
|
||||
- gcc-multilib
|
||||
- gdb
|
||||
- gperf
|
||||
- language-pack-tr
|
||||
- libtool-bin
|
||||
- locales
|
||||
- ninja-build
|
||||
- pkg-config
|
||||
- unzip
|
||||
- valgrind
|
||||
- xclip
|
||||
homebrew:
|
||||
update: true
|
||||
casks:
|
||||
- powershell
|
||||
packages:
|
||||
- ccache
|
||||
- cpanminus
|
||||
- ninja
|
||||
- perl
|
||||
|
||||
jobs:
|
||||
include:
|
||||
- name: gcc-coverage (gcc 9)
|
||||
os: linux
|
||||
compiler: gcc-9
|
||||
env:
|
||||
- GCOV=gcov-9
|
||||
- CMAKE_FLAGS="$CMAKE_FLAGS -DUSE_GCOV=ON"
|
||||
- GCOV_ERROR_FILE="/tmp/libgcov-errors.log"
|
||||
- USE_LUACOV=1
|
||||
- BUSTED_ARGS="--coverage"
|
||||
- *common-job-env
|
||||
addons:
|
||||
snaps:
|
||||
- name: powershell
|
||||
confinement: classic
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: 'ppa:ubuntu-toolchain-r/test'
|
||||
packages:
|
||||
- *common-apt-packages
|
||||
- gcc-9
|
||||
- name: gcc-functionaltest-lua
|
||||
os: linux
|
||||
compiler: gcc
|
||||
env:
|
||||
- FUNCTIONALTEST=functionaltest-lua
|
||||
- CMAKE_FLAGS="$CMAKE_FLAGS -DPREFER_LUA=ON"
|
||||
- DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -DUSE_BUNDLED_LUAJIT=OFF"
|
||||
- *common-job-env
|
||||
- name: gcc-32bit
|
||||
os: linux
|
||||
# Travis creates a cache per compiler. Set a different value here to
|
||||
# store 32-bit dependencies in a separate cache.
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_32BIT=ON
|
||||
- CMAKE_FLAGS="$CMAKE_FLAGS -m32 -DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake"
|
||||
- DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -m32 -DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake"
|
||||
- *common-job-env
|
||||
- name: big-endian
|
||||
os: linux
|
||||
arch: s390x
|
||||
compiler: gcc
|
||||
env:
|
||||
- FUNCTIONALTEST=functionaltest-lua
|
||||
- CMAKE_FLAGS="$CMAKE_FLAGS -DPREFER_LUA=ON"
|
||||
- DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -DUSE_BUNDLED_LUAJIT=OFF"
|
||||
- *common-job-env
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- *common-apt-packages
|
||||
- gettext
|
||||
- python-pip
|
||||
- python3-pip
|
||||
- python-setuptools
|
||||
- python3-setuptools
|
||||
- python-dev
|
||||
- python3-dev
|
||||
- if: type != pull_request
|
||||
name: snap
|
||||
os: linux
|
||||
env:
|
||||
- LC_ALL: C.UTF-8
|
||||
- LANG: C.UTF-8
|
||||
- SNAPCRAFT_ENABLE_SILENT_REPORT: y
|
||||
- SNAPCRAFT_ENABLE_DEVELOPER_DEBUG: y
|
||||
- SNAPCRAFT_BUILD_ENVIRONMENT: lxd
|
||||
addons:
|
||||
snaps:
|
||||
- name: snapcraft
|
||||
channel: stable
|
||||
classic: true
|
||||
- name: http
|
||||
- name: transfer
|
||||
- name: lxd
|
||||
channel: stable
|
||||
# Override default before_install, before_cache.
|
||||
before_install: /bin/true
|
||||
before_cache: /bin/true
|
||||
install: ci/snap/install.sh
|
||||
before_script: echo "Building snap..."
|
||||
script: ci/snap/script.sh
|
||||
after_success: ci/snap/after_success.sh
|
||||
deploy:
|
||||
skip_cleanup: true
|
||||
provider: script
|
||||
script: ci/snap/deploy.sh
|
||||
on:
|
||||
branch: master
|
||||
allow_failures:
|
||||
- env:
|
||||
- LC_ALL: C.UTF-8
|
||||
- LANG: C.UTF-8
|
||||
- SNAPCRAFT_ENABLE_SILENT_REPORT: y
|
||||
- SNAPCRAFT_ENABLE_DEVELOPER_DEBUG: y
|
||||
- SNAPCRAFT_BUILD_ENVIRONMENT: lxd
|
||||
fast_finish: true
|
||||
|
||||
before_install: ci/before_install.sh
|
||||
install: ci/install.sh
|
||||
before_script: ci/before_script.sh
|
||||
script: ci/script.sh
|
||||
before_cache: ci/before_cache.sh
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- /^release-\d+\.\d+$/
|
||||
|
||||
cache:
|
||||
apt: true
|
||||
ccache: true
|
||||
directories:
|
||||
- "$CACHE_NVIM_DEPS_DIR"
|
||||
|
||||
git:
|
||||
quiet: true
|
||||
|
||||
notifications:
|
||||
webhooks:
|
||||
urls:
|
||||
- https://webhooks.gitter.im/e/b5c38c99f9677aa3d031
|
@ -1,15 +1,8 @@
|
||||
*backers.txt* Nvim
|
||||
# Bountysource Backers
|
||||
|
||||
Thank you to everyone who backed our [Bountysource fundraiser](https://www.bountysource.com/teams/neovim/fundraiser)!
|
||||
|
||||
NVIM REFERENCE MANUAL
|
||||
|
||||
|
||||
==============================================================================
|
||||
Fundraiser Backers
|
||||
|
||||
Thank you to everyone who backed the original Neovim Fundraiser.
|
||||
|
||||
LIST OF BACKERS
|
||||
### Your name and URL in BACKERS.md.
|
||||
|
||||
- [Bob Breznak](http://brez.io)
|
||||
- [Tim Uruski](http://timuruski.net)
|
||||
@ -230,7 +223,7 @@ LIST OF BACKERS
|
||||
- BenBergman
|
||||
- Bengt Lüers
|
||||
- Benjamin Bryant
|
||||
- Bèr "berkes" Kessels
|
||||
- Bèr 'berkes' Kessels
|
||||
- Bernd Homuth
|
||||
- Bheesham Persaud
|
||||
- Bilal Quadri
|
||||
@ -466,7 +459,7 @@ LIST OF BACKERS
|
||||
- Matthias Lehmann
|
||||
- Maximilian Gerlach
|
||||
- Meryn Stol
|
||||
- Michael "manveru" Fellinger
|
||||
- Michael 'manveru' Fellinger
|
||||
- Michael "beefsack" Alexander
|
||||
- Michael Iles
|
||||
- Michael Irwin/mdi
|
||||
@ -648,9 +641,6 @@ LIST OF BACKERS
|
||||
- Ziling Zhao
|
||||
- Zsolt Botykai
|
||||
|
||||
ANONYMOUS SUPPORTERS
|
||||
### Anonymous Supporters
|
||||
|
||||
There were also 307 other people who didn't claim any level of reward but
|
||||
contributed to the fundraiser. Thank you all for the support!
|
||||
|
||||
vim:tw=78:ts=8:et:ft=help:norl:
|
||||
There were also 307 other people who didn't claim any level of reward but contributed to the fundraiser. Thank you all for the support!
|
451
BUILD.md
451
BUILD.md
@ -1,451 +0,0 @@
|
||||
- **IMPORTANT**: Before upgrading to a new version, **always check for [breaking changes](https://neovim.io/doc/user/news.html#news-breaking).**
|
||||
|
||||
|
||||
## Quick start
|
||||
|
||||
1. Install [build prerequisites](#build-prerequisites) on your system
|
||||
2. `git clone https://github.com/neovim/neovim`
|
||||
3. `cd neovim && make CMAKE_BUILD_TYPE=RelWithDebInfo`
|
||||
- If you want the **stable release**, also run `git checkout stable`.
|
||||
- If you want to install to a custom location, set `CMAKE_INSTALL_PREFIX`. See also [INSTALL.md](./INSTALL.md#install-from-source).
|
||||
- On BSD, use `gmake` instead of `make`.
|
||||
- To build on Windows, see the [Building on Windows](#building-on-windows) section. _MSVC (Visual Studio) is recommended._
|
||||
4. `sudo make install`
|
||||
- Default install location is `/usr/local`
|
||||
- On Debian/Ubuntu, instead of installing files directly with `sudo make install`, you can run `cd build && cpack -G DEB && sudo dpkg -i nvim-linux64.deb` to build DEB-package and install it. This should help ensuring the clean removal of installed files.
|
||||
|
||||
**Notes**:
|
||||
- From the repository's root directory, running `make` will download and build all the needed dependencies and put the `nvim` executable in `build/bin`.
|
||||
- Third-party dependencies (libuv, LuaJIT, etc.) are downloaded automatically to `.deps/`. See the [FAQ](https://neovim.io/doc/user/faq.html#faq-build) if you have issues.
|
||||
- After building, you can run the `nvim` executable without installing it by running `VIMRUNTIME=runtime ./build/bin/nvim`.
|
||||
- If you plan to develop Neovim, install [Ninja](https://ninja-build.org/) for faster builds. It will automatically be used.
|
||||
- Install [ccache](https://ccache.dev/) for faster rebuilds of Neovim. It's used by default. To disable it, use `CCACHE_DISABLE=true make`.
|
||||
|
||||
## Running tests
|
||||
|
||||
See [test/README.md](https://github.com/neovim/neovim/blob/master/test/README.md).
|
||||
|
||||
## Building
|
||||
|
||||
First make sure you installed the [build prerequisites](#build-prerequisites). Now that you have the dependencies, you can try other build targets explained below.
|
||||
|
||||
The _build type_ determines the level of used compiler optimizations and debug information:
|
||||
|
||||
- `Release`: Full compiler optimizations and no debug information. Expect the best performance from this build type. Often used by package maintainers.
|
||||
- `Debug`: Full debug information; few optimizations. Use this for development to get meaningful output from debuggers like GDB or LLDB. This is the default if `CMAKE_BUILD_TYPE` is not specified.
|
||||
- `RelWithDebInfo` ("Release With Debug Info"): Enables many optimizations and adds enough debug info so that when Neovim ever crashes, you can still get a backtrace.
|
||||
|
||||
So, for a release build, just use:
|
||||
|
||||
```
|
||||
make CMAKE_BUILD_TYPE=Release
|
||||
```
|
||||
(Do not add a `-j` flag if `ninja` is installed! The build will be in parallel automatically.)
|
||||
|
||||
Afterwards, the `nvim` executable can be found in `build/bin`. To verify the build type after compilation, run:
|
||||
|
||||
```sh
|
||||
./build/bin/nvim --version | grep ^Build
|
||||
```
|
||||
|
||||
To install the executable to a certain location, use:
|
||||
|
||||
```
|
||||
make CMAKE_INSTALL_PREFIX=$HOME/local/nvim install
|
||||
```
|
||||
|
||||
CMake, our main build system, caches a lot of things in `build/CMakeCache.txt`. If you ever want to change `CMAKE_BUILD_TYPE` or `CMAKE_INSTALL_PREFIX`, run `rm -rf build` first. This is also required when rebuilding after a Git commit adds or removes files (including from `runtime`) — when in doubt, run `make distclean` (which is basically a shortcut for `rm -rf build .deps`).
|
||||
|
||||
By default (`USE_BUNDLED=1`), Neovim downloads and statically links its needed dependencies. In order to be able to use a debugger on these libraries, you might want to compile them with debug information as well:
|
||||
|
||||
<!-- THIS CAUSES SCREEN INTERFERENCE
|
||||
```
|
||||
make distclean
|
||||
VERBOSE=1 DEBUG=1 make deps
|
||||
```
|
||||
-->
|
||||
```
|
||||
make distclean
|
||||
make deps
|
||||
```
|
||||
|
||||
## Building on Windows
|
||||
|
||||
### Windows / MSVC
|
||||
|
||||
**MSVC (Visual Studio) is the recommended way to build on Windows.** These steps were confirmed as of 2023.
|
||||
|
||||
1. Install [Visual Studio](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community) (2017 or later) with the _Desktop development with C++_ workload.
|
||||
- On 32-bit Windows, you will need [this workaround](https://developercommunity.visualstudio.com/content/problem/212989/ninja-binary-format.html).
|
||||
2. Open the Neovim project folder.
|
||||
- Visual Studio should detect the cmake files and automatically start building...
|
||||
3. Choose the `nvim.exe (bin\nvim.exe)` target and hit F5.
|
||||
- If the build fails, it may be because Visual Studio started the build with `x64-{Debug,Release}` before you switched the configuration to `x86-Release`.
|
||||
- Right-click _CMakeLists.txt → Delete Cache_.
|
||||
- Right-click _CMakeLists.txt → Generate Cache_.
|
||||
- If you see an "access violation" from `ntdll`, you can ignore it and continue.
|
||||
4. If you set an error like `msgpackc.dll not found`, try the `nvim.exe (Install)` target. Then switch back to `nvim.exe (bin\nvim.exe)`.
|
||||
|
||||
### Windows / MSVC PowerShell
|
||||
|
||||
To build from the command line (i.e. invoke the `cmake` commands yourself),
|
||||
|
||||
1. Ensure you have the Visual Studio environment variables, using any of the following:
|
||||
- Using the [Visual Studio Developer Command Prompt or Visual Studio Developer PowerShell](https://learn.microsoft.com/en-us/visualstudio/ide/reference/command-prompt-powershell?view=vs-2022)
|
||||
- Invoking `Import-VisualStudioVars` in PowerShell from [this PowerShell module](https://github.com/Pscx/Pscx)
|
||||
- Invoking `VsDevCmd.bat` in Command Prompt
|
||||
```
|
||||
VsDevCmd.bat -arch=x64
|
||||
```
|
||||
This is to make sure that `luarocks` finds the Visual Studio installation, and doesn't fall back to MinGW with errors like:
|
||||
```
|
||||
'mingw32-gcc' is not recognized as an internal or external command
|
||||
```
|
||||
2. From the "Developer PowerShell" or "Developer Command Prompt":
|
||||
```
|
||||
cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=Release
|
||||
cmake --build .deps --config Release
|
||||
cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=Release
|
||||
cmake --build build --config Release
|
||||
```
|
||||
- Omit `--config Release` if you want a debug build.
|
||||
- Omit `-G Ninja` to use the "Visual Studio" generator.
|
||||
|
||||
### Windows / CLion
|
||||
|
||||
1. Install [CLion](https://www.jetbrains.com/clion/).
|
||||
2. Open the Neovim project in CLion.
|
||||
3. Select _Build → Build All in 'Release'_.
|
||||
|
||||
### Windows / Cygwin
|
||||
|
||||
Install all dependencies the normal way, then build Neovim the normal way for a random CMake application (i.e. do not use the `Makefile` that automatically downloads and builds "bundled" dependencies).
|
||||
|
||||
The `cygport` repo contains Cygport files (e.g. `APKBUILD`, `PKGBUILD`) for all the dependencies not available in the Cygwin distribution, and describes any special commands or arguments needed to build. The Cygport definitions also try to describe the required dependencies for each one. Unless custom commands are provided, Cygport just calls `autogen`/`cmake`, `make`, `make install`, etc. in a clean and consistent way.
|
||||
|
||||
https://github.com/cascent/neovim-cygwin was built on Cygwin 2.9.0. Newer `libuv` should require slightly less patching. Some SSP stuff changed in Cygwin 2.10.0, so that might change things too when building Neovim.
|
||||
|
||||
|
||||
### Windows / MSYS2 / MinGW
|
||||
|
||||
1. From the MSYS2 shell, install these packages:
|
||||
```
|
||||
pacman -S \
|
||||
mingw-w64-x86_64-{gcc,cmake,make,ninja,diffutils}
|
||||
```
|
||||
2. From the Windows Command Prompt (`cmd.exe`), set up the `PATH` and build.
|
||||
|
||||
```cmd
|
||||
set PATH=c:\msys64\mingw64\bin;c:\msys64\usr\bin;%PATH%
|
||||
```
|
||||
3. You have two options:
|
||||
- Build using `cmake` and `Ninja` generator:
|
||||
```cmd
|
||||
cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
cmake --build .deps
|
||||
cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
cmake --build build
|
||||
```
|
||||
If you cannot install neovim with `ninja install` due to permission restriction, you can install neovim in a directory you have write access to.
|
||||
```cmd
|
||||
cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
cmake --build .deps
|
||||
cmake -B build -G Ninja -D CMAKE_INSTALL_PREFIX=C:\nvim -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
cmake --build build
|
||||
```
|
||||
- Or, alternatively, you can use `mingw32-make`:
|
||||
```cmd
|
||||
mingw32-make deps
|
||||
mingw32-make CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
:: Or you can do the previous command specifying a custom prefix
|
||||
:: (Default is C:\Program Files (x86)\nvim)
|
||||
:: mingw32-make CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_INSTALL_PREFIX=C:\nvim
|
||||
mingw32-make install
|
||||
```
|
||||
|
||||
## Localization
|
||||
|
||||
### Localization build
|
||||
|
||||
A normal build will create `.mo` files in `build/src/nvim/po`.
|
||||
|
||||
* If you see `msgfmt: command not found`, you need to install [`gettext`](http://en.wikipedia.org/wiki/Gettext). On most systems, the package is just called `gettext`.
|
||||
|
||||
### Localization check
|
||||
|
||||
To check the translations for `$LANG`, run `make -C build check-po-$LANG`. Examples:
|
||||
|
||||
```
|
||||
cmake --build build --target check-po-de
|
||||
cmake --build build --target check-po-pt_BR
|
||||
```
|
||||
|
||||
- `check-po-$LANG` generates a detailed report in `./build/src/nvim/po/check-${LANG}.log`. (The report is generated by `nvim`, not by `msgfmt`.)
|
||||
|
||||
### Localization update
|
||||
|
||||
To update the `src/nvim/po/$LANG.po` file with the latest strings, run the following:
|
||||
|
||||
```
|
||||
cmake --build build --target update-po-$LANG
|
||||
```
|
||||
|
||||
- **Note**: Run `src/nvim/po/cleanup.vim` after updating.
|
||||
|
||||
## Compiler options
|
||||
|
||||
To see the chain of includes, use the `-H` option ([#918](https://github.com/neovim/neovim/issues/918)):
|
||||
|
||||
```sh
|
||||
echo '#include "./src/nvim/buffer.h"' | \
|
||||
> clang -I.deps/usr/include -Isrc -std=c99 -P -E -H - 2>&1 >/dev/null | \
|
||||
> grep -v /usr/
|
||||
```
|
||||
|
||||
- `grep -v /usr/` is used to filter out system header files.
|
||||
- `-save-temps` can be added as well to see expanded macros or commented assembly.
|
||||
|
||||
## Custom Makefile
|
||||
|
||||
You can customize the build process locally by creating a `local.mk`, which is referenced at the top of the main `Makefile`. It's listed in `.gitignore`, so it can be used across branches. **A new target in `local.mk` overrides the default make-target.**
|
||||
|
||||
Here's a sample `local.mk` which adds a target to force a rebuild but *does not* override the default-target:
|
||||
|
||||
```make
|
||||
all:
|
||||
|
||||
rebuild:
|
||||
rm -rf build
|
||||
make
|
||||
```
|
||||
|
||||
## Third-party dependencies
|
||||
|
||||
Reference the [Debian package](https://packages.debian.org/sid/source/neovim) (or alternatively, the [Homebrew formula](https://github.com/Homebrew/homebrew-core/blob/master/Formula/neovim.rb)) for the precise list of dependencies/versions.
|
||||
|
||||
To build the bundled dependencies using CMake:
|
||||
|
||||
```sh
|
||||
cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
cmake --build .deps
|
||||
```
|
||||
|
||||
By default the libraries and headers are placed in `.deps/usr`. Now you can build Neovim:
|
||||
|
||||
```sh
|
||||
cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
cmake --build build
|
||||
```
|
||||
|
||||
### How to build without "bundled" dependencies
|
||||
|
||||
1. Manually install the dependencies:
|
||||
- libuv libluv libvterm luajit lua-lpeg lua-mpack msgpack-c tree-sitter tree-sitter-c tree-sitter-lua tree-sitter-markdown tree-sitter-query tree-sitter-vim tree-sitter-vimdoc unibilium
|
||||
2. Run CMake:
|
||||
```sh
|
||||
cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
cmake --build build
|
||||
```
|
||||
If all the dependencies are not available in the package, you can use only some of the bundled dependencies as follows (example of using `ninja`):
|
||||
```sh
|
||||
cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_BUNDLED=OFF -DUSE_BUNDLED_LIBVTERM=ON -DUSE_BUNDLED_TS=ON
|
||||
cmake --build .deps
|
||||
cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
cmake --build build
|
||||
```
|
||||
3. Run `make`, `ninja`, or whatever build tool you told CMake to generate.
|
||||
- Using `ninja` is strongly recommended.
|
||||
4. If treesitter parsers are not bundled, they need to be available in a `parser/` runtime directory (e.g. `/usr/share/nvim/runtime/parser/`).
|
||||
|
||||
#### Debian 10 (Buster) example:
|
||||
|
||||
```sh
|
||||
sudo apt install luajit libluajit-5.1-dev lua-mpack lua-lpeg libunibilium-dev libmsgpack-dev
|
||||
cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_BUNDLED=OFF -DUSE_BUNDLED_LIBUV=ON -DUSE_BUNDLED_LUV=ON -DUSE_BUNDLED_LIBVTERM=ON -DUSE_BUNDLED_TS=ON
|
||||
cmake --build .deps
|
||||
cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
cmake --build build
|
||||
```
|
||||
|
||||
#### Example of using a Makefile
|
||||
|
||||
- Example of using a package with all dependencies:
|
||||
```
|
||||
make USE_BUNDLED=OFF
|
||||
```
|
||||
- Example of using a package with some dependencies:
|
||||
```
|
||||
make BUNDLED_CMAKE_FLAG="-DUSE_BUNDLED=OFF -DUSE_BUNDLED_LUV=ON -DUSE_BUNDLED_TS=ON -DUSE_BUNDLED_LIBVTERM=ON -DUSE_BUNDLED_LIBUV=ON"
|
||||
```
|
||||
|
||||
## Build prerequisites
|
||||
|
||||
General requirements (see [#1469](https://github.com/neovim/neovim/issues/1469#issuecomment-63058312)):
|
||||
|
||||
- Clang or GCC version 4.9+
|
||||
- CMake version 3.13+, built with TLS/SSL support
|
||||
- Optional: Get the latest CMake from an [installer](https://github.com/Kitware/CMake/releases) or the [Python package](https://pypi.org/project/cmake/) (`pip install cmake`)
|
||||
|
||||
Platform-specific requirements are listed below.
|
||||
|
||||
### Ubuntu / Debian
|
||||
|
||||
```sh
|
||||
sudo apt-get install ninja-build gettext cmake unzip curl build-essential
|
||||
```
|
||||
|
||||
### RHEL / Fedora
|
||||
|
||||
```
|
||||
sudo dnf -y install ninja-build cmake gcc make unzip gettext curl glibc-gconv-extra
|
||||
```
|
||||
|
||||
### openSUSE
|
||||
|
||||
```
|
||||
sudo zypper install ninja cmake gcc-c++ gettext-tools curl
|
||||
```
|
||||
|
||||
### Arch Linux
|
||||
|
||||
```
|
||||
sudo pacman -S base-devel cmake unzip ninja curl
|
||||
```
|
||||
|
||||
### Alpine Linux
|
||||
|
||||
```
|
||||
apk add build-base cmake coreutils curl unzip gettext-tiny-dev
|
||||
```
|
||||
|
||||
### Void Linux
|
||||
|
||||
```
|
||||
xbps-install base-devel cmake curl git
|
||||
```
|
||||
|
||||
### NixOS / Nix
|
||||
|
||||
Starting from NixOS 18.03, the Neovim binary resides in the `neovim-unwrapped` Nix package (the `neovim` package being just a wrapper to setup runtime options like Ruby/Python support):
|
||||
|
||||
```sh
|
||||
cd path/to/neovim/src
|
||||
```
|
||||
|
||||
Drop into `nix-shell` to pull in the Neovim dependencies:
|
||||
|
||||
```
|
||||
nix-shell '<nixpkgs>' -A neovim-unwrapped
|
||||
```
|
||||
|
||||
Configure and build:
|
||||
|
||||
```sh
|
||||
rm -rf build && cmakeConfigurePhase
|
||||
buildPhase
|
||||
```
|
||||
|
||||
Tests are not available by default, because of some unfixed failures. You can enable them via adding this package in your overlay:
|
||||
```
|
||||
neovim-dev = (super.pkgs.neovim-unwrapped.override {
|
||||
doCheck=true;
|
||||
}).overrideAttrs(oa:{
|
||||
cmakeBuildType="debug";
|
||||
|
||||
nativeBuildInputs = oa.nativeBuildInputs ++ [ self.pkgs.valgrind ];
|
||||
shellHook = ''
|
||||
export NVIM_PYTHON_LOG_LEVEL=DEBUG
|
||||
export NVIM_LOG_FILE=/tmp/log
|
||||
export VALGRIND_LOG="$PWD/valgrind.log"
|
||||
'';
|
||||
});
|
||||
```
|
||||
and replacing `neovim-unwrapped` with `neovim-dev`:
|
||||
```
|
||||
nix-shell '<nixpkgs>' -A neovim-dev
|
||||
```
|
||||
|
||||
Neovim contains a Nix flake in the `contrib` folder, with 3 packages:
|
||||
- `neovim` to run the nightly
|
||||
- `neovim-debug` to run the package with debug symbols
|
||||
- `neovim-developer` to get all the tools to develop on `neovim`
|
||||
|
||||
Thus you can run Neovim nightly with `nix run github:neovim/neovim?dir=contrib`.
|
||||
Similarly to develop on Neovim: `nix develop github:neovim/neovim?dir=contrib#neovim-developer`.
|
||||
|
||||
### FreeBSD
|
||||
|
||||
```
|
||||
sudo pkg install cmake gmake sha unzip wget gettext curl
|
||||
```
|
||||
|
||||
If you get an error regarding a `sha256sum` mismatch, where the actual SHA-256 hash is `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`, then this is your issue (that's the `sha256sum` of an empty file).
|
||||
|
||||
### OpenBSD
|
||||
|
||||
```sh
|
||||
doas pkg_add gmake cmake unzip curl gettext-tools
|
||||
```
|
||||
|
||||
Build can sometimes fail when using the top level `Makefile`, apparently due to some third-party component (see [#2445-comment](https://github.com/neovim/neovim/issues/2445#issuecomment-108124236)). The following instructions use CMake:
|
||||
|
||||
```sh
|
||||
mkdir .deps
|
||||
cd .deps
|
||||
cmake ../cmake.deps/
|
||||
gmake
|
||||
cd ..
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
gmake
|
||||
```
|
||||
|
||||
### macOS
|
||||
|
||||
#### macOS / Homebrew
|
||||
|
||||
1. Install Xcode Command Line Tools: `xcode-select --install`
|
||||
2. Install [Homebrew](http://brew.sh)
|
||||
3. Install Neovim build dependencies:
|
||||
```
|
||||
brew install ninja cmake gettext curl
|
||||
```
|
||||
- **Note**: If you see Wget certificate errors (for older macOS versions less than 10.10):
|
||||
```sh
|
||||
brew install curl-ca-bundle
|
||||
echo CA_CERTIFICATE=$(brew --prefix curl-ca-bundle)/share/ca-bundle.crt >> ~/.wgetrc
|
||||
```
|
||||
- **Note**: If you see `'stdio.h' file not found`, try the following:
|
||||
```
|
||||
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
|
||||
```
|
||||
|
||||
#### macOS / MacPorts
|
||||
|
||||
1. Install Xcode Command Line Tools: `xcode-select --install`
|
||||
2. Install [MacPorts](http://www.macports.org)
|
||||
3. Install Neovim build dependencies:
|
||||
```
|
||||
sudo port install ninja cmake gettext
|
||||
```
|
||||
- **Note**: If you see Wget certificate errors (for older macOS versions less than 10.10):
|
||||
```sh
|
||||
sudo port install curl-ca-bundle
|
||||
echo CA_CERTIFICATE=/opt/local/share/curl/curl-ca-bundle.crt >> ~/.wgetrc
|
||||
```
|
||||
- **Note**: If you see `'stdio.h' file not found`, try the following:
|
||||
```
|
||||
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
|
||||
```
|
||||
|
||||
#### Building for older macOS versions
|
||||
|
||||
From a newer macOS version, to build for older macOS versions, you will have to set the macOS deployment target:
|
||||
|
||||
```
|
||||
make CMAKE_BUILD_TYPE=Release MACOSX_DEPLOYMENT_TARGET=10.13 DEPS_CMAKE_FLAGS="-DCMAKE_CXX_COMPILER=$(xcrun -find c++)"
|
||||
```
|
||||
|
||||
Note that the C++ compiler is explicitly set so that it can be found when the deployment target is set.
|
||||
|
826
CMakeLists.txt
826
CMakeLists.txt
@ -1,77 +1,45 @@
|
||||
# CMAKE REFERENCE
|
||||
# - intro: https://codingnest.com/basic-cmake/
|
||||
# - best practices (3.0+): https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1
|
||||
# - pitfalls: https://izzys.casa/2019/02/everything-you-never-wanted-to-know-about-cmake/
|
||||
# - troubleshooting:
|
||||
# - variable_watch https://cmake.org/cmake/help/latest/command/variable_watch.html
|
||||
|
||||
# Version should match the tested CMAKE_URL in .github/workflows/build.yml.
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
# Can be removed once minimum version is at least 3.15
|
||||
if(POLICY CMP0092)
|
||||
cmake_policy(SET CMP0092 NEW)
|
||||
endif()
|
||||
# intro: https://codingnest.com/basic-cmake/
|
||||
# best practices (3.0+): https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1
|
||||
|
||||
# Version should match the tested CMAKE_URL in .github/workflows/ci.yml.
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
project(nvim C)
|
||||
|
||||
if(POLICY CMP0135)
|
||||
cmake_policy(SET CMP0135 NEW)
|
||||
if(POLICY CMP0065)
|
||||
cmake_policy(SET CMP0065 NEW)
|
||||
endif()
|
||||
|
||||
if(XCODE)
|
||||
message(FATAL_ERROR [[Xcode generator is not supported. Use "Ninja" or "Unix Makefiles" instead]])
|
||||
if(POLICY CMP0060)
|
||||
cmake_policy(SET CMP0060 NEW)
|
||||
endif()
|
||||
|
||||
# Point CMake at any custom modules we may ship
|
||||
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckCSourceCompiles)
|
||||
include(CheckLibraryExists)
|
||||
include(ExternalProject)
|
||||
include(FindPackageHandleStandardArgs)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
include(Deps)
|
||||
include(Find)
|
||||
include(InstallHelpers)
|
||||
# We don't support building in-tree.
|
||||
include(PreventInTreeBuilds)
|
||||
include(Util)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# User settings
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
set(DEPS_IGNORE_SHA FALSE)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Variables
|
||||
#-------------------------------------------------------------------------------
|
||||
set(FUNCS_DATA ${PROJECT_BINARY_DIR}/funcs_data.mpack)
|
||||
set(TOUCHES_DIR ${PROJECT_BINARY_DIR}/touches)
|
||||
|
||||
file(GLOB DOCFILES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/runtime/doc/*.txt)
|
||||
|
||||
if(NOT CI_BUILD)
|
||||
set(CMAKE_INSTALL_MESSAGE NEVER)
|
||||
endif()
|
||||
|
||||
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()
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
# 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")
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
|
||||
# pkg-config 29.2 has a bug on OpenBSD which causes it to drop any paths that
|
||||
# *contain* system include paths. To avoid this, we prefix what would be
|
||||
# "/usr/include" as "/_usr/include".
|
||||
# This check is also performed in the third-party/CMakeLists.txt and in the
|
||||
# else clause following here.
|
||||
# https://github.com/neovim/neovim/pull/14745#issuecomment-860201794
|
||||
set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/_usr" CACHE PATH "Path prefix for finding dependencies")
|
||||
else()
|
||||
set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/usr" CACHE PATH "Path prefix for finding dependencies")
|
||||
endif()
|
||||
else()
|
||||
set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/usr" CACHE PATH "Path prefix for finding dependencies")
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
|
||||
set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/_usr" CACHE PATH "Path prefix for finding dependencies")
|
||||
else()
|
||||
set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/usr" CACHE PATH "Path prefix for finding dependencies")
|
||||
endif()
|
||||
# When running from within CLion or Visual Studio,
|
||||
# build bundled dependencies automatically.
|
||||
if(NOT EXISTS ${DEPS_PREFIX}
|
||||
@ -82,16 +50,16 @@ else()
|
||||
file(MAKE_DIRECTORY ${DEPS_BUILD_DIR})
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} -G ${CMAKE_GENERATOR}
|
||||
-D CMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
|
||||
-D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
|
||||
-D CMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
||||
-D CMAKE_C_FLAGS=${CMAKE_C_FLAGS}
|
||||
-D CMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}
|
||||
-D CMAKE_C_FLAGS_MINSIZEREL=${CMAKE_C_FLAGS_MINSIZEREL}
|
||||
-D CMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO}
|
||||
-D CMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}
|
||||
-D CMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
|
||||
${PROJECT_SOURCE_DIR}/cmake.deps
|
||||
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
|
||||
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
|
||||
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
||||
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
|
||||
-DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}
|
||||
-DCMAKE_C_FLAGS_MINSIZEREL=${CMAKE_C_FLAGS_MINSIZEREL}
|
||||
-DCMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO}
|
||||
-DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}
|
||||
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
|
||||
${PROJECT_SOURCE_DIR}/third-party
|
||||
WORKING_DIRECTORY ${DEPS_BUILD_DIR})
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} --build ${DEPS_BUILD_DIR}
|
||||
@ -100,27 +68,43 @@ else()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
list(INSERT CMAKE_PREFIX_PATH 0 ${DEPS_PREFIX})
|
||||
|
||||
if(APPLE)
|
||||
# If the macOS deployment target is not set manually (via $MACOSX_DEPLOYMENT_TARGET),
|
||||
# fall back to local system version. Needs to be done both here and in cmake.deps.
|
||||
if(NOT CMAKE_OSX_DEPLOYMENT_TARGET)
|
||||
execute_process(COMMAND sw_vers -productVersion
|
||||
OUTPUT_VARIABLE MACOS_VERSION
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "${MACOS_VERSION}")
|
||||
endif()
|
||||
message(STATUS "Using deployment target ${CMAKE_OSX_DEPLOYMENT_TARGET}")
|
||||
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()
|
||||
|
||||
if(WIN32 OR APPLE)
|
||||
# used for check_c_compiler_flag
|
||||
include(CheckCCompilerFlag)
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||
# CMake tries to treat /sw and /opt/local as extension of the system path, but
|
||||
# that doesn't really work out very well. Once you have a dependency that
|
||||
# resides there and have to add it as an include directory, then any other
|
||||
# dependency that could be satisfied from there must be--otherwise you can end
|
||||
# up with conflicting versions. So, let's make them more of a priority having
|
||||
# them be included as one of the first places to look for dependencies.
|
||||
list(APPEND CMAKE_PREFIX_PATH /sw /opt/local)
|
||||
|
||||
# Work around some old, broken detection by CMake for knowing when to use the
|
||||
# isystem flag. Apple's compilers have supported this for quite some time
|
||||
# now.
|
||||
if(CMAKE_COMPILER_IS_GNUCC)
|
||||
set(CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem ")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||
# Ignore case when comparing filenames on Windows and Mac.
|
||||
set(CASE_INSENSITIVE_FILENAME TRUE)
|
||||
# Enable fixing case-insensitive filenames for Windows and Mac.
|
||||
set(USE_FNAME_CASE TRUE)
|
||||
endif()
|
||||
|
||||
option(ENABLE_LIBINTL "enable libintl" ON)
|
||||
option(ENABLE_LIBICONV "enable libiconv" ON)
|
||||
if (MINGW)
|
||||
# Disable LTO by default as it may not compile
|
||||
# See https://github.com/Alexpux/MINGW-packages/issues/3516
|
||||
@ -129,53 +113,397 @@ if (MINGW)
|
||||
else()
|
||||
option(ENABLE_LTO "enable link time optimization" ON)
|
||||
endif()
|
||||
option(ENABLE_LIBINTL "enable libintl" ON)
|
||||
|
||||
message(STATUS "CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}")
|
||||
|
||||
set_default_buildtype(Debug)
|
||||
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if(NOT isMultiConfig)
|
||||
# Unlike build dependencies in cmake.deps, we assume we want dev dependencies
|
||||
# such as Uncrustify to always be built with Release.
|
||||
list(APPEND DEPS_CMAKE_ARGS -D CMAKE_BUILD_TYPE=Release)
|
||||
# Build type.
|
||||
if(NOT CMAKE_BUILD_TYPE)
|
||||
message(STATUS "CMAKE_BUILD_TYPE not specified, default is 'Debug'")
|
||||
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build" FORCE)
|
||||
else()
|
||||
message(STATUS "CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
|
||||
endif()
|
||||
if(CMAKE_BUILD_TYPE MATCHES Debug)
|
||||
set(DEBUG 1)
|
||||
else()
|
||||
set(DEBUG 0)
|
||||
endif()
|
||||
# Set available build types for CMake GUIs.
|
||||
# Other build types can still be set by -DCMAKE_BUILD_TYPE=...
|
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
|
||||
STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
|
||||
|
||||
# If not in a git repo (e.g., a tarball) these tokens define the complete
|
||||
# version string, else they are combined with the result of `git describe`.
|
||||
set(NVIM_VERSION_MAJOR 0)
|
||||
set(NVIM_VERSION_MINOR 10)
|
||||
set(NVIM_VERSION_PATCH 2)
|
||||
set(NVIM_VERSION_MINOR 6)
|
||||
set(NVIM_VERSION_PATCH 1)
|
||||
set(NVIM_VERSION_PRERELEASE "") # for package maintainers
|
||||
|
||||
# API level
|
||||
set(NVIM_API_LEVEL 12) # Bump this after any API change.
|
||||
set(NVIM_API_LEVEL 8) # Bump this after any API change.
|
||||
set(NVIM_API_LEVEL_COMPAT 0) # Adjust this after a _breaking_ API change.
|
||||
set(NVIM_API_PRERELEASE false)
|
||||
|
||||
set(NVIM_VERSION_BUILD_TYPE "${CMAKE_BUILD_TYPE}")
|
||||
# NVIM_VERSION_CFLAGS set further below.
|
||||
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
|
||||
# Log level (MIN_LOG_LEVEL in log.h)
|
||||
if("${MIN_LOG_LEVEL}" MATCHES "^$")
|
||||
# Minimize logging for release-type builds.
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Release"
|
||||
OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"
|
||||
OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
|
||||
message(STATUS "MIN_LOG_LEVEL not specified, default is 3 (ERROR) for release builds")
|
||||
set(MIN_LOG_LEVEL 3)
|
||||
else()
|
||||
message(STATUS "MIN_LOG_LEVEL not specified, default is 1 (INFO)")
|
||||
set(MIN_LOG_LEVEL 1)
|
||||
endif()
|
||||
else()
|
||||
if(NOT MIN_LOG_LEVEL MATCHES "^[0-3]$")
|
||||
message(FATAL_ERROR "invalid MIN_LOG_LEVEL: " ${MIN_LOG_LEVEL})
|
||||
endif()
|
||||
message(STATUS "MIN_LOG_LEVEL=${MIN_LOG_LEVEL}")
|
||||
endif()
|
||||
|
||||
# Default to -O2 on release builds.
|
||||
if(CMAKE_C_FLAGS_RELEASE MATCHES "-O3")
|
||||
message(STATUS "Replacing -O3 in CMAKE_C_FLAGS_RELEASE with -O2")
|
||||
string(REPLACE "-O3" "-O2" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
|
||||
endif()
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCC)
|
||||
check_c_compiler_flag(-Og HAS_OG_FLAG)
|
||||
else()
|
||||
set(HAS_OG_FLAG 0)
|
||||
endif()
|
||||
|
||||
#
|
||||
# Build-type: RelWithDebInfo
|
||||
# /Og means something different in MSVC
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -Og -g")
|
||||
#
|
||||
if(HAS_OG_FLAG)
|
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -Og -g")
|
||||
endif()
|
||||
# We _want_ assertions in RelWithDebInfo build-type.
|
||||
if(CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES DNDEBUG)
|
||||
string(REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
|
||||
string(REPLACE "/DNDEBUG" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
|
||||
string(REPLACE " " " " CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") # Remove duplicate whitespace
|
||||
endif()
|
||||
|
||||
option(ENABLE_ASAN_UBSAN "Enable Clang address & undefined behavior sanitizer for nvim binary." OFF)
|
||||
option(ENABLE_MSAN "Enable Clang memory sanitizer for nvim binary." OFF)
|
||||
# TSAN exists to test Luv threads.
|
||||
option(ENABLE_TSAN "Enable Clang thread sanitizer for nvim binary." OFF)
|
||||
# gcc 4.0+ sets _FORTIFY_SOURCE=2 automatically. This currently
|
||||
# does not work with Neovim due to some uses of dynamically-sized structures.
|
||||
# https://github.com/neovim/neovim/issues/223
|
||||
include(CheckCSourceCompiles)
|
||||
|
||||
if((ENABLE_ASAN_UBSAN AND ENABLE_MSAN)
|
||||
OR (ENABLE_ASAN_UBSAN AND ENABLE_TSAN)
|
||||
OR (ENABLE_MSAN AND ENABLE_TSAN))
|
||||
# Include the build type's default flags in the check for _FORTIFY_SOURCE,
|
||||
# otherwise we may incorrectly identify the level as acceptable and find out
|
||||
# later that it was not when optimizations were enabled. CFLAGS is applied
|
||||
# even though you don't see it in CMAKE_REQUIRED_FLAGS.
|
||||
set(INIT_FLAGS_NAME CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE})
|
||||
string(TOUPPER ${INIT_FLAGS_NAME} INIT_FLAGS_NAME)
|
||||
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
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
" HAS_ACCEPTABLE_FORTIFY)
|
||||
|
||||
if(NOT HAS_ACCEPTABLE_FORTIFY)
|
||||
message(STATUS "Unsupported _FORTIFY_SOURCE found, forcing _FORTIFY_SOURCE=1")
|
||||
# Extract possible prefix to _FORTIFY_SOURCE (e.g. -Wp,-D_FORTIFY_SOURCE).
|
||||
STRING(REGEX MATCH "[^\ ]+-D_FORTIFY_SOURCE" _FORTIFY_SOURCE_PREFIX "${CMAKE_C_FLAGS}")
|
||||
STRING(REPLACE "-D_FORTIFY_SOURCE" "" _FORTIFY_SOURCE_PREFIX "${_FORTIFY_SOURCE_PREFIX}" )
|
||||
if(NOT _FORTIFY_SOURCE_PREFIX STREQUAL "")
|
||||
message(STATUS "Detected _FORTIFY_SOURCE Prefix=${_FORTIFY_SOURCE_PREFIX}")
|
||||
endif()
|
||||
# -U in add_definitions doesn't end up in the correct spot, so we add it to
|
||||
# the flags variable instead.
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_FORTIFY_SOURCE_PREFIX}-U_FORTIFY_SOURCE ${_FORTIFY_SOURCE_PREFIX}-D_FORTIFY_SOURCE=1")
|
||||
endif()
|
||||
|
||||
# Remove --sort-common from linker flags, as this seems to cause bugs (see #2641, #3374).
|
||||
# TODO: Figure out the root cause.
|
||||
if(CMAKE_EXE_LINKER_FLAGS MATCHES "--sort-common" OR
|
||||
CMAKE_SHARED_LINKER_FLAGS MATCHES "--sort-common" OR
|
||||
CMAKE_MODULE_LINKER_FLAGS MATCHES "--sort-common")
|
||||
message(STATUS "Removing --sort-common from linker flags")
|
||||
string(REGEX REPLACE ",--sort-common(=[^,]+)?" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
|
||||
string(REGEX REPLACE ",--sort-common(=[^,]+)?" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
|
||||
string(REGEX REPLACE ",--sort-common(=[^,]+)?" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
|
||||
|
||||
# If no linker flags remain for a -Wl argument, remove it.
|
||||
# '-Wl$' will match LDFLAGS="-Wl,--sort-common",
|
||||
# '-Wl ' will match LDFLAGS="-Wl,--sort-common -Wl,..."
|
||||
string(REGEX REPLACE "-Wl($| )" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
|
||||
string(REGEX REPLACE "-Wl($| )" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
|
||||
string(REGEX REPLACE "-Wl($| )" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
|
||||
endif()
|
||||
|
||||
check_c_source_compiles("
|
||||
#include <execinfo.h>
|
||||
int main(void)
|
||||
{
|
||||
void *trace[1];
|
||||
backtrace(trace, 1);
|
||||
return 0;
|
||||
}
|
||||
" HAVE_EXECINFO_BACKTRACE)
|
||||
|
||||
check_c_source_compiles("
|
||||
int main(void)
|
||||
{
|
||||
int a = 42;
|
||||
__builtin_add_overflow(a, a, &a);
|
||||
__builtin_sub_overflow(a, a, &a);
|
||||
return 0;
|
||||
}
|
||||
" HAVE_BUILTIN_ADD_OVERFLOW)
|
||||
|
||||
if(MSVC)
|
||||
# XXX: /W4 gives too many warnings. #3241
|
||||
add_compile_options(/W3)
|
||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
|
||||
add_definitions(-DWIN32)
|
||||
else()
|
||||
add_compile_options(-Wall -Wextra -pedantic -Wno-unused-parameter
|
||||
-Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion
|
||||
-Wmissing-prototypes)
|
||||
|
||||
check_c_compiler_flag(-Wimplicit-fallthrough HAVE_WIMPLICIT_FALLTHROUGH_FLAG)
|
||||
if(HAVE_WIMPLICIT_FALLTHROUGH_FLAG)
|
||||
add_compile_options(-Wimplicit-fallthrough)
|
||||
endif()
|
||||
|
||||
# On FreeBSD 64 math.h uses unguarded C11 extension, which taints clang
|
||||
# 3.4.1 used there.
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" AND CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
add_compile_options(-Wno-c11-extensions)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(MINGW)
|
||||
# Use POSIX compatible stdio in Mingw
|
||||
add_definitions(-D__USE_MINGW_ANSI_STDIO)
|
||||
endif()
|
||||
if(WIN32)
|
||||
# Windows Vista is the minimum supported version
|
||||
add_definitions(-D_WIN32_WINNT=0x0600)
|
||||
endif()
|
||||
|
||||
# OpenBSD's GCC (4.2.1) doesn't have -Wvla
|
||||
check_c_compiler_flag(-Wvla HAS_WVLA_FLAG)
|
||||
if(HAS_WVLA_FLAG)
|
||||
add_compile_options(-Wvla)
|
||||
endif()
|
||||
|
||||
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_compile_options(-fstack-protector-strong)
|
||||
link_libraries(-fstack-protector-strong)
|
||||
elseif(HAS_FSTACK_PROTECTOR_FLAG)
|
||||
add_compile_options(-fstack-protector --param ssp-buffer-size=4)
|
||||
link_libraries(-fstack-protector --param ssp-buffer-size=4)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
check_c_compiler_flag(-fno-common HAVE_FNO_COMMON)
|
||||
if (HAVE_FNO_COMMON)
|
||||
add_compile_options(-fno-common)
|
||||
endif()
|
||||
|
||||
check_c_compiler_flag(-fdiagnostics-color=auto HAS_DIAG_COLOR_FLAG)
|
||||
if(HAS_DIAG_COLOR_FLAG)
|
||||
if(CMAKE_GENERATOR MATCHES "Ninja")
|
||||
add_compile_options(-fdiagnostics-color=always)
|
||||
else()
|
||||
add_compile_options(-fdiagnostics-color=auto)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(CI_BUILD "CI, extra flags will be set" OFF)
|
||||
|
||||
if(CI_BUILD)
|
||||
message(STATUS "CI build enabled")
|
||||
add_compile_options(-Werror)
|
||||
if(DEFINED ENV{BUILD_32BIT})
|
||||
# Get some test coverage for unsigned char
|
||||
add_compile_options(-funsigned-char)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(LOG_LIST_ACTIONS "Add list actions logging" OFF)
|
||||
|
||||
add_definitions(-DINCLUDE_GENERATED_DECLARATIONS)
|
||||
|
||||
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
|
||||
set(NO_UNDEFINED "-Wl,--no-undefined -lsocket")
|
||||
elseif(NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||
set(NO_UNDEFINED "-Wl,--no-undefined")
|
||||
endif()
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${NO_UNDEFINED}")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${NO_UNDEFINED}")
|
||||
|
||||
# For O_CLOEXEC, O_DIRECTORY, and O_NOFOLLOW flags on older systems
|
||||
# (pre POSIX.1-2008: glibc 2.11 and earlier). #4042
|
||||
# For ptsname(). #6743
|
||||
add_definitions(-D_GNU_SOURCE)
|
||||
endif()
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT PREFER_LUA AND LUAJIT_VERSION LESS "2.1.0-beta3")
|
||||
# Required for luajit < 2.1.0-beta3.
|
||||
set(CMAKE_EXE_LINKER_FLAGS
|
||||
"${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS
|
||||
"${CMAKE_SHARED_LINKER_FLAGS} -image_base 100000000")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS
|
||||
"${CMAKE_MODULE_LINKER_FLAGS} -image_base 100000000")
|
||||
endif()
|
||||
|
||||
include_directories("${PROJECT_BINARY_DIR}/config")
|
||||
include_directories("${PROJECT_SOURCE_DIR}/src")
|
||||
|
||||
find_package(LibUV 1.28.0 REQUIRED)
|
||||
include_directories(SYSTEM ${LIBUV_INCLUDE_DIRS})
|
||||
|
||||
find_package(Msgpack 1.0.0 REQUIRED)
|
||||
include_directories(SYSTEM ${MSGPACK_INCLUDE_DIRS})
|
||||
|
||||
find_package(LibLUV 1.30.0 REQUIRED)
|
||||
include_directories(SYSTEM ${LIBLUV_INCLUDE_DIRS})
|
||||
|
||||
find_package(TreeSitter REQUIRED)
|
||||
include_directories(SYSTEM ${TreeSitter_INCLUDE_DIRS})
|
||||
|
||||
list(APPEND CMAKE_REQUIRED_INCLUDES "${TreeSitter_INCLUDE_DIRS}")
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "${TreeSitter_LIBRARIES}")
|
||||
check_c_source_compiles("
|
||||
#include <tree_sitter/api.h>
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
TSQueryCursor *cursor = ts_query_cursor_new();
|
||||
ts_query_cursor_set_match_limit(cursor, 32);
|
||||
return 0;
|
||||
}
|
||||
" TS_HAS_SET_MATCH_LIMIT)
|
||||
if(TS_HAS_SET_MATCH_LIMIT)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNVIM_TS_HAS_SET_MATCH_LIMIT")
|
||||
endif()
|
||||
|
||||
# Note: The test lib requires LuaJIT; it will be skipped if LuaJIT is missing.
|
||||
option(PREFER_LUA "Prefer Lua over LuaJIT in the nvim executable." OFF)
|
||||
|
||||
if(PREFER_LUA)
|
||||
find_package(Lua 5.1 REQUIRED)
|
||||
set(LUA_PREFERRED_INCLUDE_DIRS ${LUA_INCLUDE_DIR})
|
||||
set(LUA_PREFERRED_LIBRARIES ${LUA_LIBRARIES})
|
||||
# Passive (not REQUIRED): if LUAJIT_FOUND is not set, nvim-test is skipped.
|
||||
find_package(LuaJit)
|
||||
else()
|
||||
find_package(LuaJit REQUIRED)
|
||||
set(LUA_PREFERRED_INCLUDE_DIRS ${LUAJIT_INCLUDE_DIRS})
|
||||
set(LUA_PREFERRED_LIBRARIES ${LUAJIT_LIBRARIES})
|
||||
endif()
|
||||
|
||||
list(APPEND CMAKE_REQUIRED_INCLUDES "${MSGPACK_INCLUDE_DIRS}")
|
||||
check_c_source_compiles("
|
||||
#include <msgpack.h>
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
return MSGPACK_OBJECT_FLOAT32;
|
||||
}
|
||||
" MSGPACK_HAS_FLOAT32)
|
||||
list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES "${MSGPACK_INCLUDE_DIRS}")
|
||||
if(MSGPACK_HAS_FLOAT32)
|
||||
add_definitions(-DNVIM_MSGPACK_HAS_FLOAT32)
|
||||
endif()
|
||||
|
||||
option(FEAT_TUI "Enable the Terminal UI" ON)
|
||||
|
||||
if(FEAT_TUI)
|
||||
find_package(UNIBILIUM 2.0 REQUIRED)
|
||||
include_directories(SYSTEM ${UNIBILIUM_INCLUDE_DIRS})
|
||||
|
||||
list(APPEND CMAKE_REQUIRED_INCLUDES "${UNIBILIUM_INCLUDE_DIRS}")
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "${UNIBILIUM_LIBRARIES}")
|
||||
check_c_source_compiles("
|
||||
#include <unibilium.h>
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
return unibi_num_from_var(unibi_var_from_num(0));
|
||||
}
|
||||
" UNIBI_HAS_VAR_FROM)
|
||||
list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES "${UNIBILIUM_INCLUDE_DIRS}")
|
||||
list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES "${UNIBILIUM_LIBRARIES}")
|
||||
if(UNIBI_HAS_VAR_FROM)
|
||||
add_definitions(-DNVIM_UNIBI_HAS_VAR_FROM)
|
||||
endif()
|
||||
|
||||
find_package(LibTermkey 0.18 REQUIRED)
|
||||
include_directories(SYSTEM ${LIBTERMKEY_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
find_package(LIBVTERM 0.1 REQUIRED)
|
||||
include_directories(SYSTEM ${LIBVTERM_INCLUDE_DIRS})
|
||||
|
||||
if(WIN32)
|
||||
find_package(Winpty 0.4.3 REQUIRED)
|
||||
include_directories(SYSTEM ${WINPTY_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
option(CLANG_ASAN_UBSAN "Enable Clang address & undefined behavior sanitizer for nvim binary." OFF)
|
||||
option(CLANG_MSAN "Enable Clang memory sanitizer for nvim binary." OFF)
|
||||
option(CLANG_TSAN "Enable Clang thread sanitizer for nvim binary." OFF)
|
||||
|
||||
if((CLANG_ASAN_UBSAN AND CLANG_MSAN)
|
||||
OR (CLANG_ASAN_UBSAN AND CLANG_TSAN)
|
||||
OR (CLANG_MSAN AND CLANG_TSAN))
|
||||
message(FATAL_ERROR "Sanitizers cannot be enabled simultaneously")
|
||||
endif()
|
||||
|
||||
if((CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN) AND NOT CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
message(FATAL_ERROR "Sanitizers are only supported for Clang")
|
||||
endif()
|
||||
|
||||
if(ENABLE_LIBICONV)
|
||||
find_package(Iconv REQUIRED)
|
||||
include_directories(SYSTEM ${Iconv_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
if(ENABLE_LIBINTL)
|
||||
# LibIntl (not Intl) selects our FindLibIntl.cmake script. #8464
|
||||
find_package(LibIntl REQUIRED)
|
||||
include_directories(SYSTEM ${LibIntl_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
# Determine platform's threading library. Set CMAKE_THREAD_PREFER_PTHREAD
|
||||
# explicitly to indicate a strong preference for pthread.
|
||||
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)
|
||||
@ -187,140 +515,206 @@ foreach(CFGNAME ${CMAKE_CONFIGURATION_TYPES})
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CFGNAME} ${CMAKE_BINARY_DIR}/lib)
|
||||
endforeach()
|
||||
|
||||
if(NOT PREFER_LUA)
|
||||
find_program(LUA_PRG NAMES luajit)
|
||||
endif()
|
||||
find_program(LUA_PRG NAMES lua5.1 lua5.2 lua)
|
||||
# Find Lua interpreter
|
||||
include(LuaHelpers)
|
||||
set(LUA_DEPENDENCIES lpeg mpack bit)
|
||||
if(NOT LUA_PRG)
|
||||
message(FATAL_ERROR "Failed to find a Lua 5.1-compatible interpreter")
|
||||
endif()
|
||||
message(STATUS "Using Lua interpreter: ${LUA_PRG}")
|
||||
foreach(CURRENT_LUA_PRG luajit lua5.1 lua5.2 lua)
|
||||
unset(_CHECK_LUA_PRG CACHE)
|
||||
unset(LUA_PRG_WORKS)
|
||||
find_program(_CHECK_LUA_PRG ${CURRENT_LUA_PRG})
|
||||
|
||||
# Some of the code generation still relies on stable table ordering in order to
|
||||
# produce reproducible output - specifically the msgpack'ed data in
|
||||
# funcs_metadata.generated.h and ui_events_metadata.generated.h. This should
|
||||
# ideally be fixed in the generators, but until then as a workaround you may provide
|
||||
# a specific lua implementation that provides the needed stability by setting LUA_GEN_PRG:
|
||||
if(NOT LUA_GEN_PRG)
|
||||
set(LUA_GEN_PRG "${LUA_PRG}" CACHE FILEPATH "Path to the lua used for code generation.")
|
||||
endif()
|
||||
message(STATUS "Using Lua interpreter for code generation: ${LUA_GEN_PRG}")
|
||||
|
||||
option(COMPILE_LUA "Pre-compile Lua sources into bytecode (for sources that are included in the binary)" ON)
|
||||
if(COMPILE_LUA AND NOT WIN32)
|
||||
if(PREFER_LUA)
|
||||
foreach(CURRENT_LUAC_PRG luac5.1 luac)
|
||||
find_program(_CHECK_LUAC_PRG ${CURRENT_LUAC_PRG})
|
||||
if(_CHECK_LUAC_PRG)
|
||||
set(LUAC_PRG "${_CHECK_LUAC_PRG} -s -o - %s" CACHE STRING "Format for compiling to Lua bytecode")
|
||||
if(_CHECK_LUA_PRG)
|
||||
check_lua_deps(${_CHECK_LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS)
|
||||
if(LUA_PRG_WORKS)
|
||||
set(LUA_PRG "${_CHECK_LUA_PRG}" CACHE FILEPATH "Path to a program.")
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
elseif(LUA_PRG MATCHES "luajit")
|
||||
check_lua_module(${LUA_PRG} "jit.bcsave" LUAJIT_HAS_JIT_BCSAVE)
|
||||
if(LUAJIT_HAS_JIT_BCSAVE)
|
||||
set(LUAC_PRG "${LUA_PRG} -b -s %s -" CACHE STRING "Format for compiling to Lua bytecode")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
if(LUAC_PRG)
|
||||
message(STATUS "Using Lua compiler: ${LUAC_PRG}")
|
||||
endforeach()
|
||||
unset(_CHECK_LUA_PRG CACHE)
|
||||
else()
|
||||
check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS)
|
||||
endif()
|
||||
|
||||
# Lint
|
||||
option(CI_LINT "Abort if lint programs not found" OFF)
|
||||
if(CI_LINT)
|
||||
set(LINT_REQUIRED "REQUIRED")
|
||||
if(NOT LUA_PRG_WORKS)
|
||||
message(FATAL_ERROR "Failed to find a Lua 5.1-compatible interpreter")
|
||||
endif()
|
||||
find_program(SHELLCHECK_PRG shellcheck ${LINT_REQUIRED})
|
||||
find_program(STYLUA_PRG stylua ${LINT_REQUIRED})
|
||||
|
||||
set(STYLUA_DIRS runtime scripts src test contrib)
|
||||
message(STATUS "Using Lua interpreter: ${LUA_PRG}")
|
||||
|
||||
add_glob_target(
|
||||
TARGET lintlua-luacheck
|
||||
COMMAND $<TARGET_FILE:nvim_bin>
|
||||
FLAGS -ll ${PROJECT_SOURCE_DIR}/test/lua_runner.lua ${CMAKE_BINARY_DIR}/usr luacheck -q
|
||||
GLOB_DIRS runtime scripts src test
|
||||
GLOB_PAT *.lua
|
||||
TOUCH_STRATEGY PER_DIR)
|
||||
add_dependencies(lintlua-luacheck lua_dev_deps)
|
||||
# Setup busted.
|
||||
find_program(BUSTED_PRG NAMES busted busted.bat)
|
||||
find_program(BUSTED_LUA_PRG busted-lua)
|
||||
if(NOT BUSTED_OUTPUT_TYPE)
|
||||
set(BUSTED_OUTPUT_TYPE "nvim")
|
||||
endif()
|
||||
|
||||
add_glob_target(
|
||||
TARGET lintlua-stylua
|
||||
COMMAND ${STYLUA_PRG}
|
||||
FLAGS --color=always --check --respect-ignores
|
||||
GLOB_DIRS ${STYLUA_DIRS}
|
||||
GLOB_PAT *.lua
|
||||
TOUCH_STRATEGY PER_DIR)
|
||||
find_program(LUACHECK_PRG luacheck)
|
||||
find_program(FLAKE8_PRG flake8)
|
||||
find_program(GPERF_PRG gperf)
|
||||
|
||||
add_custom_target(lintlua)
|
||||
add_dependencies(lintlua lintlua-luacheck lintlua-stylua)
|
||||
|
||||
add_glob_target(
|
||||
TARGET lintsh
|
||||
COMMAND ${SHELLCHECK_PRG}
|
||||
FLAGS -x -a
|
||||
GLOB_DIRS scripts
|
||||
GLOB_PAT *.sh
|
||||
TOUCH_STRATEGY PER_DIR)
|
||||
|
||||
add_custom_target(lintcommit
|
||||
COMMAND $<TARGET_FILE:nvim_bin> -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)
|
||||
|
||||
# Format
|
||||
add_glob_target(
|
||||
TARGET formatlua
|
||||
COMMAND ${STYLUA_PRG}
|
||||
FLAGS --respect-ignores
|
||||
GLOB_DIRS ${STYLUA_DIRS}
|
||||
GLOB_PAT *.lua
|
||||
TOUCH_STRATEGY PER_DIR)
|
||||
|
||||
add_custom_target(format)
|
||||
add_dependencies(format formatc formatlua)
|
||||
include(InstallHelpers)
|
||||
|
||||
file(GLOB MANPAGES
|
||||
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
man/nvim.1)
|
||||
install_helper(
|
||||
FILES ${CMAKE_SOURCE_DIR}/src/man/nvim.1
|
||||
FILES ${MANPAGES}
|
||||
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
|
||||
|
||||
add_custom_target(nvim ALL)
|
||||
add_dependencies(nvim nvim_bin nvim_runtime_deps nvim_runtime)
|
||||
#
|
||||
# Go down the tree.
|
||||
#
|
||||
|
||||
add_subdirectory(src/nvim)
|
||||
add_subdirectory(cmake.config)
|
||||
get_directory_property(NVIM_VERSION_CFLAGS DIRECTORY src/nvim DEFINITION NVIM_VERSION_CFLAGS)
|
||||
add_subdirectory(test/includes)
|
||||
add_subdirectory(config)
|
||||
add_subdirectory(test/functional/fixtures) # compile test programs
|
||||
add_subdirectory(runtime)
|
||||
add_subdirectory(test)
|
||||
|
||||
add_custom_target(uninstall
|
||||
COMMAND ${CMAKE_COMMAND} -P ${PROJECT_SOURCE_DIR}/cmake/UninstallHelper.cmake)
|
||||
|
||||
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
add_subdirectory(cmake.packaging)
|
||||
get_directory_property(GENERATED_HELP_TAGS DIRECTORY runtime DEFINITION GENERATED_HELP_TAGS)
|
||||
if(WIN32)
|
||||
install_helper(
|
||||
FILES ${DEPS_PREFIX}/share/nvim-qt/runtime/plugin/nvim_gui_shim.vim
|
||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim-qt/runtime/plugin)
|
||||
endif()
|
||||
|
||||
get_externalproject_options(uncrustify ${DEPS_IGNORE_SHA})
|
||||
ExternalProject_Add(uncrustify
|
||||
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/uncrustify
|
||||
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
|
||||
EXCLUDE_FROM_ALL TRUE
|
||||
${EXTERNALPROJECT_OPTIONS})
|
||||
# Setup some test-related bits. We do this after going down the tree because we
|
||||
# need some of the targets.
|
||||
if(BUSTED_PRG)
|
||||
get_property(TEST_INCLUDE_DIRS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
PROPERTY INCLUDE_DIRECTORIES)
|
||||
|
||||
option(USE_BUNDLED_BUSTED "Use bundled busted" ON)
|
||||
if(USE_BUNDLED_BUSTED)
|
||||
get_externalproject_options(lua_dev_deps ${DEPS_IGNORE_SHA})
|
||||
ExternalProject_Add(lua_dev_deps
|
||||
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/lua_dev_deps
|
||||
SOURCE_DIR ${DEPS_SHARE_DIR}
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
EXCLUDE_FROM_ALL TRUE
|
||||
${EXTERNALPROJECT_OPTIONS})
|
||||
# When running tests from 'ninja' we need to use the
|
||||
# console pool: to do so we need to use the USES_TERMINAL
|
||||
# option, but this is only available in CMake 3.2
|
||||
set(TEST_TARGET_ARGS)
|
||||
list(APPEND TEST_TARGET_ARGS "USES_TERMINAL")
|
||||
|
||||
set(UNITTEST_PREREQS nvim-test unittest-headers)
|
||||
set(FUNCTIONALTEST_PREREQS nvim printenv-test printargs-test shell-test streams-test tty-test ${GENERATED_HELP_TAGS})
|
||||
set(BENCHMARK_PREREQS nvim tty-test)
|
||||
|
||||
# Useful for automated build systems, if they want to manually run the tests.
|
||||
add_custom_target(unittest-prereqs
|
||||
DEPENDS ${UNITTEST_PREREQS})
|
||||
set_target_properties(unittest-prereqs PROPERTIES FOLDER test)
|
||||
|
||||
add_custom_target(functionaltest-prereqs
|
||||
DEPENDS ${FUNCTIONALTEST_PREREQS})
|
||||
|
||||
add_custom_target(benchmark-prereqs
|
||||
DEPENDS ${BENCHMARK_PREREQS})
|
||||
|
||||
check_lua_module(${LUA_PRG} "ffi" LUA_HAS_FFI)
|
||||
if(LUA_HAS_FFI)
|
||||
add_custom_target(unittest
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-DBUSTED_PRG=${BUSTED_PRG}
|
||||
-DLUA_PRG=${LUA_PRG}
|
||||
-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=unit
|
||||
-P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake
|
||||
DEPENDS ${UNITTEST_PREREQS}
|
||||
${TEST_TARGET_ARGS})
|
||||
set_target_properties(unittest PROPERTIES FOLDER test)
|
||||
else()
|
||||
message(WARNING "disabling unit tests: no Luajit FFI in ${LUA_PRG}")
|
||||
endif()
|
||||
|
||||
if(LUA_HAS_FFI)
|
||||
set(TEST_LIBNVIM_PATH $<TARGET_FILE:nvim-test>)
|
||||
else()
|
||||
set(TEST_LIBNVIM_PATH "")
|
||||
endif()
|
||||
configure_file(
|
||||
${CMAKE_SOURCE_DIR}/test/config/paths.lua.in
|
||||
${CMAKE_BINARY_DIR}/test/config/paths.lua.gen)
|
||||
file(GENERATE
|
||||
OUTPUT ${CMAKE_BINARY_DIR}/test/config/paths.lua
|
||||
INPUT ${CMAKE_BINARY_DIR}/test/config/paths.lua.gen)
|
||||
|
||||
add_custom_target(functionaltest
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-DBUSTED_PRG=${BUSTED_PRG}
|
||||
-DLUA_PRG=${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}
|
||||
${TEST_TARGET_ARGS})
|
||||
set_target_properties(functionaltest functionaltest-prereqs
|
||||
PROPERTIES FOLDER test)
|
||||
|
||||
add_custom_target(benchmark
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-DBUSTED_PRG=${BUSTED_PRG}
|
||||
-DLUA_PRG=${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=benchmark
|
||||
-P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake
|
||||
DEPENDS ${BENCHMARK_PREREQS}
|
||||
${TEST_TARGET_ARGS})
|
||||
set_target_properties(benchmark benchmark-prereqs PROPERTIES FOLDER test)
|
||||
endif()
|
||||
|
||||
if(BUSTED_LUA_PRG)
|
||||
add_custom_target(functionaltest-lua
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-DBUSTED_PRG=${BUSTED_LUA_PRG}
|
||||
-DLUA_PRG=${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}
|
||||
${TEST_TARGET_ARGS})
|
||||
set_target_properties(functionaltest-lua PROPERTIES FOLDER test)
|
||||
endif()
|
||||
|
||||
if(LUACHECK_PRG)
|
||||
add_custom_target(lualint
|
||||
COMMAND ${LUACHECK_PRG} -q runtime/ scripts/ src/ test/
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
else()
|
||||
add_custom_target(lua_dev_deps)
|
||||
add_custom_target(lualint false
|
||||
COMMENT "lualint: LUACHECK_PRG not defined")
|
||||
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)
|
||||
|
||||
#add uninstall target
|
||||
if(NOT TARGET uninstall)
|
||||
configure_file(
|
||||
"cmake/UninstallHelper.cmake.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/UninstallHelper.cmake"
|
||||
IMMEDIATE @ONLY)
|
||||
|
||||
add_custom_target(uninstall
|
||||
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/UninstallHelper.cmake)
|
||||
endif()
|
||||
|
@ -1,54 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"configurePresets": [
|
||||
{
|
||||
"name": "base",
|
||||
"generator": "Ninja",
|
||||
"binaryDir": "${sourceDir}/build",
|
||||
"hidden": true
|
||||
},
|
||||
{
|
||||
"name": "default",
|
||||
"displayName": "RelWithDebInfo",
|
||||
"description": "Enables optimizations (-Og or -O2) with debug information",
|
||||
"cacheVariables": {
|
||||
"CMAKE_BUILD_TYPE": "RelWithDebInfo"
|
||||
},
|
||||
"inherits": ["base"]
|
||||
},
|
||||
{
|
||||
"name": "debug",
|
||||
"displayName": "Debug",
|
||||
"description": "Disables optimizations (-O0), enables debug information",
|
||||
"cacheVariables": {
|
||||
"CMAKE_BUILD_TYPE": "Debug"
|
||||
},
|
||||
"inherits": ["base"]
|
||||
},
|
||||
{
|
||||
"name": "release",
|
||||
"displayName": "Release",
|
||||
"description": "Same as RelWithDebInfo, but disables debug information",
|
||||
"cacheVariables": {
|
||||
"CMAKE_BUILD_TYPE": "Release"
|
||||
},
|
||||
"inherits": ["base"]
|
||||
},
|
||||
{
|
||||
"name": "iwyu",
|
||||
"displayName": "IWYU",
|
||||
"description": "Run include-what-you-use",
|
||||
"cacheVariables": {
|
||||
"ENABLE_IWYU": "ON"
|
||||
},
|
||||
"inherits": ["base"]
|
||||
},
|
||||
{
|
||||
"name": "ci",
|
||||
"cacheVariables": {
|
||||
"CI_BUILD": "ON"
|
||||
},
|
||||
"inherits": ["base"]
|
||||
}
|
||||
]
|
||||
}
|
377
CONTRIBUTING.md
377
CONTRIBUTING.md
@ -7,13 +7,11 @@ Getting started
|
||||
If you want to help but don't know where to start, here are some
|
||||
low-risk/isolated tasks:
|
||||
|
||||
- Try a [complexity:low] issue.
|
||||
- Fix bugs found by [Coverity](#coverity).
|
||||
- [Merge a Vim patch] (requires strong familiarity with Vim)
|
||||
- NOTE: read the above link before sending improvements to "runtime files" (anything in `runtime/`).
|
||||
- Vimscript and documentation files are (mostly) maintained by [Vim], not Nvim.
|
||||
- Nvim's [filetype detection](https://github.com/neovim/neovim/blob/master/runtime/lua/vim/filetype.lua) behavior matches Vim, so changes to filetype detection should be submitted to [Vim] first.
|
||||
- Lua files are maintained by Nvim.
|
||||
- [Merge a Vim patch].
|
||||
- Try a [good first issue](../../labels/good-first-issue) or [complexity:low] issue.
|
||||
- Fix bugs found by [Clang](#clang-scan-build), [PVS](#pvs-studio) or
|
||||
[Coverity](#coverity).
|
||||
- [Improve documentation][wiki-contribute-help]
|
||||
|
||||
Reporting problems
|
||||
------------------
|
||||
@ -22,31 +20,25 @@ Reporting problems
|
||||
- [Search existing issues][github-issues] (including closed!)
|
||||
- Update Neovim to the latest version to see if your problem persists.
|
||||
- Try to reproduce with `nvim --clean` ("factory defaults").
|
||||
- If a specific configuration or plugin is necessary to recreate the problem, use the minimal template in `contrib/minimal.lua` with `nvim --clean -u contrib/minimal.lua` after making the necessary changes.
|
||||
- [Bisect](https://neovim.io/doc/user/starting.html#bisect) your config: disable plugins incrementally, to narrow down the cause of the issue.
|
||||
- [Bisect][git-bisect] Neovim's source code to find the cause of a regression, if you can. This is _extremely_ helpful.
|
||||
- When reporting a crash, [include a stacktrace](https://neovim.io/doc/user/dev_tools.html#dev-tools-backtrace).
|
||||
- Use [ASAN/UBSAN](#sanitizers-asan-and-ubsan) to get detailed errors for segfaults and undefined behavior.
|
||||
- When reporting a crash, [include a stacktrace](https://github.com/neovim/neovim/wiki/FAQ#backtrace-linux).
|
||||
- Use [ASAN/UBSAN](#clang-sanitizers-asan-and-ubsan) to get detailed errors for segfaults and undefined behavior.
|
||||
- Check the logs. `:edit $NVIM_LOG_FILE`
|
||||
- Include `cmake --system-information` for build-related issues.
|
||||
|
||||
Developer guidelines
|
||||
--------------------
|
||||
|
||||
- Read [:help dev](https://neovim.io/doc/user/develop.html#dev) and [:help dev-doc][dev-doc-guide] if you are working on Nvim core.
|
||||
- Read [:help dev-ui](https://neovim.io/doc/user/develop.html#dev-ui) if you are developing a UI.
|
||||
- Read [:help dev-api-client](https://neovim.io/doc/user/develop.html#dev-api-client) if you are developing an API client.
|
||||
- Read `:help dev` if you are working on Nvim core.
|
||||
- Read `:help dev-ui` if you are developing a UI.
|
||||
- Read `:help dev-api-client` if you are developing an API client.
|
||||
- Install `ninja` for faster builds of Nvim.
|
||||
```bash
|
||||
```
|
||||
sudo apt-get install ninja-build
|
||||
make distclean
|
||||
make # Nvim build system uses ninja automatically, if available.
|
||||
```
|
||||
- Install `ccache` for faster rebuilds of Nvim. Nvim will use it automatically
|
||||
if it's found. To disable caching use:
|
||||
```bash
|
||||
CCACHE_DISABLE=true make
|
||||
```
|
||||
|
||||
Pull requests (PRs)
|
||||
---------------------
|
||||
@ -55,15 +47,21 @@ Pull requests (PRs)
|
||||
- Your PR must include [test coverage][run-tests].
|
||||
- Avoid cosmetic changes to unrelated files in the same commit.
|
||||
- Use a [feature branch][git-feature-branch] instead of the master branch.
|
||||
- Use a _rebase workflow_ for all PRs.
|
||||
- After addressing review comments, it's fine to force-push.
|
||||
|
||||
### Merging to master
|
||||
|
||||
For maintainers: when a PR is ready to merge to master,
|
||||
|
||||
- prefer _Squash Merge_ for "single-commit PRs" (when the PR has only one meaningful commit).
|
||||
- prefer _Merge_ for "multi-commit PRs" (when the PR has multiple meaningful commits).
|
||||
- Use a **rebase workflow** for small PRs.
|
||||
- After addressing review comments, it's fine to rebase and force-push.
|
||||
- Use a **merge workflow** for big, high-risk PRs.
|
||||
- Merge `master` into your PR when there are conflicts or when master
|
||||
introduces breaking changes.
|
||||
- Use the `ri` git alias:
|
||||
```
|
||||
[alias]
|
||||
ri = "!sh -c 't=\"${1:-master}\"; s=\"${2:-HEAD}\"; mb=\"$(git merge-base \"$t\" \"$s\")\"; if test \"x$mb\" = x ; then o=\"$t\"; else lm=\"$(git log -n1 --merges \"$t..$s\" --pretty=%H)\"; if test \"x$lm\" = x ; then o=\"$mb\"; else o=\"$lm\"; fi; fi; test $# -gt 0 && shift; test $# -gt 0 && shift; git rebase --interactive \"$o\" \"$@\"'"
|
||||
```
|
||||
This avoids unnecessary rebases yet still allows you to combine related
|
||||
commits, separate monolithic commits, etc.
|
||||
- Do not edit commits that come before the merge commit.
|
||||
- During a squash/fixup, use `exec make -C build unittest` between each
|
||||
pick/edit/reword.
|
||||
|
||||
### Stages: Draft and Ready for review
|
||||
|
||||
@ -83,60 +81,99 @@ a comment.
|
||||
### Commit messages
|
||||
|
||||
Follow the [conventional commits guidelines][conventional_commits] to *make reviews easier* and to make
|
||||
the VCS/git logs more valuable. The structure of a commit message is:
|
||||
the VCS/git logs more valuable. The general structure of a commit message is:
|
||||
|
||||
type(scope): subject
|
||||
```
|
||||
<type>([optional scope]): <description>
|
||||
|
||||
Problem:
|
||||
...
|
||||
[optional body]
|
||||
|
||||
Solution:
|
||||
...
|
||||
[optional footer(s)]
|
||||
```
|
||||
|
||||
- Commit message **subject** (you can **ignore this for "fixup" commits** or any commits you expect to be squashed):
|
||||
- Prefix with a [_type_](https://github.com/commitizen/conventional-commit-types/blob/master/index.json):
|
||||
- `build ci docs feat fix perf refactor revert test vim-patch`
|
||||
- Append an optional `(scope)` such as `(lsp)`, `(treesitter)`, `(float)`, …
|
||||
- Use the _imperative voice_: "Fix bug" rather than "Fixed bug" or "Fixes bug."
|
||||
- Keep it short (under 72 characters).
|
||||
- Commit message **body** (detail):
|
||||
- Concisely describe the Problem/Solution in the commit **body**. [Describing the problem](https://lamport.azurewebsites.net/pubs/state-the-problem.pdf)
|
||||
_independently of the solution_ often leads to a better understanding for you, reviewers, and future readers.
|
||||
```
|
||||
Problem:
|
||||
- Prefix the commit subject with one of these [_types_](https://github.com/commitizen/conventional-commit-types/blob/master/index.json):
|
||||
- `build`, `ci`, `docs`, `feat`, `fix`, `perf`, `refactor`, `revert`, `test`, `vim-patch`, `chore`
|
||||
- You can **ignore this for "fixup" commits** or any commits you expect to be squashed.
|
||||
- Append optional scope to _type_ such as `(lsp)`, `(treesitter)`, `(float)`, …
|
||||
- _Description_ shouldn't start with a capital letter or end in a period.
|
||||
- Use the _imperative voice_: "Fix bug" rather than "Fixed bug" or "Fixes bug."
|
||||
- Try to keep the first line under 72 characters.
|
||||
- A blank line must follow the subject.
|
||||
- Breaking API changes must be indicated by
|
||||
1. "!" after the type/scope, and
|
||||
2. a "BREAKING CHANGE" footer describing the change.
|
||||
Example:
|
||||
```
|
||||
refactor(provider)!: drop support for Python 2
|
||||
|
||||
Solution:
|
||||
```
|
||||
- Indicate breaking API changes with "!" after the type, and a "BREAKING CHANGE" footer. Example:
|
||||
```
|
||||
refactor(provider)!: drop support for Python 2
|
||||
|
||||
BREAKING CHANGE: refactor to use Python 3 features since Python 2 is no longer supported.
|
||||
```
|
||||
BREAKING CHANGE: refactor to use Python 3 features since Python 2 is no longer supported.
|
||||
```
|
||||
|
||||
### Automated builds (CI)
|
||||
|
||||
Each pull request must pass the automated builds on [Cirrus CI] and [GitHub Actions].
|
||||
Each pull request must pass the automated builds on [sourcehut] and [GitHub Actions].
|
||||
|
||||
- CI builds are compiled with [`-Werror`][gcc-warnings], so compiler warnings
|
||||
will fail the build.
|
||||
- If any tests fail, the build will fail. See [test/README.md#running-tests][run-tests] to run tests locally.
|
||||
- If any tests fail, the build will fail.
|
||||
See [test/README.md#running-tests][run-tests] to run tests locally.
|
||||
Passing locally doesn't guarantee passing the CI build, because of the
|
||||
different compilers and platforms tested against.
|
||||
- CI runs [ASan] and other analyzers.
|
||||
- To run valgrind locally: `VALGRIND=1 make test`
|
||||
- To run ASan/UBSan locally: `CC=clang make CMAKE_FLAGS="-DENABLE_ASAN_UBSAN=ON"`.
|
||||
Note that MSVC requires Release or RelWithDebInfo build type to work properly.
|
||||
- The [lint](#lint) build checks that the code is formatted correctly and
|
||||
passes various linter checks.
|
||||
- CI for FreeBSD runs on [Cirrus CI].
|
||||
- To see CI results faster in your PR, you can temporarily set `TEST_FILE` in
|
||||
[test.yml](https://github.com/neovim/neovim/blob/e35b9020b16985eee26e942f9a3f6b045bc3809b/.github/workflows/test.yml#L29).
|
||||
- To run Clang ASan/UBSan locally: `CC=clang make CMAKE_FLAGS="-DCLANG_ASAN_UBSAN=ON"`
|
||||
- The [lint](#lint) build checks modified lines _and their immediate
|
||||
neighbors_, to encourage incrementally updating the legacy style to meet our
|
||||
[style](#style). (See [#3174][3174] for background.)
|
||||
- CI for freebsd and openbsd runs on [sourcehut].
|
||||
- To get a backtrace on freebsd (after connecting via ssh):
|
||||
```sh
|
||||
sudo pkg install tmux # If you want tmux.
|
||||
lldb build/bin/nvim -c nvim.core
|
||||
|
||||
# To get a full backtrace:
|
||||
# 1. Rebuild with debug info.
|
||||
rm -rf nvim.core build
|
||||
gmake CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_EXTRA_FLAGS="-DCI_BUILD=ON -DMIN_LOG_LEVEL=3" nvim
|
||||
# 2. Run the failing test to generate a new core file.
|
||||
TEST_FILE=test/functional/foo.lua gmake functionaltest
|
||||
lldb build/bin/nvim -c nvim.core
|
||||
```
|
||||
|
||||
### Clang scan-build
|
||||
|
||||
View the [Clang report] to see potential bugs found by the Clang
|
||||
[scan-build](https://clang-analyzer.llvm.org/scan-build.html) analyzer.
|
||||
|
||||
- Search the Neovim commit history to find examples:
|
||||
```
|
||||
git log --oneline --no-merges --grep clang
|
||||
```
|
||||
- To verify a fix locally, run `scan-build` like this:
|
||||
```
|
||||
rm -rf build/
|
||||
scan-build --use-analyzer=/usr/bin/clang make
|
||||
```
|
||||
|
||||
### PVS-Studio
|
||||
|
||||
View the [PVS report](https://neovim.io/doc/reports/pvs/PVS-studio.html.d/) to
|
||||
see potential bugs found by [PVS Studio](https://www.viva64.com/en/pvs-studio/).
|
||||
|
||||
- Use this format for commit messages (where `{id}` is the PVS warning-id)):
|
||||
```
|
||||
fix(PVS/V{id}): {description}
|
||||
```
|
||||
- Search the Neovim commit history to find examples:
|
||||
```
|
||||
git log --oneline --no-merges --grep PVS
|
||||
```
|
||||
- Try `./scripts/pvscheck.sh` to run PVS locally.
|
||||
|
||||
### Coverity
|
||||
|
||||
Coverity runs against the master build. To view the defects you must
|
||||
[request access](https://scan.coverity.com/projects/neovim-neovim) (Coverity
|
||||
does not have a "public" view), then you will be approved as soon as
|
||||
a maintainer sees the email.
|
||||
[Coverity](https://scan.coverity.com/projects/neovim-neovim) runs against the
|
||||
master build. To view the defects, just request access; you will be approved.
|
||||
|
||||
- Use this format for commit messages (where `{id}` is the CID (Coverity ID);
|
||||
([example](https://github.com/neovim/neovim/pull/804))):
|
||||
@ -144,21 +181,21 @@ a maintainer sees the email.
|
||||
fix(coverity/{id}): {description}
|
||||
```
|
||||
- Search the Neovim commit history to find examples:
|
||||
```bash
|
||||
```
|
||||
git log --oneline --no-merges --grep coverity
|
||||
```
|
||||
|
||||
### Sanitizers (ASAN and UBSAN)
|
||||
### Clang sanitizers (ASAN and UBSAN)
|
||||
|
||||
ASAN/UBSAN can be used to detect memory errors and other common forms of undefined behavior at runtime in debug builds.
|
||||
|
||||
- To build Neovim with sanitizers enabled, use
|
||||
```
|
||||
rm -rf build && CMAKE_EXTRA_FLAGS="-DCMAKE_C_COMPILER=clang -DENABLE_ASAN_UBSAN=1" make
|
||||
rm -rf build && CMAKE_EXTRA_FLAGS="-DCMAKE_C_COMPILER=clang -DCLANG_ASAN_UBSAN=1" make
|
||||
```
|
||||
- When running Neovim, use
|
||||
```
|
||||
ASAN_OPTIONS=log_path=/tmp/nvim_asan nvim args...
|
||||
UBSAN_OPTIONS=print_stacktrace=1 ASAN_OPTIONS=log_path=/tmp/nvim_asan nvim args...
|
||||
```
|
||||
- If Neovim exits unexpectedly, check `/tmp/nvim_asan.{PID}` (or your preferred `log_path`) for log files with error messages.
|
||||
|
||||
@ -170,27 +207,28 @@ Coding
|
||||
|
||||
You can run the linter locally by:
|
||||
|
||||
```bash
|
||||
make lint
|
||||
```
|
||||
make lint
|
||||
|
||||
The lint step downloads the [master error list] and excludes them, so only lint
|
||||
errors related to the local changes are reported.
|
||||
|
||||
You can lint a single file (but this will _not_ exclude legacy errors):
|
||||
|
||||
./src/clint.py src/nvim/ops.c
|
||||
|
||||
### Style
|
||||
|
||||
- You can format files by using:
|
||||
```bash
|
||||
make format # or formatc, formatlua
|
||||
```
|
||||
This will format changed Lua and C files with all appropriate flags set.
|
||||
- Style rules are (mostly) defined by `src/uncrustify.cfg` which tries to match
|
||||
the [style-guide]. To use the Nvim `gq` command with `uncrustify`:
|
||||
```vim
|
||||
```
|
||||
if !empty(findfile('src/uncrustify.cfg', ';'))
|
||||
setlocal formatprg=uncrustify\ -q\ -l\ C\ -c\ src/uncrustify.cfg\ --no-backup
|
||||
endif
|
||||
```
|
||||
The required version of `uncrustify` is specified in `uncrustify.cfg`.
|
||||
- There is also `.clang-format` which has drifted from the [style-guide], but
|
||||
is available for reference. To use the Nvim `gq` command with `clang-format`:
|
||||
```vim
|
||||
```
|
||||
if !empty(findfile('.clang-format', ';'))
|
||||
setlocal formatprg=clang-format\ -style=file
|
||||
endif
|
||||
@ -198,176 +236,55 @@ make lint
|
||||
|
||||
### Navigate
|
||||
|
||||
- Set `blame.ignoreRevsFile` to ignore [noisy commits](https://github.com/neovim/neovim/commit/2d240024acbd68c2d3f82bc72cb12b1a4928c6bf) in git blame:
|
||||
```bash
|
||||
- Set `blame.ignoreRevsFile` to ignore [noise commits](https://github.com/neovim/neovim/commit/2d240024acbd68c2d3f82bc72cb12b1a4928c6bf) in git blame:
|
||||
```
|
||||
git config blame.ignoreRevsFile .git-blame-ignore-revs
|
||||
```
|
||||
|
||||
- Recommendation is to use **[clangd]**.
|
||||
Can use the maintained config in [nvim-lspconfig/clangd].
|
||||
- Use **[universal-ctags](https://github.com/universal-ctags/ctags).**
|
||||
("Exuberant ctags", the typical `ctags` binary provided by your distro, is
|
||||
unmaintained and won't recognize many function signatures in Neovim source.)
|
||||
- Explore the source code [on the web](https://sourcegraph.com/github.com/neovim/neovim).
|
||||
|
||||
### Includes
|
||||
|
||||
For managing includes in C files, use [include-what-you-use].
|
||||
|
||||
- [Install include-what-you-use][include-what-you-use-install]
|
||||
- To see which includes needs fixing use the cmake preset `iwyu`:
|
||||
```bash
|
||||
cmake --preset iwyu
|
||||
cmake --build build
|
||||
```
|
||||
- There's also a make target that automatically fixes the suggestions from
|
||||
IWYU:
|
||||
```bash
|
||||
make iwyu
|
||||
```
|
||||
|
||||
See [#549][549] for more details.
|
||||
|
||||
### Lua runtime files
|
||||
|
||||
Most of the Lua core [`runtime/`](./runtime) modules are precompiled to
|
||||
bytecode, so changes to those files won't get used unless you rebuild Nvim or
|
||||
by passing `--luamod-dev` and `$VIMRUNTIME`. For example, try adding a function
|
||||
to `runtime/lua/vim/_editor.lua` then:
|
||||
|
||||
```bash
|
||||
VIMRUNTIME=./runtime ./build/bin/nvim --luamod-dev
|
||||
```
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
Read [:help dev-doc][dev-doc-guide] to understand the expected documentation style and conventions.
|
||||
|
||||
### Generating :help
|
||||
|
||||
Many `:help` docs are autogenerated from (C or Lua) docstrings. To generate the documentation run:
|
||||
|
||||
```bash
|
||||
make doc
|
||||
```
|
||||
|
||||
To validate the documentation files, run:
|
||||
|
||||
```bash
|
||||
make lintdoc
|
||||
```
|
||||
|
||||
If you need to modify or debug the documentation flow, these are the main files:
|
||||
- `./scripts/gen_vimdoc.lua`:
|
||||
Main doc generator. Parses C and Lua files to render vimdoc files.
|
||||
- `./scripts/luacats_parser.lua`:
|
||||
Documentation parser for Lua files.
|
||||
- `./scripts/cdoc_parser.lua`:
|
||||
Documentation parser for C files.
|
||||
- `./scripts/luacats_grammar.lua`:
|
||||
Lpeg grammar for LuaCATS
|
||||
- `./scripts/cdoc_grammar.lua`:
|
||||
Lpeg grammar for C doc comments
|
||||
- `./scripts/gen_eval_files.lua`:
|
||||
Generates documentation and Lua type files from metadata files:
|
||||
```
|
||||
runtime/lua/vim/* => runtime/doc/lua.txt
|
||||
runtime/lua/vim/* => runtime/doc/lua.txt
|
||||
runtime/lua/vim/lsp/ => runtime/doc/lsp.txt
|
||||
src/nvim/api/* => runtime/doc/api.txt
|
||||
src/nvim/eval.lua => runtime/doc/builtin.txt
|
||||
src/nvim/options.lua => runtime/doc/options.txt
|
||||
```
|
||||
|
||||
- `./scripts/lintdoc.lua`: Validation and linting of documentation files.
|
||||
|
||||
### Lua docstrings
|
||||
|
||||
Use [LuaLS] annotations in Lua docstrings to annotate parameter types, return
|
||||
types, etc. See [:help dev-lua-doc][dev-lua-doc].
|
||||
|
||||
- The template for function documentation is:
|
||||
```lua
|
||||
--- {Brief}
|
||||
---
|
||||
--- {Long explanation}
|
||||
---
|
||||
--- @param arg1 type {description}
|
||||
--- @param arg2 type {description}
|
||||
--- ...
|
||||
---
|
||||
--- @return type {description}
|
||||
```
|
||||
- If possible, add type information (`table`, `string`, `number`, ...). Multiple valid types are separated by a bar (`string|table`). Indicate optional parameters via `type|nil`.
|
||||
- If a function in your Lua module should _not_ be documented, add `@nodoc`.
|
||||
- If the function is internal or otherwise non-public add `@private`.
|
||||
- Private functions usually should be underscore-prefixed (named "_foo", not "foo").
|
||||
- Mark deprecated functions with `@deprecated`.
|
||||
|
||||
Third-party dependencies
|
||||
------------------------
|
||||
|
||||
To build Nvim using a different commit of a dependency change the appropriate
|
||||
URL in `cmake.deps/deps.txt`. For example, to use a different version of luajit
|
||||
replace the value in `LUAJIT_URL` with the wanted commit hash:
|
||||
|
||||
```bash
|
||||
LUAJIT_URL https://github.com/LuaJIT/LuaJIT/archive/<sha>.tar.gz
|
||||
```
|
||||
|
||||
Set `DEPS_IGNORE_SHA` to `TRUE` in `cmake.deps/CMakeLists.txt` to skip hash
|
||||
check from cmake.
|
||||
|
||||
Alternatively, you may point the URL as a local path where the repository is.
|
||||
This is convenient when bisecting a problem in a dependency with `git bisect`.
|
||||
This may require running `make distclean` between each build. Hash checking is
|
||||
always skipped in this case regardless of `DEPS_IGNORE_SHA`.
|
||||
|
||||
```bash
|
||||
LUAJIT_URL /home/user/luajit
|
||||
```
|
||||
|
||||
Reviewing
|
||||
---------
|
||||
|
||||
To help review pull requests, start with [this checklist][review-checklist].
|
||||
|
||||
Reviewing can be done on GitHub, but you may find it easier to do locally.
|
||||
Using [GitHub CLI][gh], you can create a new branch with the contents of a pull
|
||||
Using [`hub`][hub], you can create a new branch with the contents of a pull
|
||||
request, e.g. [#1820][1820]:
|
||||
|
||||
```bash
|
||||
gh pr checkout https://github.com/neovim/neovim/pull/1820
|
||||
```
|
||||
hub checkout https://github.com/neovim/neovim/pull/1820
|
||||
|
||||
Use [`git log -p master..FETCH_HEAD`][git-history-filtering] to list all
|
||||
commits in the feature branch which aren't in the `master` branch; `-p`
|
||||
shows each commit's diff. To show the whole surrounding function of a change
|
||||
as context, use the `-W` argument as well.
|
||||
|
||||
[549]: https://github.com/neovim/neovim/issues/549
|
||||
[1820]: https://github.com/neovim/neovim/pull/1820
|
||||
[3174]: https://github.com/neovim/neovim/issues/3174
|
||||
[ASan]: http://clang.llvm.org/docs/AddressSanitizer.html
|
||||
[Cirrus CI]: https://cirrus-ci.com/github/neovim/neovim
|
||||
[Clang report]: https://neovim.io/doc/reports/clang/
|
||||
[GitHub Actions]: https://github.com/neovim/neovim/actions
|
||||
[Vim]: https://github.com/vim/vim
|
||||
[clangd]: https://clangd.llvm.org
|
||||
[Merge a Vim patch]: https://neovim.io/doc/user/dev_vimpatch.html
|
||||
[complexity:low]: https://github.com/neovim/neovim/issues?q=is%3Aopen+is%3Aissue+label%3Acomplexity%3Alow
|
||||
[conventional_commits]: https://www.conventionalcommits.org
|
||||
[dev-doc-guide]: https://neovim.io/doc/user/develop.html#dev-doc
|
||||
[dev-lua-doc]: https://neovim.io/doc/user/develop.html#dev-lua-doc
|
||||
[LuaLS]: https://luals.github.io/wiki/annotations/
|
||||
[gcc-warnings]: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
|
||||
[gh]: https://cli.github.com/
|
||||
[git-bisect]: http://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git
|
||||
[git-feature-branch]: https://www.atlassian.com/git/tutorials/comparing-workflows
|
||||
[git-history-filtering]: https://www.atlassian.com/git/tutorials/git-log/filtering-the-commit-history
|
||||
[git-history-rewriting]: http://git-scm.com/book/en/v2/Git-Tools-Rewriting-History
|
||||
[git-rebasing]: http://git-scm.com/book/en/v2/Git-Branching-Rebasing
|
||||
[github-issues]: https://github.com/neovim/neovim/issues
|
||||
[include-what-you-use-install]: https://github.com/include-what-you-use/include-what-you-use#how-to-install
|
||||
[include-what-you-use]: https://github.com/include-what-you-use/include-what-you-use#using-with-cmake
|
||||
[lua-language-server]: https://github.com/sumneko/lua-language-server/
|
||||
[nvim-lspconfig/clangd]: https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#clangd
|
||||
[pr-draft]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request
|
||||
[pr-ready]: https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request
|
||||
[run-tests]: https://github.com/neovim/neovim/blob/master/test/README.md#running-tests
|
||||
[1820]: https://github.com/neovim/neovim/pull/1820
|
||||
[hub]: https://hub.github.com/
|
||||
[conventional_commits]: https://www.conventionalcommits.org
|
||||
[style-guide]: https://neovim.io/doc/user/dev_style.html#dev-style
|
||||
[wiki-faq]: https://neovim.io/doc/user/faq.html
|
||||
[ASan]: http://clang.llvm.org/docs/AddressSanitizer.html
|
||||
[run-tests]: https://github.com/neovim/neovim/blob/master/test/README.md#running-tests
|
||||
[wiki-faq]: https://github.com/neovim/neovim/wiki/FAQ
|
||||
[review-checklist]: https://github.com/neovim/neovim/wiki/Code-review-checklist
|
||||
[3174]: https://github.com/neovim/neovim/issues/3174
|
||||
[sourcehut]: https://builds.sr.ht/~jmk
|
||||
[GitHub Actions]: https://github.com/neovim/neovim/actions
|
||||
[Merge a Vim patch]: https://github.com/neovim/neovim/wiki/Merging-patches-from-upstream-Vim
|
||||
[Clang report]: https://neovim.io/doc/reports/clang/
|
||||
[complexity:low]: https://github.com/neovim/neovim/issues?q=is%3Aopen+is%3Aissue+label%3Acomplexity%3Alow
|
||||
[master error list]: https://raw.githubusercontent.com/neovim/doc/gh-pages/reports/clint/errors.json
|
||||
[wiki-contribute-help]: https://github.com/neovim/neovim/wiki/contribute-%3Ahelp
|
||||
[pr-draft]: https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request
|
||||
[pr-ready]: https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request
|
||||
[uncrustify]: https://formulae.brew.sh/formula/uncrustify
|
||||
|
425
INSTALL.md
425
INSTALL.md
@ -1,425 +0,0 @@
|
||||
You can install Neovim from [download](#install-from-download), [package](#install-from-package), or [source](#install-from-source) in just a few seconds.
|
||||
|
||||
---
|
||||
|
||||
- To start Neovim, run `nvim` (not `neovim`).
|
||||
- [Discover plugins](https://github.com/neovim/neovim/wiki/Related-projects#plugins).
|
||||
- Before upgrading to a new version, **check [Breaking Changes](https://neovim.io/doc/user/news.html#news-breaking).**
|
||||
- For config (vimrc) see [the FAQ](https://neovim.io/doc/user/faq.html#faq-general).
|
||||
|
||||
---
|
||||
|
||||
Install from download
|
||||
=====================
|
||||
|
||||
Downloads are available on the [Releases](https://github.com/neovim/neovim/releases) page.
|
||||
|
||||
* Latest [stable release](https://github.com/neovim/neovim/releases/latest)
|
||||
* [macOS x86](https://github.com/neovim/neovim/releases/latest/download/nvim-macos-x86_64.tar.gz)
|
||||
* [macOS arm](https://github.com/neovim/neovim/releases/latest/download/nvim-macos-arm64.tar.gz)
|
||||
* [Linux](https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz)
|
||||
* [Windows](https://github.com/neovim/neovim/releases/latest/download/nvim-win64.msi)
|
||||
* Latest [development prerelease](https://github.com/neovim/neovim/releases/nightly)
|
||||
|
||||
|
||||
Install from package
|
||||
====================
|
||||
|
||||
Packages are listed below. (You can also [build Neovim from source](#install-from-source).)
|
||||
|
||||
## Windows
|
||||
|
||||
Windows 8+ is required. Windows 7 or older is not supported.
|
||||
|
||||
### [Winget](https://docs.microsoft.com/en-us/windows/package-manager/winget/)
|
||||
|
||||
- **Release:** `winget install Neovim.Neovim`
|
||||
|
||||
### [Chocolatey](https://chocolatey.org)
|
||||
|
||||
- **Latest Release:** `choco install neovim` (use -y for automatically skipping confirmation messages)
|
||||
- **Development (pre-release):** `choco install neovim --pre`
|
||||
|
||||
### [Scoop](https://scoop.sh/)
|
||||
```
|
||||
scoop bucket add main
|
||||
scoop install neovim
|
||||
```
|
||||
- **Release:** `scoop install neovim`
|
||||
|
||||
Several Neovim GUIs are available from scoop (extras): [scoop.sh/#/apps?q=neovim](https://scoop.sh/#/apps?q=neovim)
|
||||
|
||||
### Pre-built archives
|
||||
|
||||
0. If you are missing `VCRUNTIME140.dll`, install the [Visual Studio 2015 C++ redistributable](https://support.microsoft.com/en-us/kb/2977003) (choose x86_64 or x86 depending on your system).
|
||||
1. Choose a package (**nvim-winXX.zip**) from the [releases page](https://github.com/neovim/neovim/releases).
|
||||
2. Unzip the package. Any location is fine, administrator privileges are _not_ required.
|
||||
- `$VIMRUNTIME` will be set to that location automatically.
|
||||
3. Run `nvim.exe` from a terminal.
|
||||
|
||||
**Optional** steps:
|
||||
|
||||
- Add the `bin` folder (e.g. `C:\Program Files\nvim\bin`) to your PATH.
|
||||
- This makes it easy to run `nvim` from anywhere.
|
||||
- If `:set spell` does not work, create the `C:/Users/foo/AppData/Local/nvim/site/spell` folder.
|
||||
You can then copy your spell files over (for English, located
|
||||
[here](https://github.com/vim/vim/blob/master/runtime/spell/en.utf-8.spl) and
|
||||
[here](https://github.com/vim/vim/blob/master/runtime/spell/en.utf-8.sug));
|
||||
- For Python plugins you need the `pynvim` module. "Virtual envs" are recommended. After activating the virtual env do `pip install pynvim` (in *both*). Edit your `init.vim` so that it contains the path to the env's Python executable:
|
||||
```vim
|
||||
let g:python3_host_prog='C:/Users/foo/Envs/neovim3/Scripts/python.exe'
|
||||
```
|
||||
- Run `:checkhealth` and read `:help provider-python`.
|
||||
- **init.vim ("vimrc"):** If you already have Vim installed you can copy `%userprofile%\_vimrc` to `%userprofile%\AppData\Local\nvim\init.vim` to use your Vim config with Neovim.
|
||||
|
||||
|
||||
## macOS / OS X
|
||||
|
||||
### Pre-built archives
|
||||
|
||||
The [Releases](https://github.com/neovim/neovim/releases) page provides pre-built binaries for macOS 10.15+.
|
||||
|
||||
For x86_64:
|
||||
|
||||
curl -LO https://github.com/neovim/neovim/releases/download/nightly/nvim-macos-x86_64.tar.gz
|
||||
tar xzf nvim-macos-x86_64.tar.gz
|
||||
./nvim-macos-x86_64/bin/nvim
|
||||
|
||||
For arm64:
|
||||
|
||||
curl -LO https://github.com/neovim/neovim/releases/download/nightly/nvim-macos-arm64.tar.gz
|
||||
tar xzf nvim-macos-arm64.tar.gz
|
||||
./nvim-macos-arm64/bin/nvim
|
||||
|
||||
### [Homebrew](https://brew.sh) on macOS or Linux
|
||||
|
||||
brew install neovim
|
||||
|
||||
### [MacPorts](https://www.macports.org/)
|
||||
|
||||
sudo port selfupdate
|
||||
sudo port install neovim
|
||||
|
||||
## Linux
|
||||
|
||||
### Pre-built archives
|
||||
|
||||
The [Releases](https://github.com/neovim/neovim/releases) page provides pre-built binaries for Linux systems.
|
||||
|
||||
```sh
|
||||
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz
|
||||
sudo rm -rf /opt/nvim
|
||||
sudo tar -C /opt -xzf nvim-linux64.tar.gz
|
||||
```
|
||||
|
||||
After this step add this to `~/.bashrc`:
|
||||
|
||||
export PATH="$PATH:/opt/nvim-linux64/bin"
|
||||
|
||||
### AppImage ("universal" Linux package)
|
||||
|
||||
The [Releases](https://github.com/neovim/neovim/releases) page provides an [AppImage](https://appimage.org) that runs on most Linux systems. No installation is needed, just download `nvim.appimage` and run it. (It might not work if your Linux distribution is more than 4 years old.)
|
||||
|
||||
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
|
||||
chmod u+x nvim.appimage
|
||||
./nvim.appimage
|
||||
|
||||
To expose nvim globally:
|
||||
|
||||
mkdir -p /opt/nvim
|
||||
mv nvim.appimage /opt/nvim/nvim
|
||||
|
||||
And the following line to `~/.bashrc`:
|
||||
|
||||
export PATH="$PATH:/opt/nvim/"
|
||||
|
||||
If the `./nvim.appimage` command fails, try:
|
||||
```sh
|
||||
./nvim.appimage --appimage-extract
|
||||
./squashfs-root/AppRun --version
|
||||
|
||||
# Optional: exposing nvim globally.
|
||||
sudo mv squashfs-root /
|
||||
sudo ln -s /squashfs-root/AppRun /usr/bin/nvim
|
||||
nvim
|
||||
```
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Neovim can be installed from the community repository:
|
||||
|
||||
sudo pacman -S neovim
|
||||
|
||||
Alternatively, Neovim can be also installed using the PKGBUILD [`neovim-git`](https://aur.archlinux.org/packages/neovim-git), available on the [AUR](https://wiki.archlinux.org/index.php/Arch_User_Repository).
|
||||
|
||||
Alternatively, Neovim Nightly builds can be also installed using the PKGBUILD [`neovim-nightly-bin`](https://aur.archlinux.org/packages/neovim-nightly-bin), available on the [AUR](https://wiki.archlinux.org/index.php/Arch_User_Repository).
|
||||
|
||||
The Python module is available from the community repository:
|
||||
|
||||
sudo pacman -S python-pynvim
|
||||
|
||||
Ruby modules (currently only supported in `neovim-git`) are available from the AUR as [`ruby-neovim`](https://aur.archlinux.org/packages/ruby-neovim).
|
||||
|
||||
### CentOS 8 / RHEL 8
|
||||
|
||||
Neovim is available through [EPEL (Extra Packages for Enterprise Linux)](https://fedoraproject.org/wiki/EPEL)
|
||||
|
||||
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
|
||||
yum install -y neovim python3-neovim
|
||||
|
||||
### Clear Linux OS
|
||||
|
||||
Neovim is available through the [neovim bundle](https://github.com/clearlinux/clr-bundles/blob/master/bundles/neovim)
|
||||
|
||||
sudo swupd bundle-add neovim
|
||||
|
||||
Python (`:python`) support is available if the [python-basic bundle](https://github.com/clearlinux/clr-bundles/blob/master/bundles/python-basic) is installed.
|
||||
|
||||
sudo swupd bundle-add python-basic
|
||||
|
||||
### Debian
|
||||
|
||||
Neovim is in [Debian](https://packages.debian.org/search?keywords=neovim).
|
||||
|
||||
sudo apt-get install neovim
|
||||
|
||||
Python (`:python`) support is installable via the package manager on Debian unstable.
|
||||
|
||||
sudo apt-get install python3-neovim
|
||||
|
||||
### Exherbo Linux
|
||||
|
||||
Exhereses for scm and released versions are currently available in repository `::medvid`. Python client (with GTK+ GUI included) and Qt5 GUI are also available as suggestions:
|
||||
|
||||
cave resolve app-editors/neovim --take dev-python/neovim-python --take app-editors/neovim-qt
|
||||
|
||||
### Fedora
|
||||
|
||||
Neovim is in [Fedora](https://src.fedoraproject.org/rpms/neovim) starting with Fedora 25:
|
||||
|
||||
sudo dnf install -y neovim python3-neovim
|
||||
|
||||
You can also get nightly builds of git master from the [Copr automated build system](https://copr.fedoraproject.org/coprs/agriffis/neovim-nightly/):
|
||||
|
||||
dnf copr enable agriffis/neovim-nightly
|
||||
dnf install -y neovim python3-neovim
|
||||
|
||||
See the [blog post](https://arongriffis.com/2019/03/02/neovim-nightly-builds) for information on how these are built.
|
||||
|
||||
### Flatpak
|
||||
|
||||
You can find Neovim on [Flathub](https://flathub.org/apps/details/io.neovim.nvim). Providing you have Flatpak [set up](https://flatpak.org/setup/):
|
||||
|
||||
flatpak install flathub io.neovim.nvim
|
||||
flatpak run io.neovim.nvim
|
||||
|
||||
You can add `/var/lib/flatpak/exports/bin` (or `~/.local/share/flatpak/exports/bin` if you used `--user`) to the `$PATH` and run it with `io.neovim.nvim`.
|
||||
|
||||
Note that Flatpak'ed Neovim will look for `init.vim` in `~/.var/app/io.neovim.nvim/config/nvim` instead of `~/.config/nvim`.
|
||||
|
||||
### Gentoo Linux
|
||||
|
||||
An ebuild is available in Gentoo's official portage repository:
|
||||
|
||||
emerge -a app-editors/neovim
|
||||
|
||||
### GNU Guix
|
||||
|
||||
Neovim can be installed with:
|
||||
|
||||
guix install neovim
|
||||
|
||||
### GoboLinux
|
||||
|
||||
Neovim can be installed with:
|
||||
|
||||
sudo -H Compile NeoVim
|
||||
|
||||
### Nix / NixOS
|
||||
|
||||
Neovim can be installed with:
|
||||
|
||||
nix-env -iA nixpkgs.neovim
|
||||
|
||||
Or alternatively, if you use flakes:
|
||||
|
||||
nix profile install nixpkgs#neovim
|
||||
|
||||
### Mageia 7
|
||||
|
||||
urpmi neovim
|
||||
|
||||
To install the Python modules:
|
||||
|
||||
urpmi python3-pynvim
|
||||
|
||||
### makedeb Package Repository (MPR)
|
||||
|
||||
Neovim is available inside the [MPR](https://mpr.makedeb.org/packages/neovim). You can install it with:
|
||||
|
||||
git clone https://mpr.makedeb.org/neovim
|
||||
cd neovim/
|
||||
makedeb -si
|
||||
|
||||
### OpenSUSE
|
||||
|
||||
Neovim can be installed with:
|
||||
|
||||
sudo zypper in neovim
|
||||
|
||||
To install the Python modules:
|
||||
|
||||
sudo zypper in python-neovim python3-neovim
|
||||
|
||||
### PLD Linux
|
||||
|
||||
Neovim is in [PLD Linux](https://github.com/pld-linux/neovim):
|
||||
|
||||
poldek -u neovim
|
||||
poldek -u python-neovim python3-neovim
|
||||
poldek -u python-neovim-gui python3-neovim-gui
|
||||
|
||||
### Slackware
|
||||
|
||||
See [neovim on SlackBuilds](https://slackbuilds.org/apps/neovim/).
|
||||
|
||||
### Source Mage
|
||||
|
||||
Neovim can be installed using the Sorcery package manager:
|
||||
|
||||
cast neovim
|
||||
|
||||
### Solus
|
||||
|
||||
Neovim can be installed using the default package manager in Solus (eopkg):
|
||||
|
||||
sudo eopkg install neovim
|
||||
|
||||
### Snap
|
||||
|
||||
Neovim nightly and stable are available on the [snap store](https://snapcraft.io/nvim).
|
||||
|
||||
**Stable Builds**
|
||||
|
||||
```sh
|
||||
sudo snap install --beta nvim --classic
|
||||
```
|
||||
|
||||
**Nightly Builds**
|
||||
|
||||
```sh
|
||||
sudo snap install --edge nvim --classic
|
||||
```
|
||||
|
||||
### Ubuntu
|
||||
As in Debian, Neovim is in [Ubuntu](https://packages.ubuntu.com/search?keywords=neovim).
|
||||
|
||||
sudo apt install neovim
|
||||
|
||||
Python (`:python`) support seems to be automatically installed
|
||||
|
||||
sudo apt install python3-neovim
|
||||
|
||||
Neovim has been added to a "Personal Package Archive" (PPA). This allows you to install it with `apt-get`. Follow the links to the PPAs to see which versions of Ubuntu are currently available via the PPA. Choose **stable** or **unstable**:
|
||||
|
||||
- [https://launchpad.net/~neovim-ppa/+archive/ubuntu/**stable**](https://launchpad.net/~neovim-ppa/+archive/ubuntu/stable)
|
||||
- [https://launchpad.net/~neovim-ppa/+archive/ubuntu/**unstable**](https://launchpad.net/~neovim-ppa/+archive/ubuntu/unstable)
|
||||
|
||||
**Important:** The Neovim team does not maintain the PPA packages. For problems or questions about the PPA specifically contact https://launchpad.net/~neovim-ppa.
|
||||
|
||||
To be able to use **add-apt-repository** you may need to install software-properties-common:
|
||||
|
||||
sudo apt-get install software-properties-common
|
||||
|
||||
If you're using an older version Ubuntu you must use:
|
||||
|
||||
sudo apt-get install python-software-properties
|
||||
|
||||
Run the following commands:
|
||||
|
||||
sudo add-apt-repository ppa:neovim-ppa/stable
|
||||
sudo apt-get update
|
||||
sudo apt-get install neovim
|
||||
|
||||
Prerequisites for the Python modules:
|
||||
|
||||
sudo apt-get install python-dev python-pip python3-dev python3-pip
|
||||
|
||||
If you're using an older version Ubuntu you must use:
|
||||
|
||||
sudo apt-get install python-dev python-pip python3-dev
|
||||
sudo apt-get install python3-setuptools
|
||||
sudo easy_install3 pip
|
||||
|
||||
### Void-Linux
|
||||
|
||||
Neovim can be installed using the xbps package manager
|
||||
|
||||
sudo xbps-install -S neovim
|
||||
|
||||
### Alpine Linux
|
||||
|
||||
Neovim can be installed using the apk package manager
|
||||
|
||||
sudo apk add neovim
|
||||
|
||||
## BSD
|
||||
|
||||
### FreeBSD
|
||||
|
||||
Neovim can be installed using [`pkg(8)`](https://www.freebsd.org/cgi/man.cgi?query=pkg&sektion=8&n=1):
|
||||
|
||||
pkg install neovim
|
||||
|
||||
or [from the ports tree](https://www.freshports.org/editors/neovim/):
|
||||
|
||||
cd /usr/ports/editors/neovim/ && make install clean
|
||||
|
||||
To install the pynvim Python modules using [`pkg(8)`](https://www.freebsd.org/cgi/man.cgi?query=pkg&sektion=8&n=1) run:
|
||||
|
||||
pkg install py36-pynvim
|
||||
|
||||
### OpenBSD
|
||||
|
||||
Neovim can be installed using [`pkg_add(1)`](https://man.openbsd.org/pkg_add):
|
||||
|
||||
pkg_add neovim
|
||||
|
||||
or [from the ports tree](https://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/editors/neovim/):
|
||||
|
||||
cd /usr/ports/editors/neovim/ && make install
|
||||
|
||||
## Android
|
||||
|
||||
[Termux](https://github.com/termux/termux-app) offers a Neovim package.
|
||||
|
||||
|
||||
Install from source
|
||||
===================
|
||||
|
||||
If a package is not provided for your platform, you can build Neovim from source. See [BUILD.md](./BUILD.md) for details. If you have the [prerequisites](./BUILD.md#build-prerequisites) then building is easy:
|
||||
|
||||
make CMAKE_BUILD_TYPE=Release
|
||||
sudo make install
|
||||
|
||||
For Unix-like systems this installs Neovim to `/usr/local`, while for Windows to `C:\Program Files`. Note, however, that this can complicate uninstallation. The following example avoids this by isolating an installation under `$HOME/neovim`:
|
||||
|
||||
rm -r build/ # clear the CMake cache
|
||||
make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=$HOME/neovim"
|
||||
make install
|
||||
export PATH="$HOME/neovim/bin:$PATH"
|
||||
|
||||
## Uninstall
|
||||
|
||||
There is a CMake target to _uninstall_ after `make install`:
|
||||
|
||||
```sh
|
||||
sudo cmake --build build/ --target uninstall
|
||||
```
|
||||
|
||||
Alternatively, just delete the `CMAKE_INSTALL_PREFIX` artifacts:
|
||||
|
||||
```sh
|
||||
sudo rm /usr/local/bin/nvim
|
||||
sudo rm -r /usr/local/share/nvim/
|
||||
```
|
@ -8,7 +8,7 @@ Neovim's license follows:
|
||||
====
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
https://www.apache.org/licenses/
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
@ -196,11 +196,10 @@ The externally maintained libraries used by Neovim are:
|
||||
- libtermkey: MIT license
|
||||
- libuv. Copyright Joyent, Inc. and other Node contributors. Node.js license.
|
||||
- libvterm: MIT license
|
||||
- lua-cjson: MIT license
|
||||
- lua-compat: MIT license
|
||||
- tree-sitter: MIT license
|
||||
- unibilium: LGPL v3
|
||||
- xdiff: LGPL v2
|
||||
- xdiff: LGPL license
|
||||
- lua-cjson: MIT license
|
||||
|
||||
====
|
||||
|
||||
@ -233,8 +232,8 @@ II) It is allowed to distribute a modified (or extended) version of Vim,
|
||||
maintainer will do with your changes and under what license they
|
||||
will be distributed is negotiable. If there has been no negotiation
|
||||
then this license, or a later version, also applies to your changes.
|
||||
The current maintainers are listed here: https://github.com/orgs/vim/people.
|
||||
If this changes it will be announced in appropriate places (most likely
|
||||
The current maintainer is Bram Moolenaar <Bram@vim.org>. If this
|
||||
changes it will be announced in appropriate places (most likely
|
||||
vim.sf.net, www.vim.org and/or comp.editors). When it is completely
|
||||
impossible to contact the maintainer, the obligation to send him
|
||||
your changes ceases. Once the maintainer has confirmed that he has
|
224
MAINTAIN.md
224
MAINTAIN.md
@ -12,23 +12,23 @@ General guidelines
|
||||
* Use automation to solve problems
|
||||
* Never break the API... but sometimes break the UI
|
||||
|
||||
Issue triage
|
||||
------------
|
||||
Ticket triage
|
||||
-------------
|
||||
|
||||
In practice we haven't found a way to forecast more precisely than "next" and
|
||||
"after next". So there are usually one or two (at most) planned milestones:
|
||||
|
||||
* Next bugfix-release (1.0.x)
|
||||
* Next feature-release (1.x.0)
|
||||
- Next bugfix-release (1.0.x)
|
||||
- Next feature-release (1.x.0)
|
||||
|
||||
The forecasting problem might be solved with an explicit priority system (like
|
||||
Vim's todo.txt). Meanwhile the Neovim priority system is defined by:
|
||||
Bram's todo.txt). Meanwhile the Neovim priority system is defined by:
|
||||
|
||||
* PRs nearing completion.
|
||||
* Issue labels. E.g. the `has:plan` label increases the ticket's priority merely
|
||||
- PRs nearing completion.
|
||||
- Issue labels. E.g. the `+plan` label increases the ticket's priority merely
|
||||
for having a plan written down: it is _closer to completion_ than tickets
|
||||
without a plan.
|
||||
* Comment activity or new information.
|
||||
- Comment activity or new information.
|
||||
|
||||
Anything that isn't in the next milestone, and doesn't have a finished PR—is
|
||||
just not something you care very much about, by construction. Post-release you
|
||||
@ -50,191 +50,43 @@ has a major bug:
|
||||
1. Fix the bug on `master`.
|
||||
2. Cherry-pick the fix to `release-x.y`.
|
||||
3. Cut a release from `release-x.y`.
|
||||
* Run `./scripts/release.sh` (requires [git cliff](https://github.com/orhun/git-cliff))
|
||||
* The [CI job](https://github.com/neovim/neovim/blob/3d45706478cd030c3ee05b4f336164bb96138095/.github/workflows/release.yml#L11-L13)
|
||||
will update the release assets and [force-push to the "stable" tag](https://github.com/neovim/neovim/blob/cdd87222c86c5b2274a13d36f23de0637462e317/.github/workflows/release.yml#L229).
|
||||
- Run `./scripts/release.sh`
|
||||
- Update (force-push) the remote `stable` tag.
|
||||
- The [nightly job](https://github.com/neovim/bot-ci/blob/master/ci/nightly.sh)
|
||||
will update the release assets based on the `stable` tag.
|
||||
|
||||
### Release automation
|
||||
|
||||
Neovim automation includes a [backport bot](https://github.com/korthout/backport-action).
|
||||
Trigger the action by labeling a PR with `ci:backport release-x.y`. See `.github/workflows/backport.yml`.
|
||||
|
||||
Deprecating and removing features
|
||||
---------------------------------
|
||||
|
||||
Neovim inherits many features and design decisions from Vim, not all of which
|
||||
align with the goals of this project. It is sometimes desired or necessary to
|
||||
remove existing features, or refactor parts of the code that would change
|
||||
user's workflow. In these cases, a deprecation policy is needed to properly
|
||||
inform users of the change.
|
||||
|
||||
When a (non-experimental) feature is slated to be removed it should:
|
||||
|
||||
1. Be _soft_ deprecated in the _next_ release
|
||||
- Use of the deprecated feature will still work.
|
||||
- This means deprecating via documentation and annotation (`@deprecated`).
|
||||
- Include a note in `deprecated.txt`.
|
||||
- For Lua features, use `vim.deprecate()`. The specified version is the
|
||||
current minor version + 2. For example, if the current version is
|
||||
`v0.10.0-dev-1957+gd676746c33` then use `0.12`.
|
||||
- For Vimscript features, use `v:lua.vim.deprecate()`. Use the same version
|
||||
as described for Lua features.
|
||||
2. Be _hard_ deprecated in a following a release in which it was soft deprecated.
|
||||
- Use of the deprecated feature will still work but should issue a warning.
|
||||
- Features implemented in C will need bespoke implementations to communicate
|
||||
to users that the feature is deprecated.
|
||||
3. Be removed in a release following the release in which it was hard deprecated
|
||||
- Usually this will be the next release, but it may be a later release if
|
||||
a longer deprecation cycle is desired
|
||||
- If possible, keep the feature as a stub (e.g. function API) and issue an
|
||||
error when it is accessed.
|
||||
|
||||
Example:
|
||||
|
||||
Deprecation Removal
|
||||
┆ ┆ ┆
|
||||
┆ Soft ┆ Hard ┆
|
||||
┆ Deprecation ┆ Deprecation ┆
|
||||
┆ Period ┆ Period ┆
|
||||
────────────────────────────────────────────────────────────
|
||||
Version: 0.10 0.11 0.12
|
||||
────────────────────────────────────────────────────────────
|
||||
Old code Old code Old code
|
||||
+ +
|
||||
New code New code New code
|
||||
|
||||
Feature removals which may benefit from community input or further discussion
|
||||
should also have a tracking issue (which should be linked to in the release
|
||||
notes).
|
||||
|
||||
Exceptions to this policy may be made (for experimental subsystems or when
|
||||
there is broad consensus among maintainers). The rationale for the exception
|
||||
should be stated explicitly and publicly.
|
||||
The neovim repository includes a backport [github action](https://github.com/zeebe-io/backport-action).
|
||||
In order to trigger the action, a PR must be labeled with a label matching the
|
||||
form `backport release-0.X`. If the label is applied before the PR is merged,
|
||||
the backport will be filed automatically against the target branch. Otherwise,
|
||||
comment `\backport` on the merged PR *after* the label has been applied to trigger
|
||||
a backport. Note, the PR must have a description in the issue body, or the backport
|
||||
will fail.
|
||||
|
||||
Third-party dependencies
|
||||
------------------------
|
||||
--------------
|
||||
|
||||
For some dependencies we maintain temporary "forks", which are simply private
|
||||
branches with a few extra patches, while we wait for the upstream project to
|
||||
merge the patches. This is done instead of maintaining the patches as (fragile)
|
||||
CMake `PATCH_COMMAND` steps.
|
||||
These "bundled" dependencies can be updated by bumping their versions in `third-party/CMakeLists.txt`:
|
||||
- [Lua](https://www.lua.org/download.html)
|
||||
- [LuaJIT](https://github.com/LuaJIT/LuaJIT)
|
||||
- [Luv](https://github.com/luvit/luv)
|
||||
- [libtermkey](https://github.com/neovim/libtermkey)
|
||||
- [libuv](https://github.com/libuv/libuv)
|
||||
- [libvterm](http://www.leonerd.org.uk/code/libvterm/)
|
||||
- [lua-compat](https://github.com/keplerproject/lua-compat-5.3)
|
||||
- [tree-sitter](https://github.com/tree-sitter/tree-sitter)
|
||||
|
||||
These "bundled" dependencies can be updated by bumping their versions in `cmake.deps/deps.txt`.
|
||||
Some can be auto-bumped by `scripts/bump_deps.lua`.
|
||||
These dependencies are "vendored" (inlined), we need to update the sources manually:
|
||||
- [libmpack](https://github.com/libmpack/libmpack)
|
||||
- [xdiff](https://github.com/git/git/tree/master/xdiff)
|
||||
- [lua-cjson](https://github.com/openresty/lua-cjson)
|
||||
- [Klib](https://github.com/attractivechaos/klib)
|
||||
|
||||
* [LuaJIT](https://github.com/LuaJIT/LuaJIT)
|
||||
* [Lua](https://www.lua.org/download.html)
|
||||
* [Luv](https://github.com/luvit/luv)
|
||||
* When bumping, also sync [our bundled documentation](https://github.com/neovim/neovim/blob/master/runtime/doc/luvref.txt) with [the upstream documentation](https://github.com/luvit/luv/blob/master/docs.md).
|
||||
* [gettext](https://ftp.gnu.org/pub/gnu/gettext/)
|
||||
* [libiconv](https://ftp.gnu.org/pub/gnu/libiconv)
|
||||
* [libuv](https://github.com/libuv/libuv)
|
||||
* [libvterm](https://www.leonerd.org.uk/code/libvterm/)
|
||||
* Downloading from the original source is unreliable, so we use our [mirror](https://github.com/neovim/libvterm) instead.
|
||||
* [lua-compat](https://github.com/keplerproject/lua-compat-5.3)
|
||||
* [tree-sitter](https://github.com/tree-sitter/tree-sitter)
|
||||
* [unibilium](https://github.com/neovim/unibilium)
|
||||
* The original project [was abandoned](https://github.com/neovim/neovim/issues/10302), so the [neovim/unibilium](https://github.com/neovim/unibilium) fork is considered "upstream" and is maintained on the `master` branch.
|
||||
* [treesitter parsers](https://github.com/neovim/neovim/blob/7e97c773e3ba78fcddbb2a0b9b0d572c8210c83e/cmake.deps/deps.txt#L47-L62)
|
||||
|
||||
### Vendored dependencies
|
||||
|
||||
These dependencies are "vendored" (inlined), we must update the sources manually:
|
||||
|
||||
* `src/mpack/`: [libmpack](https://github.com/libmpack/libmpack)
|
||||
* send improvements upstream!
|
||||
* `src/xdiff/`: [xdiff](https://github.com/git/git/tree/master/xdiff)
|
||||
* `src/cjson/`: [lua-cjson](https://github.com/openresty/lua-cjson)
|
||||
* `src/klib/`: [Klib](https://github.com/attractivechaos/klib)
|
||||
* `runtime/lua/vim/inspect.lua`: [inspect.lua](https://github.com/kikito/inspect.lua)
|
||||
* `src/nvim/tui/terminfo_defs.h`: terminfo definitions
|
||||
* Run `scripts/update_terminfo.sh` to update these definitions.
|
||||
* `runtime/lua/vim/lsp/_meta/protocol.lua`: LSP specification
|
||||
* Run `scripts/gen_lsp.lua` to update.
|
||||
* `runtime/lua/vim/_meta/lpeg.lua`: LPeg definitions.
|
||||
* Refer to [`LuaCATS/lpeg`](https://github.com/LuaCATS/lpeg) for updates.
|
||||
* Update the git SHA revision from which the documentation was taken.
|
||||
* `runtime/lua/vim/re.lua`: LPeg regex module.
|
||||
* Vendored from LPeg. Needs to be updated when LPeg is updated.
|
||||
* `runtime/lua/vim/_meta/re.lua`: docs for LPeg regex module.
|
||||
* Needs to be updated when LPeg is updated.
|
||||
* `src/bit.c`: only for PUC lua: port of `require'bit'` from luajit https://bitop.luajit.org/
|
||||
* `runtime/lua/coxpcall.lua`: coxpcall (only needed for PUC lua, builtin to luajit)
|
||||
* `src/termkey`: [libtermkey](https://github.com/neovim/libtermkey)
|
||||
|
||||
Other dependencies
|
||||
--------------------------
|
||||
|
||||
* GitHub users:
|
||||
* https://github.com/marvim
|
||||
* https://github.com/nvim-winget
|
||||
* Org secrets/tokens:
|
||||
* `CODECOV_TOKEN`
|
||||
* Domain names (held in https://namecheap.com):
|
||||
* neovim.org
|
||||
* neovim.io
|
||||
* packspec.org
|
||||
* pkgjson.org
|
||||
* DNS for the above domains is managed in https://cloudflare.com (not the domain registrar)
|
||||
|
||||
|
||||
Refactoring
|
||||
-----------
|
||||
|
||||
### Frozen legacy modules
|
||||
|
||||
Refactoring Vim structurally and aesthetically is an important goal of Neovim.
|
||||
But there are some modules that should not be changed significantly, because
|
||||
they are maintained Vim, at present. Until someone takes "ownership" of these
|
||||
modules, the cost of any significant changes (including style or structural
|
||||
changes that re-arrange the code) to these modules outweighs the benefit. The
|
||||
modules are:
|
||||
|
||||
- `regexp.c`
|
||||
- `indent_c.c`
|
||||
|
||||
Automation (CI)
|
||||
---------------
|
||||
|
||||
### Backup
|
||||
|
||||
Discussions from issues and PRs are backed up here:
|
||||
https://github.com/neovim/neovim-backup
|
||||
|
||||
### Development guidelines
|
||||
|
||||
* CI and automation jobs are primarily driven by GitHub Actions.
|
||||
* Avoid macOS if an Ubuntu or a Windows runner can be used instead. This is
|
||||
because macOS runners have [tighter restrictions on the number of concurrent
|
||||
jobs](https://docs.github.com/en/actions/learn-github-actions/usage-limits-billing-and-administration#usage-limits).
|
||||
* Runner versions:
|
||||
* For special-purpose jobs where the runner version doesn't really matter,
|
||||
prefer `-latest` tags so we don't need to manually bump the versions. An
|
||||
example of a special-purpose workflow is `labeler_pr.yml`.
|
||||
* For our testing job `test.yml`, prefer to use the latest stable (i.e.
|
||||
non-beta) version explicitly. Avoid using the `-latest` tags here as it
|
||||
makes it difficult to determine from an unrelated PR if a failure is due
|
||||
to the PR itself or due to GitHub bumping the `-latest` tag without our
|
||||
knowledge. There's also a high risk that automatically bumping the CI
|
||||
versions will fail due to manual work being required from experience.
|
||||
* For our release job, which is `release.yml`, prefer to use the oldest
|
||||
stable (i.e. non-deprecated) versions available. The reason is that we're
|
||||
trying to produce images that work in the broadest number of environments,
|
||||
and therefore want to use older releases.
|
||||
|
||||
### Special labels
|
||||
|
||||
Some github labels are used to trigger certain jobs:
|
||||
|
||||
* `ci:backport release-x.y` - backport to branch `release-x.y`
|
||||
* `ci:s390x` - enable s390x CI
|
||||
* `ci:skip-news` - skip news.yml workflows
|
||||
* `ci:windows-asan` - test windows with ASAN enabled
|
||||
* `needs:response` - close PR after a certain amount of time if author doesn't
|
||||
respond
|
||||
We also maintain some forks, particularly for Windows, if we are waiting on upstream changes:
|
||||
https://github.com/neovim/neovim/wiki/Deps
|
||||
|
||||
See also
|
||||
--------
|
||||
|
||||
* https://github.com/neovim/neovim/issues/862
|
||||
* https://github.com/git/git/blob/master/Documentation/howto/maintain-git.txt
|
||||
- https://github.com/neovim/neovim/issues/862
|
||||
- https://github.com/git/git/blob/master/Documentation/howto/maintain-git.txt
|
||||
|
198
Makefile
198
Makefile
@ -1,25 +1,3 @@
|
||||
ifeq ($(OS),Windows_NT)
|
||||
SHELL := powershell.exe
|
||||
.SHELLFLAGS := -NoProfile -NoLogo
|
||||
MKDIR := @$$null = new-item -itemtype directory -force
|
||||
TOUCH := @$$null = new-item -force
|
||||
RM := remove-item -force
|
||||
CMAKE := cmake
|
||||
CMAKE_GENERATOR := Ninja
|
||||
define rmdir
|
||||
if (Test-Path $1) { remove-item -recurse $1 }
|
||||
endef
|
||||
else
|
||||
MKDIR := mkdir -p
|
||||
TOUCH := touch
|
||||
RM := rm -rf
|
||||
CMAKE := $(shell (command -v cmake3 || command -v cmake || echo cmake))
|
||||
CMAKE_GENERATOR ?= "$(shell (command -v ninja > /dev/null 2>&1 && echo "Ninja") || echo "Unix Makefiles")"
|
||||
define rmdir
|
||||
rm -rf $1
|
||||
endef
|
||||
endif
|
||||
|
||||
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
|
||||
MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))
|
||||
|
||||
@ -31,6 +9,8 @@ filter-true = $(strip $(filter-out 1 on ON true TRUE,$1))
|
||||
|
||||
all: nvim
|
||||
|
||||
CMAKE_PRG ?= $(shell (command -v cmake3 || echo cmake))
|
||||
CMAKE_BUILD_TYPE ?= Debug
|
||||
CMAKE_FLAGS := -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE)
|
||||
# Extra CMake flags which extend the default set
|
||||
CMAKE_EXTRA_FLAGS ?=
|
||||
@ -48,7 +28,7 @@ override CMAKE_EXTRA_FLAGS += -DCMAKE_INSTALL_PREFIX=$(CMAKE_INSTALL_PREFIX)
|
||||
|
||||
checkprefix:
|
||||
@if [ -f build/.ran-cmake ]; then \
|
||||
cached_prefix=$(shell $(CMAKE) -L -N build | 2>/dev/null grep 'CMAKE_INSTALL_PREFIX' | cut -d '=' -f2); \
|
||||
cached_prefix=$(shell $(CMAKE_PRG) -L -N build | 2>/dev/null grep 'CMAKE_INSTALL_PREFIX' | cut -d '=' -f2); \
|
||||
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"; \
|
||||
$(RM) build/.ran-cmake; \
|
||||
@ -58,13 +38,42 @@ else
|
||||
checkprefix: ;
|
||||
endif
|
||||
|
||||
DEPS_BUILD_DIR ?= ".deps"
|
||||
CMAKE_GENERATOR ?= $(shell (command -v ninja > /dev/null 2>&1 && echo "Ninja") || \
|
||||
echo "Unix Makefiles")
|
||||
DEPS_BUILD_DIR ?= .deps
|
||||
ifneq (1,$(words [$(DEPS_BUILD_DIR)]))
|
||||
$(error DEPS_BUILD_DIR must not contain whitespace)
|
||||
endif
|
||||
|
||||
ifeq (,$(BUILD_TOOL))
|
||||
ifeq (Ninja,$(CMAKE_GENERATOR))
|
||||
ifneq ($(shell $(CMAKE_PRG) --help 2>/dev/null | grep Ninja),)
|
||||
BUILD_TOOL = ninja
|
||||
else
|
||||
# User's version of CMake doesn't support Ninja
|
||||
BUILD_TOOL = $(MAKE)
|
||||
CMAKE_GENERATOR := Unix Makefiles
|
||||
endif
|
||||
else
|
||||
BUILD_TOOL = $(MAKE)
|
||||
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 ?=
|
||||
USE_BUNDLED ?=
|
||||
# Back-compat: USE_BUNDLED_DEPS was the old name.
|
||||
USE_BUNDLED ?= $(USE_BUNDLED_DEPS)
|
||||
|
||||
ifneq (,$(USE_BUNDLED))
|
||||
BUNDLED_CMAKE_FLAG := -DUSE_BUNDLED=$(USE_BUNDLED)
|
||||
@ -72,7 +81,7 @@ endif
|
||||
|
||||
ifneq (,$(findstring functionaltest-lua,$(MAKECMDGOALS)))
|
||||
BUNDLED_LUA_CMAKE_FLAG := -DUSE_BUNDLED_LUA=ON
|
||||
$(shell [ -x $(DEPS_BUILD_DIR)/usr/bin/lua ] || $(RM) build/.ran-*)
|
||||
$(shell [ -x $(DEPS_BUILD_DIR)/usr/bin/lua ] || rm build/.ran-*)
|
||||
endif
|
||||
|
||||
# For use where we want to make sure only a single job is run. This does issue
|
||||
@ -80,84 +89,121 @@ endif
|
||||
SINGLE_MAKE = export MAKEFLAGS= ; $(MAKE)
|
||||
|
||||
nvim: build/.ran-cmake deps
|
||||
$(CMAKE) --build build
|
||||
+$(BUILD_TOOL) -C build
|
||||
|
||||
libnvim: build/.ran-cmake deps
|
||||
$(CMAKE) --build build --target libnvim
|
||||
+$(BUILD_TOOL) -C build libnvim
|
||||
|
||||
cmake:
|
||||
$(TOUCH) CMakeLists.txt
|
||||
touch CMakeLists.txt
|
||||
$(MAKE) build/.ran-cmake
|
||||
|
||||
build/.ran-cmake: | deps
|
||||
$(CMAKE) -B build -G $(CMAKE_GENERATOR) $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(MAKEFILE_DIR)
|
||||
$(TOUCH) $@
|
||||
cd build && $(CMAKE_PRG) -G '$(CMAKE_GENERATOR)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(MAKEFILE_DIR)
|
||||
touch $@
|
||||
|
||||
deps: | build/.ran-deps-cmake
|
||||
deps: | build/.ran-third-party-cmake
|
||||
ifeq ($(call filter-true,$(USE_BUNDLED)),)
|
||||
$(CMAKE) --build $(DEPS_BUILD_DIR)
|
||||
+$(BUILD_TOOL) -C $(DEPS_BUILD_DIR)
|
||||
endif
|
||||
|
||||
ifeq ($(call filter-true,$(USE_BUNDLED)),)
|
||||
$(DEPS_BUILD_DIR):
|
||||
$(MKDIR) $@
|
||||
build/.ran-deps-cmake:: $(DEPS_BUILD_DIR)
|
||||
$(CMAKE) -S $(MAKEFILE_DIR)/cmake.deps -B $(DEPS_BUILD_DIR) -G $(CMAKE_GENERATOR) $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) $(DEPS_CMAKE_FLAGS)
|
||||
mkdir -p "$@"
|
||||
build/.ran-third-party-cmake:: $(DEPS_BUILD_DIR)
|
||||
cd $(DEPS_BUILD_DIR) && \
|
||||
$(CMAKE_PRG) -G '$(CMAKE_GENERATOR)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \
|
||||
$(DEPS_CMAKE_FLAGS) $(MAKEFILE_DIR)/third-party
|
||||
endif
|
||||
build/.ran-deps-cmake::
|
||||
$(MKDIR) build
|
||||
$(TOUCH) "$@"
|
||||
build/.ran-third-party-cmake::
|
||||
mkdir -p build
|
||||
touch $@
|
||||
|
||||
# TODO: cmake 3.2+ add_custom_target() has a USES_TERMINAL flag.
|
||||
oldtest: | nvim
|
||||
$(SINGLE_MAKE) -C test/old/testdir clean
|
||||
oldtest: | nvim build/runtime/doc/tags
|
||||
+$(SINGLE_MAKE) -C src/nvim/testdir clean
|
||||
ifeq ($(strip $(TEST_FILE)),)
|
||||
$(SINGLE_MAKE) -C test/old/testdir NVIM_PRG=$(NVIM_PRG) $(MAKEOVERRIDES)
|
||||
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG=$(NVIM_PRG) $(MAKEOVERRIDES)
|
||||
else
|
||||
@# 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 src/nvim/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst %.vim,%,$(patsubst %.res,%,$(TEST_FILE)))
|
||||
endif
|
||||
# Build oldtest by specifying the relative .vim filename.
|
||||
.PHONY: phony_force
|
||||
test/old/testdir/%.vim: phony_force nvim
|
||||
$(SINGLE_MAKE) -C test/old/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst test/old/testdir/%.vim,%,$@)
|
||||
src/nvim/testdir/%.vim: phony_force
|
||||
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst src/nvim/testdir/%.vim,%,$@)
|
||||
|
||||
build/runtime/doc/tags helptags: | nvim
|
||||
+$(BUILD_TOOL) -C build runtime/doc/tags
|
||||
|
||||
# Builds help HTML _and_ checks for invalid help tags.
|
||||
helphtml: | nvim build/runtime/doc/tags
|
||||
+$(BUILD_TOOL) -C build doc_html
|
||||
|
||||
functionaltest: | nvim
|
||||
+$(BUILD_TOOL) -C build functionaltest
|
||||
|
||||
functionaltest-lua: | nvim
|
||||
$(CMAKE) --build build --target functionaltest
|
||||
+$(BUILD_TOOL) -C build functionaltest-lua
|
||||
|
||||
FORMAT=formatc formatlua format
|
||||
LINT=lintlua lintsh lintc clang-analyzer lintcommit lintdoc lint
|
||||
TEST=functionaltest unittest
|
||||
generated-sources benchmark $(FORMAT) $(LINT) $(TEST) doc: | build/.ran-cmake
|
||||
$(CMAKE) --build build --target $@
|
||||
lualint: | build/.ran-cmake deps
|
||||
$(BUILD_TOOL) -C build lualint
|
||||
|
||||
test: $(TEST)
|
||||
shlint:
|
||||
@shellcheck --version | head -n 2
|
||||
shellcheck scripts/vim-patch.sh
|
||||
|
||||
iwyu: build/.ran-cmake
|
||||
$(CMAKE) --preset iwyu
|
||||
$(CMAKE) --build build > build/iwyu.log
|
||||
iwyu-fix-includes --only_re="src/nvim" --ignore_re="(src/nvim/eval/encode.c\
|
||||
|src/nvim/auto/\
|
||||
|src/nvim/os/lang.c\
|
||||
|src/nvim/map.c\
|
||||
)" --nosafe_headers < build/iwyu.log
|
||||
$(CMAKE) -B build -U ENABLE_IWYU
|
||||
$(CMAKE) --build build
|
||||
_opt_shlint:
|
||||
@command -v shellcheck && { $(MAKE) shlint; exit $$?; } \
|
||||
|| echo "SKIP: shlint (shellcheck not found)"
|
||||
|
||||
pylint:
|
||||
flake8 contrib/ scripts/ src/ test/
|
||||
|
||||
# Run pylint only if flake8 is installed.
|
||||
_opt_pylint:
|
||||
@command -v flake8 && { $(MAKE) pylint; exit $$?; } \
|
||||
|| echo "SKIP: pylint (flake8 not found)"
|
||||
|
||||
commitlint:
|
||||
$(NVIM_PRG) --clean -es +"lua require('scripts.lintcommit').main({trace=false})"
|
||||
|
||||
_opt_commitlint:
|
||||
@test -x build/bin/nvim && { $(MAKE) commitlint; exit $$?; } \
|
||||
|| echo "SKIP: commitlint (build/bin/nvim not found)"
|
||||
|
||||
unittest: | nvim
|
||||
+$(BUILD_TOOL) -C build unittest
|
||||
|
||||
benchmark: | nvim
|
||||
+$(BUILD_TOOL) -C build benchmark
|
||||
|
||||
test: functionaltest unittest
|
||||
|
||||
clean:
|
||||
ifneq ($(wildcard build),)
|
||||
$(CMAKE) --build build --target clean
|
||||
endif
|
||||
$(MAKE) -C test/old/testdir clean
|
||||
+test -d build && $(BUILD_TOOL) -C build clean || true
|
||||
$(MAKE) -C src/nvim/testdir clean
|
||||
$(MAKE) -C runtime/doc clean
|
||||
$(MAKE) -C runtime/indent clean
|
||||
|
||||
distclean:
|
||||
$(call rmdir, $(DEPS_BUILD_DIR))
|
||||
$(call rmdir, build)
|
||||
rm -rf $(DEPS_BUILD_DIR) build
|
||||
$(MAKE) clean
|
||||
|
||||
install: checkprefix nvim
|
||||
$(CMAKE) --install build
|
||||
+$(BUILD_TOOL) -C build install
|
||||
|
||||
clint: build/.ran-cmake
|
||||
+$(BUILD_TOOL) -C build clint
|
||||
|
||||
clint-full: build/.ran-cmake
|
||||
+$(BUILD_TOOL) -C build clint-full
|
||||
|
||||
check-single-includes: build/.ran-cmake
|
||||
+$(BUILD_TOOL) -C build check-single-includes
|
||||
|
||||
generated-sources: build/.ran-cmake
|
||||
+$(BUILD_TOOL) -C build generated-sources
|
||||
|
||||
appimage:
|
||||
bash scripts/genappimage.sh
|
||||
@ -168,4 +214,16 @@ appimage:
|
||||
appimage-%:
|
||||
bash scripts/genappimage.sh $*
|
||||
|
||||
.PHONY: test clean distclean nvim libnvim cmake deps install appimage checkprefix benchmark $(FORMAT) $(LINT) $(TEST)
|
||||
lint: check-single-includes clint lualint _opt_pylint _opt_shlint _opt_commitlint
|
||||
|
||||
# Generic pattern rules, allowing for `make build/bin/nvim` etc.
|
||||
# Does not work with "Unix Makefiles".
|
||||
ifeq ($(CMAKE_GENERATOR),Ninja)
|
||||
build/%: phony_force
|
||||
$(BUILD_TOOL) -C build $(patsubst build/%,%,$@)
|
||||
|
||||
$(DEPS_BUILD_DIR)/%: phony_force
|
||||
$(BUILD_TOOL) -C $(DEPS_BUILD_DIR) $(patsubst $(DEPS_BUILD_DIR)/%,%,$@)
|
||||
endif
|
||||
|
||||
.PHONY: test lualint pylint shlint functionaltest unittest lint clint clean distclean nvim libnvim cmake deps install appimage checkprefix commitlint
|
||||
|
50
README.md
50
README.md
@ -1,21 +1,26 @@
|
||||
<h1 align="center">
|
||||
<img src="https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo-300x87.png" alt="Neovim">
|
||||
[](https://neovim.io)
|
||||
|
||||
<a href="https://neovim.io/doc/">Documentation</a> |
|
||||
<a href="https://app.element.io/#/room/#neovim:matrix.org">Chat</a>
|
||||
</h1>
|
||||
[Documentation](https://neovim.io/doc/general/) |
|
||||
[Chat](https://app.element.io/#/room/#neovim:matrix.org) |
|
||||
[Twitter](https://twitter.com/Neovim)
|
||||
|
||||
[](https://github.com/neovim/neovim/actions?query=workflow%3ACI+branch%3Amaster+event%3Apush)
|
||||
[](https://codecov.io/gh/neovim/neovim)
|
||||
[](https://scan.coverity.com/projects/2227)
|
||||
[](https://neovim.io/doc/reports/clang)
|
||||
[](https://neovim.io/doc/reports/pvs/PVS-studio.html.d)
|
||||
|
||||
[](https://repology.org/metapackage/neovim)
|
||||
[](https://buildd.debian.org/neovim)
|
||||
[](https://github.com/neovim/neovim/releases/)
|
||||
[](https://snapcraft.io/nvim)
|
||||
|
||||
Neovim is a project that seeks to aggressively refactor [Vim](https://www.vim.org/) in order to:
|
||||
Neovim is a project that seeks to aggressively refactor Vim in order to:
|
||||
|
||||
- Simplify maintenance and encourage [contributions](CONTRIBUTING.md)
|
||||
- Split the work between multiple developers
|
||||
- Enable [advanced UIs] without modifications to the core
|
||||
- Maximize [extensibility](https://neovim.io/doc/user/ui.html)
|
||||
- Maximize [extensibility](https://github.com/neovim/neovim/wiki/Plugin-UI-architecture)
|
||||
|
||||
See the [Introduction](https://github.com/neovim/neovim/wiki/Introduction) wiki page and [Roadmap]
|
||||
for more information.
|
||||
@ -25,7 +30,7 @@ Features
|
||||
|
||||
- Modern [GUIs](https://github.com/neovim/neovim/wiki/Related-projects#gui)
|
||||
- [API access](https://github.com/neovim/neovim/wiki/Related-projects#api-clients)
|
||||
from any language including C/C++, C#, Clojure, D, Elixir, Go, Haskell, Java/Kotlin,
|
||||
from any language including C/C++, C#, Clojure, D, Elixir, Go, Haskell, Java,
|
||||
JavaScript/Node.js, Julia, Lisp, Lua, Perl, Python, Racket, Ruby, Rust
|
||||
- Embedded, scriptable [terminal emulator](https://neovim.io/doc/user/nvim_terminal_emulator.html)
|
||||
- Asynchronous [job control](https://github.com/neovim/neovim/pull/2247)
|
||||
@ -33,7 +38,7 @@ Features
|
||||
- [XDG base directories](https://github.com/neovim/neovim/pull/3470) support
|
||||
- Compatible with most Vim plugins, including Ruby and Python plugins
|
||||
|
||||
See [`:help nvim-features`][nvim-features] for the full list, and [`:help news`][nvim-news] for noteworthy changes in the latest version!
|
||||
See [`:help nvim-features`][nvim-features] for the full list!
|
||||
|
||||
Install from package
|
||||
--------------------
|
||||
@ -46,7 +51,7 @@ Pre-built packages for Windows, macOS, and Linux are found on the
|
||||
Install from source
|
||||
-------------------
|
||||
|
||||
See [BUILD.md](./BUILD.md) and [supported platforms](https://neovim.io/doc/user/support.html#supported-platforms) for details.
|
||||
See the [Building Neovim](https://github.com/neovim/neovim/wiki/Building-Neovim) wiki page for details.
|
||||
|
||||
The build is CMake-based, but a Makefile is provided as a convenience.
|
||||
After installing the dependencies, run the following command.
|
||||
@ -56,7 +61,7 @@ After installing the dependencies, run the following command.
|
||||
|
||||
To install to a non-default location:
|
||||
|
||||
make CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_INSTALL_PREFIX=/full/path/
|
||||
make CMAKE_INSTALL_PREFIX=/full/path/
|
||||
make install
|
||||
|
||||
CMake hints for inspecting the build:
|
||||
@ -73,13 +78,12 @@ See [`:help nvim-from-vim`](https://neovim.io/doc/user/nvim.html#nvim-from-vim)
|
||||
Project layout
|
||||
--------------
|
||||
|
||||
├─ cmake/ CMake utils
|
||||
├─ cmake.config/ CMake defines
|
||||
├─ cmake.deps/ subproject to fetch and build dependencies (optional)
|
||||
├─ runtime/ plugins and docs
|
||||
├─ ci/ build automation
|
||||
├─ cmake/ build scripts
|
||||
├─ runtime/ user plugins/docs
|
||||
├─ src/nvim/ application source code (see src/nvim/README.md)
|
||||
│ ├─ api/ API subsystem
|
||||
│ ├─ eval/ Vimscript subsystem
|
||||
│ ├─ eval/ VimL subsystem
|
||||
│ ├─ event/ event-loop subsystem
|
||||
│ ├─ generators/ code generation (pre-compilation)
|
||||
│ ├─ lib/ generic data structures
|
||||
@ -87,6 +91,7 @@ Project layout
|
||||
│ ├─ msgpack_rpc/ RPC subsystem
|
||||
│ ├─ os/ low-level platform code
|
||||
│ └─ tui/ built-in UI
|
||||
├─ third-party/ CMake subproject to build dependencies
|
||||
└─ test/ tests (see test/README.md)
|
||||
|
||||
License
|
||||
@ -100,22 +105,21 @@ Apache 2.0 license, except for contributions copied from Vim (identified by the
|
||||
encouraged to make a donation for needy children in Uganda. Please see the
|
||||
kcc section of the vim docs or visit the ICCF web site, available at these URLs:
|
||||
|
||||
https://iccf-holland.org/
|
||||
https://www.vim.org/iccf/
|
||||
https://www.iccf.nl/
|
||||
http://iccf-holland.org/
|
||||
http://www.vim.org/iccf/
|
||||
http://www.iccf.nl/
|
||||
|
||||
You can also sponsor the development of Vim. Vim sponsors can vote for
|
||||
features. The money goes to Uganda anyway.
|
||||
|
||||
[license-commit]: https://github.com/neovim/neovim/commit/b17d9691a24099c9210289f16afb1a498a89d803
|
||||
[nvim-features]: https://neovim.io/doc/user/vim_diff.html#nvim-features
|
||||
[nvim-news]: https://neovim.io/doc/user/news.html
|
||||
[Roadmap]: https://neovim.io/roadmap/
|
||||
[advanced UIs]: https://github.com/neovim/neovim/wiki/Related-projects#gui
|
||||
[Managed packages]: ./INSTALL.md#install-from-package
|
||||
[Managed packages]: https://github.com/neovim/neovim/wiki/Installing-Neovim#install-from-package
|
||||
[Debian]: https://packages.debian.org/testing/neovim
|
||||
[Ubuntu]: https://packages.ubuntu.com/search?keywords=neovim
|
||||
[Fedora]: https://packages.fedoraproject.org/pkgs/neovim/neovim/
|
||||
[Ubuntu]: http://packages.ubuntu.com/search?keywords=neovim
|
||||
[Fedora]: https://apps.fedoraproject.org/packages/neovim
|
||||
[Arch Linux]: https://www.archlinux.org/packages/?q=neovim
|
||||
[Void Linux]: https://voidlinux.org/packages/?arch=x86_64&q=neovim
|
||||
[Gentoo]: https://packages.gentoo.org/packages/app-editors/neovim
|
||||
|
27
ci/before_cache.sh
Executable file
27
ci/before_cache.sh
Executable file
@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${CI_DIR}/common/build.sh"
|
||||
source "${CI_DIR}/common/suite.sh"
|
||||
|
||||
echo "before_cache.sh: cache size"
|
||||
du -chd 1 "${HOME}/.cache" | sort -rh | head -20
|
||||
|
||||
echo "before_cache.sh: ccache stats"
|
||||
ccache -s 2>/dev/null || true
|
||||
# Do not keep ccache stats (uploaded to cache otherwise; reset initially anyway).
|
||||
find "${HOME}/.ccache" -name stats -delete
|
||||
|
||||
# Update the third-party dependency cache only if the build was successful.
|
||||
if ended_successfully; then
|
||||
# Do not cache downloads. They should not be needed with up-to-date deps.
|
||||
rm -rf "${DEPS_BUILD_DIR}/build/downloads"
|
||||
rm -rf "${CACHE_NVIM_DEPS_DIR}"
|
||||
mv "${DEPS_BUILD_DIR}" "${CACHE_NVIM_DEPS_DIR}"
|
||||
|
||||
touch "${CACHE_MARKER}"
|
||||
echo "Updated third-party dependencies (timestamp: $(_stat "${CACHE_MARKER}"))."
|
||||
fi
|
46
ci/before_install.sh
Executable file
46
ci/before_install.sh
Executable file
@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
echo 'Python info:'
|
||||
(
|
||||
set -x
|
||||
python3 --version
|
||||
python2 --version
|
||||
python --version
|
||||
pip3 --version
|
||||
pip2 --version
|
||||
pip --version
|
||||
|
||||
pyenv --version
|
||||
pyenv versions
|
||||
) 2>&1 | sed 's/^/ /' || true
|
||||
|
||||
# Use pyenv, but not for OSX on Travis, where it only has the "system" version.
|
||||
if [[ "${TRAVIS_OS_NAME}" != osx ]] && command -v pyenv; then
|
||||
echo 'Setting Python versions via pyenv'
|
||||
|
||||
# Prefer Python 2 over 3 (more conservative).
|
||||
pyenv global 2.7:3.8
|
||||
|
||||
echo 'Updated Python info:'
|
||||
(
|
||||
set -x
|
||||
python3 --version
|
||||
python2 --version
|
||||
python --version
|
||||
|
||||
python3 -m pip --version
|
||||
python2 -m pip --version
|
||||
) 2>&1 | sed 's/^/ /'
|
||||
fi
|
||||
|
||||
echo "Install node (LTS)"
|
||||
|
||||
if [[ "${TRAVIS_OS_NAME}" == osx ]] || [ ! -f ~/.nvm/nvm.sh ]; then
|
||||
curl -o ~/.nvm/nvm.sh https://raw.githubusercontent.com/creationix/nvm/master/nvm.sh
|
||||
fi
|
||||
|
||||
source ~/.nvm/nvm.sh
|
||||
nvm install 10
|
46
ci/before_script.sh
Executable file
46
ci/before_script.sh
Executable file
@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${CI_DIR}/common/build.sh"
|
||||
|
||||
# Enable ipv6 on Travis. ref: a39c8b7ce30d
|
||||
if test -n "${TRAVIS_OS_NAME}" && ! test "${TRAVIS_OS_NAME}" = osx ; then
|
||||
echo "before_script.sh: enable ipv6"
|
||||
sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0
|
||||
fi
|
||||
|
||||
# Test some of the configuration variables.
|
||||
if [[ -n "${GCOV}" ]] && [[ ! $(type -P "${GCOV}") ]]; then
|
||||
echo "\$GCOV: '${GCOV}' is not executable."
|
||||
exit 1
|
||||
fi
|
||||
if [[ -n "${LLVM_SYMBOLIZER}" ]] && [[ ! $(type -P "${LLVM_SYMBOLIZER}") ]]; then
|
||||
echo "\$LLVM_SYMBOLIZER: '${LLVM_SYMBOLIZER}' is not executable."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "before_script.sh: ccache stats (will be cleared)"
|
||||
ccache -s
|
||||
# Reset ccache stats for real results in before_cache.
|
||||
ccache --zero-stats
|
||||
|
||||
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
|
||||
# Adds user to a dummy group.
|
||||
# That allows to test changing the group of the file by `os_fchown`.
|
||||
sudo dscl . -create /Groups/chown_test
|
||||
sudo dscl . -append /Groups/chown_test GroupMembership "${USER}"
|
||||
fi
|
||||
|
||||
# Compile dependencies.
|
||||
build_deps
|
||||
|
||||
# Install cluacov for Lua coverage.
|
||||
if [[ "$USE_LUACOV" == 1 ]]; then
|
||||
"${DEPS_BUILD_DIR}/usr/bin/luarocks" install cluacov
|
||||
fi
|
||||
|
||||
rm -rf "${LOG_DIR}"
|
||||
mkdir -p "${LOG_DIR}"
|
182
ci/build.ps1
Normal file
182
ci/build.ps1
Normal file
@ -0,0 +1,182 @@
|
||||
param([switch]$NoTests)
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$ProgressPreference = 'SilentlyContinue'
|
||||
|
||||
$env:CONFIGURATION -match '^(?<compiler>\w+)_(?<bits>32|64)(?:-(?<option>\w+))?$'
|
||||
$compiler = $Matches.compiler
|
||||
$compileOption = if ($Matches -contains 'option') {$Matches.option} else {''}
|
||||
$bits = $Matches.bits
|
||||
$cmakeBuildType = $(if ($env:CMAKE_BUILD_TYPE -ne $null) {$env:CMAKE_BUILD_TYPE} else {'RelWithDebInfo'});
|
||||
$buildDir = [System.IO.Path]::GetFullPath("$(pwd)")
|
||||
$depsCmakeVars = @{
|
||||
CMAKE_BUILD_TYPE = $cmakeBuildType;
|
||||
}
|
||||
$nvimCmakeVars = @{
|
||||
CMAKE_BUILD_TYPE = $cmakeBuildType;
|
||||
BUSTED_OUTPUT_TYPE = 'nvim';
|
||||
DEPS_PREFIX=$(if ($env:DEPS_PREFIX -ne $null) {$env:DEPS_PREFIX} else {".deps/usr"});
|
||||
}
|
||||
if ($env:DEPS_BUILD_DIR -eq $null) {
|
||||
$env:DEPS_BUILD_DIR = ".deps";
|
||||
}
|
||||
$uploadToCodeCov = $false
|
||||
|
||||
function exitIfFailed() {
|
||||
if ($LastExitCode -ne 0) {
|
||||
exit $LastExitCode
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $NoTests) {
|
||||
node --version
|
||||
npm.cmd --version
|
||||
}
|
||||
|
||||
if (-Not (Test-Path -PathType container $env:DEPS_BUILD_DIR)) {
|
||||
write-host "cache dir not found: $($env:DEPS_BUILD_DIR)"
|
||||
mkdir $env:DEPS_BUILD_DIR
|
||||
} else {
|
||||
write-host "cache dir $($env:DEPS_BUILD_DIR) size: $(Get-ChildItem $env:DEPS_BUILD_DIR -recurse | Measure-Object -property length -sum | Select -expand sum)"
|
||||
}
|
||||
|
||||
if ($compiler -eq 'MINGW') {
|
||||
if ($bits -eq 32) {
|
||||
$arch = 'i686'
|
||||
}
|
||||
elseif ($bits -eq 64) {
|
||||
$arch = 'x86_64'
|
||||
}
|
||||
if ($compileOption -eq 'gcov') {
|
||||
$nvimCmakeVars['USE_GCOV'] = 'ON'
|
||||
$uploadToCodecov = $true
|
||||
$env:GCOV = "C:\msys64\mingw$bits\bin\gcov"
|
||||
|
||||
# Setup/build Lua coverage.
|
||||
$env:USE_LUACOV = 1
|
||||
$env:BUSTED_ARGS = "--coverage"
|
||||
}
|
||||
# These are native MinGW builds, but they use the toolchain inside
|
||||
# MSYS2, this allows using all the dependencies and tools available
|
||||
# in MSYS2, but we cannot build inside the MSYS2 shell.
|
||||
$cmakeGenerator = 'Ninja'
|
||||
$cmakeGeneratorArgs = '-v'
|
||||
$mingwPackages = @('ninja', 'cmake', 'diffutils').ForEach({
|
||||
"mingw-w64-$arch-$_"
|
||||
})
|
||||
|
||||
# Add MinGW to the PATH
|
||||
$env:PATH = "C:\msys64\mingw$bits\bin;$env:PATH"
|
||||
|
||||
# Avoid pacman "warning" which causes non-zero return code. https://github.com/open62541/open62541/issues/2068
|
||||
& C:\msys64\usr\bin\mkdir -p /var/cache/pacman/pkg
|
||||
|
||||
# Build third-party dependencies
|
||||
C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm -Syu" ; exitIfFailed
|
||||
C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm --needed -S $mingwPackages" ; exitIfFailed
|
||||
}
|
||||
elseif ($compiler -eq 'MSVC') {
|
||||
$cmakeGeneratorArgs = '/verbosity:normal'
|
||||
if ($bits -eq 32) {
|
||||
$cmakeGenerator = 'Visual Studio 15 2017'
|
||||
}
|
||||
elseif ($bits -eq 64) {
|
||||
$cmakeGenerator = 'Visual Studio 15 2017 Win64'
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $NoTests) {
|
||||
# Setup python (use AppVeyor system python)
|
||||
|
||||
# Disambiguate python3, if needed
|
||||
if (-not (Test-Path -Path C:\hostedtoolcache\windows\Python\3.5.4\x64\python3.exe) ) {
|
||||
move C:\hostedtoolcache\windows\Python\3.5.4\x64\python.exe C:\hostedtoolcache\windows\Python\3.5.4\x64\python3.exe
|
||||
}
|
||||
$env:PATH = "C:\hostedtoolcache\windows\Python\2.7.18\x64;C:\hostedtoolcache\windows\Python\3.5.4\x64;$env:PATH"
|
||||
|
||||
python -m pip install pynvim ; exitIfFailed
|
||||
python3 -m pip install pynvim ; exitIfFailed
|
||||
# Sanity check
|
||||
python -c "import pynvim; print(str(pynvim))" ; exitIfFailed
|
||||
python3 -c "import pynvim; print(str(pynvim))" ; exitIfFailed
|
||||
|
||||
gem.cmd install --pre neovim
|
||||
Get-Command -CommandType Application neovim-ruby-host.bat
|
||||
|
||||
npm.cmd install -g neovim
|
||||
Get-Command -CommandType Application neovim-node-host.cmd
|
||||
npm.cmd link neovim
|
||||
}
|
||||
|
||||
if ($compiler -eq 'MSVC') {
|
||||
# Required for LuaRocks (https://github.com/luarocks/luarocks/issues/1039#issuecomment-507296940).
|
||||
$env:VCINSTALLDIR = "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/"
|
||||
}
|
||||
|
||||
function convertToCmakeArgs($vars) {
|
||||
return $vars.GetEnumerator() | foreach { "-D$($_.Key)=$($_.Value)" }
|
||||
}
|
||||
|
||||
cd $env:DEPS_BUILD_DIR
|
||||
cmake -G $cmakeGenerator $(convertToCmakeArgs($depsCmakeVars)) "$buildDir/third-party/" ; exitIfFailed
|
||||
cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed
|
||||
cd $buildDir
|
||||
|
||||
# Build Neovim
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -G $cmakeGenerator $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed
|
||||
cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed
|
||||
.\bin\nvim --version ; exitIfFailed
|
||||
|
||||
# Ensure that the "win32" feature is set.
|
||||
.\bin\nvim -u NONE --headless -c 'exe !has(\"win32\").\"cq\"' ; exitIfFailed
|
||||
|
||||
if ($env:USE_LUACOV -eq 1) {
|
||||
& $env:DEPS_PREFIX\luarocks\luarocks.bat install cluacov
|
||||
}
|
||||
|
||||
if (-not $NoTests) {
|
||||
# Functional tests
|
||||
# The $LastExitCode from MSBuild can't be trusted
|
||||
$failed = $false
|
||||
|
||||
# Run only this test file:
|
||||
# $env:TEST_FILE = "test\functional\foo.lua"
|
||||
cmake --build . --config $cmakeBuildType --target functionaltest -- $cmakeGeneratorArgs 2>&1 |
|
||||
foreach { $failed = $failed -or
|
||||
$_ -match 'functional tests failed with error'; $_ }
|
||||
|
||||
if ($uploadToCodecov) {
|
||||
if ($env:USE_LUACOV -eq 1) {
|
||||
& $env:DEPS_PREFIX\bin\luacov.bat
|
||||
}
|
||||
bash -l /c/projects/neovim/ci/common/submit_coverage.sh functionaltest
|
||||
}
|
||||
if ($failed) {
|
||||
exit $LastExitCode
|
||||
}
|
||||
|
||||
# Old tests
|
||||
# Add MSYS to path, required for e.g. `find` used in test scripts.
|
||||
# But would break functionaltests, where its `more` would be used then.
|
||||
$OldPath = $env:PATH
|
||||
$env:PATH = "C:\msys64\usr\bin;$env:PATH"
|
||||
& "C:\msys64\mingw$bits\bin\mingw32-make.exe" -C $(Convert-Path ..\src\nvim\testdir) VERBOSE=1 ; exitIfFailed
|
||||
$env:PATH = $OldPath
|
||||
|
||||
if ($uploadToCodecov) {
|
||||
bash -l /c/projects/neovim/ci/common/submit_coverage.sh oldtest
|
||||
}
|
||||
}
|
||||
|
||||
# Ensure choco's cpack is not in PATH otherwise, it conflicts with CMake's
|
||||
if (Test-Path -Path $env:ChocolateyInstall\bin\cpack.exe) {
|
||||
Remove-Item -Path $env:ChocolateyInstall\bin\cpack.exe -Force
|
||||
}
|
||||
|
||||
# Build artifacts
|
||||
cpack -G ZIP -C RelWithDebInfo
|
||||
if ($env:APPVEYOR_REPO_TAG_NAME -ne $null) {
|
||||
cpack -G NSIS -C RelWithDebInfo
|
||||
}
|
88
ci/common/build.sh
Normal file
88
ci/common/build.sh
Normal file
@ -0,0 +1,88 @@
|
||||
_stat() {
|
||||
if test "${CI_OS_NAME}" = osx ; then
|
||||
stat -f %Sm "${@}"
|
||||
else
|
||||
stat -c %y "${@}"
|
||||
fi
|
||||
}
|
||||
|
||||
top_make() {
|
||||
printf '%78s\n' | tr ' ' '='
|
||||
# Travis has 1.5 virtual cores according to:
|
||||
# http://docs.travis-ci.com/user/speeding-up-the-build/#Paralellizing-your-build-on-one-VM
|
||||
ninja "$@"
|
||||
}
|
||||
|
||||
build_make() {
|
||||
top_make -C "${BUILD_DIR}" "$@"
|
||||
}
|
||||
|
||||
build_deps() {
|
||||
if test "${FUNCTIONALTEST}" = "functionaltest-lua" \
|
||||
|| test "${CLANG_SANITIZER}" = "ASAN_UBSAN" ; then
|
||||
DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} -DUSE_BUNDLED_LUA=ON"
|
||||
fi
|
||||
|
||||
mkdir -p "${DEPS_BUILD_DIR}"
|
||||
|
||||
# Use cached dependencies if $CACHE_MARKER exists.
|
||||
if test "${CACHE_ENABLE}" = "false" ; then
|
||||
export CCACHE_RECACHE=1
|
||||
elif test -f "${CACHE_MARKER}" ; then
|
||||
echo "Using third-party dependencies from cache (last update: $(_stat "${CACHE_MARKER}"))."
|
||||
cp -a "${CACHE_NVIM_DEPS_DIR}"/. "${DEPS_BUILD_DIR}"
|
||||
fi
|
||||
|
||||
# Even if we're using cached dependencies, run CMake and make to
|
||||
# update CMake configuration and update to newer deps versions.
|
||||
cd "${DEPS_BUILD_DIR}"
|
||||
echo "Configuring with '${DEPS_CMAKE_FLAGS}'."
|
||||
CC= cmake -G Ninja ${DEPS_CMAKE_FLAGS} "${CI_BUILD_DIR}/third-party/"
|
||||
|
||||
if ! top_make; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "${CI_BUILD_DIR}"
|
||||
}
|
||||
|
||||
prepare_build() {
|
||||
if test -n "${CLANG_SANITIZER}" ; then
|
||||
CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON"
|
||||
fi
|
||||
|
||||
mkdir -p "${BUILD_DIR}"
|
||||
cd "${BUILD_DIR}"
|
||||
echo "Configuring with '${CMAKE_FLAGS} $@'."
|
||||
cmake -G Ninja ${CMAKE_FLAGS} "$@" "${CI_BUILD_DIR}"
|
||||
}
|
||||
|
||||
build_nvim() {
|
||||
echo "Building nvim."
|
||||
if ! top_make nvim ; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test "$CLANG_SANITIZER" != "TSAN" ; then
|
||||
echo "Building libnvim."
|
||||
if ! top_make libnvim ; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test "${FUNCTIONALTEST}" != "functionaltest-lua"; then
|
||||
echo "Building nvim-test."
|
||||
if ! top_make nvim-test ; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Invoke nvim to trigger *San early.
|
||||
if ! (bin/nvim --version && bin/nvim -u NONE -e -cq | cat -vet) ; then
|
||||
check_sanitizer "${LOG_DIR}"
|
||||
exit 1
|
||||
fi
|
||||
check_sanitizer "${LOG_DIR}"
|
||||
|
||||
cd "${CI_BUILD_DIR}"
|
||||
}
|
56
ci/common/submit_coverage.sh
Executable file
56
ci/common/submit_coverage.sh
Executable file
@ -0,0 +1,56 @@
|
||||
#!/bin/sh
|
||||
# Collect and submit coverage reports.
|
||||
#
|
||||
# Args:
|
||||
# $1: Flag(s) for codecov, separated by comma.
|
||||
|
||||
set -ex
|
||||
|
||||
# Change to grandparent dir (POSIXly).
|
||||
CDPATH='' cd -P -- "$(dirname -- "$0")/../.." || exit
|
||||
|
||||
echo "=== running submit_coverage in $PWD: $* ==="
|
||||
"$GCOV" --version
|
||||
|
||||
# Download/install codecov-bash and gcovr once.
|
||||
codecov_sh="${TEMP:-/tmp}/codecov.bash"
|
||||
if ! [ -f "$codecov_sh" ]; then
|
||||
curl --retry 5 --silent --fail -o "$codecov_sh" https://codecov.io/bash
|
||||
chmod +x "$codecov_sh"
|
||||
|
||||
python3 -m pip install --quiet --user gcovr
|
||||
fi
|
||||
|
||||
(
|
||||
cd build
|
||||
python3 -m gcovr --branches --exclude-unreachable-branches --print-summary -j 2 --exclude '.*/auto/.*' --root .. --delete -o ../coverage.xml --xml
|
||||
)
|
||||
|
||||
# Upload to codecov.
|
||||
# -X gcov: disable gcov, done manually above.
|
||||
# -X fix: disable fixing of reports (not necessary, rather slow)
|
||||
# -Z: exit non-zero on failure
|
||||
# -F: flag(s)
|
||||
# NOTE: ignoring flags for now, since this causes timeouts on codecov.io then,
|
||||
# which they know about for about a year already...
|
||||
# Flags must match pattern ^[\w\,]+$ ("," as separator).
|
||||
codecov_flags="$(uname -s),${1}"
|
||||
codecov_flags=$(echo "$codecov_flags" | sed 's/[^,_a-zA-Z0-9]/_/g')
|
||||
if ! "$codecov_sh" -f coverage.xml -X gcov -X fix -Z -F "${codecov_flags}"; then
|
||||
echo "codecov upload failed."
|
||||
fi
|
||||
|
||||
# Cleanup always, especially collected data.
|
||||
find . \( -name '*.gcov' -o -name '*.gcda' \) -ls -delete | wc -l
|
||||
rm -f coverage.xml
|
||||
|
||||
# Upload Lua coverage (generated manually on AppVeyor/Windows).
|
||||
if [ "$USE_LUACOV" = 1 ] && [ "$1" != "oldtest" ]; then
|
||||
if [ -x "${DEPS_BUILD_DIR}/usr/bin/luacov" ]; then
|
||||
"${DEPS_BUILD_DIR}/usr/bin/luacov"
|
||||
fi
|
||||
if ! "$codecov_sh" -f luacov.report.out -X gcov -X fix -Z -F "lua,${codecov_flags}"; then
|
||||
echo "codecov upload failed."
|
||||
fi
|
||||
rm luacov.stats.out
|
||||
fi
|
210
ci/common/suite.sh
Normal file
210
ci/common/suite.sh
Normal file
@ -0,0 +1,210 @@
|
||||
# HACK: get newline for use in strings given that "\n" and $'' do not work.
|
||||
NL="$(printf '\nE')"
|
||||
NL="${NL%E}"
|
||||
|
||||
FAIL_SUMMARY=""
|
||||
|
||||
# Test success marker. If END_MARKER file exists, we know that all tests
|
||||
# finished. If FAIL_SUMMARY_FILE exists we know that some tests failed, this
|
||||
# file will contain information about failed tests. Build is considered
|
||||
# successful if tests ended without any of them failing.
|
||||
END_MARKER="$BUILD_DIR/.tests_finished"
|
||||
FAIL_SUMMARY_FILE="$BUILD_DIR/.test_errors"
|
||||
|
||||
ANSI_CLEAR="\033[0K"
|
||||
|
||||
if test "$TRAVIS" = "true"; then
|
||||
ci_fold() {
|
||||
local action="$1"
|
||||
local name="$2"
|
||||
name="$(echo -n "$name" | tr '\n\0' '--' | sed 's/[^A-Za-z0-9]\{1,\}/-/g')"
|
||||
name="$(echo -n "$name" | sed 's/-$//')"
|
||||
echo -en "travis_fold:${action}:${name}\r${ANSI_CLEAR}"
|
||||
}
|
||||
elif test "$GITHUB_ACTIONS" = "true"; then
|
||||
ci_fold() {
|
||||
local action="$1"
|
||||
local name="$2"
|
||||
name="$(echo -n "$name" | tr '\n\0' '--' | sed 's/[^A-Za-z0-9]\{1,\}/-/g')"
|
||||
name="$(echo -n "$name" | sed 's/-$//')"
|
||||
case "$action" in
|
||||
start)
|
||||
echo "::group::${name}"
|
||||
;;
|
||||
end)
|
||||
echo "::endgroup::"
|
||||
;;
|
||||
*)
|
||||
:;;
|
||||
esac
|
||||
}
|
||||
else
|
||||
ci_fold() {
|
||||
return 0
|
||||
}
|
||||
fi
|
||||
|
||||
enter_suite() {
|
||||
set +x
|
||||
FAILED=0
|
||||
rm -f "${END_MARKER}"
|
||||
local suite_name="$1"
|
||||
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE}/$suite_name"
|
||||
ci_fold start "${NVIM_TEST_CURRENT_SUITE}"
|
||||
set -x
|
||||
}
|
||||
|
||||
exit_suite() {
|
||||
set +x
|
||||
if test $FAILED -ne 0 ; then
|
||||
echo "Suite ${NVIM_TEST_CURRENT_SUITE} failed, summary:"
|
||||
echo "${FAIL_SUMMARY}"
|
||||
else
|
||||
ci_fold end "${NVIM_TEST_CURRENT_SUITE}"
|
||||
fi
|
||||
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}"
|
||||
if test "$1" != "--continue" ; then
|
||||
exit $FAILED
|
||||
else
|
||||
local saved_failed=$FAILED
|
||||
FAILED=0
|
||||
return $saved_failed
|
||||
fi
|
||||
}
|
||||
|
||||
fail() {
|
||||
local test_name="$1"
|
||||
local fail_char="$2"
|
||||
local message="$3"
|
||||
|
||||
: ${fail_char:=F}
|
||||
: ${message:=Test $test_name failed}
|
||||
|
||||
local full_msg="$fail_char $NVIM_TEST_CURRENT_SUITE|$test_name :: $message"
|
||||
FAIL_SUMMARY="${FAIL_SUMMARY}${NL}${full_msg}"
|
||||
echo "${full_msg}" >> "${FAIL_SUMMARY_FILE}"
|
||||
echo "Failed: $full_msg"
|
||||
FAILED=1
|
||||
}
|
||||
|
||||
run_test() {
|
||||
local cmd="$1"
|
||||
test $# -gt 0 && shift
|
||||
local test_name="$1"
|
||||
: ${test_name:=$cmd}
|
||||
test $# -gt 0 && shift
|
||||
if ! eval "$cmd" ; then
|
||||
fail "${test_name}" "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
run_test_wd() {
|
||||
local hang_ok=
|
||||
if test "$1" = "--allow-hang" ; then
|
||||
hang_ok=1
|
||||
shift
|
||||
fi
|
||||
|
||||
local timeout="$1"
|
||||
test $# -gt 0 && shift
|
||||
|
||||
local cmd="$1"
|
||||
test $# -gt 0 && shift
|
||||
|
||||
local restart_cmd="$1"
|
||||
: ${restart_cmd:=true}
|
||||
test $# -gt 0 && shift
|
||||
|
||||
local test_name="$1"
|
||||
: ${test_name:=$cmd}
|
||||
test $# -gt 0 && shift
|
||||
|
||||
local output_file="$(mktemp)"
|
||||
local status_file="$(mktemp)"
|
||||
local sid_file="$(mktemp)"
|
||||
|
||||
local restarts=5
|
||||
local prev_tmpsize=-1
|
||||
while test $restarts -gt 0 ; do
|
||||
: > "$status_file"
|
||||
: > "$sid_file"
|
||||
setsid \
|
||||
env \
|
||||
output_file="$output_file" \
|
||||
status_file="$status_file" \
|
||||
sid_file="$sid_file" \
|
||||
cmd="$cmd" \
|
||||
CI_DIR="$CI_DIR" \
|
||||
sh -c '
|
||||
. "${CI_DIR}/common/test.sh"
|
||||
ps -o sid= > "$sid_file"
|
||||
(
|
||||
ret=0
|
||||
if ! eval "$cmd" 2>&1 ; then
|
||||
ret=1
|
||||
fi
|
||||
echo "$ret" > "$status_file"
|
||||
) | tee -a "$output_file"
|
||||
'
|
||||
while test "$(stat -c "%s" "$status_file")" -eq 0 ; do
|
||||
prev_tmpsize=$tmpsize
|
||||
sleep $timeout
|
||||
tmpsize="$(stat -c "%s" "$output_file")"
|
||||
if test $tempsize -eq $prev_temsize ; then
|
||||
# no output, assuming either hang or exit
|
||||
break
|
||||
fi
|
||||
done
|
||||
restarts=$(( restarts - 1 ))
|
||||
if test "$(stat -c "%s" "$status_file")" -eq 0 ; then
|
||||
# Status file not updated, assuming hang
|
||||
|
||||
# SID not known, this should not ever happen
|
||||
if test "$(stat -c "%s" "$sid_file")" -eq 0 ; then
|
||||
fail "$test_name" E "Shell did not run"
|
||||
break
|
||||
fi
|
||||
|
||||
# Kill all processes which belong to one session: should get rid of test
|
||||
# processes as well as sh itself.
|
||||
pkill -KILL -s$(cat "$sid_file")
|
||||
|
||||
if test $restarts -eq 0 ; then
|
||||
if test -z "$hang_ok" ; then
|
||||
fail "$test_name" E "Test hang up"
|
||||
fi
|
||||
else
|
||||
echo "Test ${test_name} hang up, restarting"
|
||||
eval "$restart_cmd"
|
||||
fi
|
||||
else
|
||||
local new_failed="$(cat "$status_file")"
|
||||
if test "$new_failed" != "0" ; then
|
||||
fail "$test_name" F "Test failed in run_test_wd"
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
rm -f "$output_file"
|
||||
rm -f "$status_file"
|
||||
rm -f "$sid_file"
|
||||
}
|
||||
|
||||
ended_successfully() {
|
||||
if test -f "${FAIL_SUMMARY_FILE}" ; then
|
||||
echo 'Test failed, complete summary:'
|
||||
cat "${FAIL_SUMMARY_FILE}"
|
||||
return 1
|
||||
fi
|
||||
if ! test -f "${END_MARKER}" ; then
|
||||
echo 'ended_successfully called before end marker was touched'
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
end_tests() {
|
||||
touch "${END_MARKER}"
|
||||
ended_successfully
|
||||
}
|
189
ci/common/test.sh
Normal file
189
ci/common/test.sh
Normal file
@ -0,0 +1,189 @@
|
||||
. "${CI_DIR}/common/build.sh"
|
||||
. "${CI_DIR}/common/suite.sh"
|
||||
|
||||
submit_coverage() {
|
||||
if [ -n "${GCOV}" ]; then
|
||||
"${CI_DIR}/common/submit_coverage.sh" "$@" || echo 'codecov upload failed.'
|
||||
fi
|
||||
}
|
||||
|
||||
print_core() {
|
||||
local app="$1"
|
||||
local core="$2"
|
||||
if test "$app" = quiet ; then
|
||||
echo "Found core $core"
|
||||
return 0
|
||||
fi
|
||||
echo "======= Core file $core ======="
|
||||
if test "${CI_OS_NAME}" = osx ; then
|
||||
lldb -Q -o "bt all" -f "${app}" -c "${core}"
|
||||
else
|
||||
gdb -n -batch -ex 'thread apply all bt full' "${app}" -c "${core}"
|
||||
fi
|
||||
}
|
||||
|
||||
check_core_dumps() {
|
||||
local del=
|
||||
if test "$1" = "--delete" ; then
|
||||
del=1
|
||||
shift
|
||||
fi
|
||||
local app="${1:-${BUILD_DIR}/bin/nvim}"
|
||||
local cores
|
||||
if test "${CI_OS_NAME}" = osx ; then
|
||||
cores="$(find /cores/ -type f -print)"
|
||||
local _sudo='sudo'
|
||||
else
|
||||
cores="$(find ./ -type f \( -name 'core.*' -o -name core -o -name nvim.core \) -print)"
|
||||
local _sudo=
|
||||
fi
|
||||
|
||||
if test -z "${cores}" ; then
|
||||
return
|
||||
fi
|
||||
local core
|
||||
for core in $cores; do
|
||||
if test "$del" = "1" ; then
|
||||
print_core "$app" "$core" >&2
|
||||
"$_sudo" rm "$core"
|
||||
else
|
||||
print_core "$app" "$core"
|
||||
fi
|
||||
done
|
||||
if test "$app" != quiet ; then
|
||||
fail 'cores' E 'Core dumps found'
|
||||
fi
|
||||
}
|
||||
|
||||
check_logs() {
|
||||
# Iterate through each log to remove an useless warning.
|
||||
for log in $(find "${1}" -type f -name "${2}"); do
|
||||
sed -i "${log}" \
|
||||
-e '/Warning: noted but unhandled ioctl/d' \
|
||||
-e '/could cause spurious value errors to appear/d' \
|
||||
-e '/See README_MISSING_SYSCALL_OR_IOCTL for guidance/d'
|
||||
done
|
||||
|
||||
# Now do it again, but only consider files with size > 0.
|
||||
local err=""
|
||||
for log in $(find "${1}" -type f -name "${2}" -size +0); do
|
||||
cat "${log}"
|
||||
err=1
|
||||
rm "${log}"
|
||||
done
|
||||
if test -n "${err}" ; then
|
||||
fail 'logs' E 'Runtime errors detected.'
|
||||
fi
|
||||
}
|
||||
|
||||
valgrind_check() {
|
||||
check_logs "${1}" "valgrind-*"
|
||||
}
|
||||
|
||||
check_sanitizer() {
|
||||
if test -n "${CLANG_SANITIZER}"; then
|
||||
check_logs "${1}" "*san.*" | ${SYMBOLIZER:-cat}
|
||||
fi
|
||||
}
|
||||
|
||||
run_unittests() {(
|
||||
enter_suite unittests
|
||||
ulimit -c unlimited || true
|
||||
if ! build_make unittest ; then
|
||||
fail 'unittests' F 'Unit tests failed'
|
||||
fi
|
||||
submit_coverage unittest
|
||||
check_core_dumps "$(command -v luajit)"
|
||||
exit_suite
|
||||
)}
|
||||
|
||||
run_functionaltests() {(
|
||||
enter_suite functionaltests
|
||||
ulimit -c unlimited || true
|
||||
if ! build_make ${FUNCTIONALTEST}; then
|
||||
fail 'functionaltests' F 'Functional tests failed'
|
||||
fi
|
||||
submit_coverage functionaltest
|
||||
check_sanitizer "${LOG_DIR}"
|
||||
valgrind_check "${LOG_DIR}"
|
||||
check_core_dumps
|
||||
exit_suite
|
||||
)}
|
||||
|
||||
run_oldtests() {(
|
||||
enter_suite oldtests
|
||||
ulimit -c unlimited || true
|
||||
if ! make oldtest; then
|
||||
reset
|
||||
fail 'oldtests' F 'Legacy tests failed'
|
||||
fi
|
||||
submit_coverage oldtest
|
||||
check_sanitizer "${LOG_DIR}"
|
||||
valgrind_check "${LOG_DIR}"
|
||||
check_core_dumps
|
||||
exit_suite
|
||||
)}
|
||||
|
||||
check_runtime_files() {(
|
||||
set +x
|
||||
local test_name="$1" ; shift
|
||||
local message="$1" ; shift
|
||||
local tst="$1" ; shift
|
||||
|
||||
cd runtime
|
||||
for file in $(git ls-files "$@") ; do
|
||||
# Check that test is not trying to work with files with spaces/etc
|
||||
# Prefer failing the build over using more robust construct because files
|
||||
# with IFS are not welcome.
|
||||
if ! test -e "$file" ; then
|
||||
fail "$test_name" E \
|
||||
"It appears that $file is only a part of the file name"
|
||||
fi
|
||||
if ! test "$tst" "$INSTALL_PREFIX/share/nvim/runtime/$file" ; then
|
||||
fail "$test_name" F "$(printf "$message" "$file")"
|
||||
fi
|
||||
done
|
||||
)}
|
||||
|
||||
install_nvim() {(
|
||||
enter_suite 'install_nvim'
|
||||
if ! build_make install ; then
|
||||
fail 'install' E 'make install failed'
|
||||
exit_suite
|
||||
fi
|
||||
|
||||
"${INSTALL_PREFIX}/bin/nvim" --version
|
||||
if ! "${INSTALL_PREFIX}/bin/nvim" -u NONE -e -c ':help' -c ':qall' ; then
|
||||
echo "Running ':help' in the installed nvim failed."
|
||||
echo "Maybe the helptags have not been generated properly."
|
||||
fail 'help' F 'Failed running :help'
|
||||
fi
|
||||
|
||||
# Check that all runtime files were installed
|
||||
check_runtime_files \
|
||||
'runtime-install' \
|
||||
'It appears that %s is not installed.' \
|
||||
-e \
|
||||
'*.vim' '*.ps' '*.dict' '*.py' '*.tutor'
|
||||
|
||||
# Check that some runtime files are installed and are executables
|
||||
check_runtime_files \
|
||||
'not-exe' \
|
||||
'It appears that %s is not installed or is not executable.' \
|
||||
-x \
|
||||
'*.awk' '*.sh' '*.bat'
|
||||
|
||||
# Check that generated syntax file has function names, #5060.
|
||||
local genvimsynf=syntax/vim/generated.vim
|
||||
local gpat='syn keyword vimFuncName .*eval'
|
||||
if ! grep -q "$gpat" "${INSTALL_PREFIX}/share/nvim/runtime/$genvimsynf" ; then
|
||||
fail 'funcnames' F "It appears that $genvimsynf does not contain $gpat."
|
||||
fi
|
||||
|
||||
exit_suite
|
||||
)}
|
||||
|
||||
csi_clean() {
|
||||
find "${BUILD_DIR}/bin" -name 'test-includes-*' -delete
|
||||
find "${BUILD_DIR}" -name '*test-include*.o' -delete
|
||||
}
|
33
ci/install.sh
Executable file
33
ci/install.sh
Executable file
@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
if [[ "${CI_TARGET}" == lint ]]; then
|
||||
python3 -m pip -q install --user --upgrade flake8
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
|
||||
export PATH="/usr/local/opt/ccache/libexec:$PATH"
|
||||
fi
|
||||
|
||||
# Use default CC to avoid compilation problems when installing Python modules.
|
||||
echo "Install neovim module for Python 3."
|
||||
CC=cc python3 -m pip -q install --user --upgrade pynvim
|
||||
if python2 -m pip -c True 2>&1; then
|
||||
echo "Install neovim module for Python 2."
|
||||
CC=cc python2 -m pip -q install --user --upgrade pynvim
|
||||
fi
|
||||
|
||||
echo "Install neovim RubyGem."
|
||||
gem install --no-document --bindir "$HOME/.local/bin" --user-install --pre neovim
|
||||
|
||||
echo "Install neovim npm package"
|
||||
source ~/.nvm/nvm.sh
|
||||
nvm use 10
|
||||
npm install -g neovim
|
||||
npm link neovim
|
||||
|
||||
sudo cpanm -n Neovim::Ext || cat "$HOME/.cpanm/build.log"
|
||||
perl -W -e 'use Neovim::Ext; print $Neovim::Ext::VERSION'
|
36
ci/run_lint.sh
Executable file
36
ci/run_lint.sh
Executable file
@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
source "${CI_DIR}/common/build.sh"
|
||||
source "${CI_DIR}/common/suite.sh"
|
||||
|
||||
enter_suite 'clint'
|
||||
run_test 'make clint-full' clint
|
||||
exit_suite --continue
|
||||
|
||||
enter_suite 'lualint'
|
||||
run_test 'make lualint' lualint
|
||||
exit_suite --continue
|
||||
|
||||
enter_suite 'pylint'
|
||||
run_test 'make pylint' pylint
|
||||
exit_suite --continue
|
||||
|
||||
enter_suite 'shlint'
|
||||
run_test 'make shlint' shlint
|
||||
exit_suite --continue
|
||||
|
||||
enter_suite single-includes
|
||||
CLICOLOR_FORCE=1 run_test_wd \
|
||||
--allow-hang \
|
||||
10s \
|
||||
'make check-single-includes' \
|
||||
'csi_clean' \
|
||||
single-includes
|
||||
exit_suite --continue
|
||||
|
||||
end_tests
|
40
ci/run_tests.sh
Executable file
40
ci/run_tests.sh
Executable file
@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${CI_DIR}/common/build.sh"
|
||||
source "${CI_DIR}/common/test.sh"
|
||||
source "${CI_DIR}/common/suite.sh"
|
||||
|
||||
enter_suite build
|
||||
|
||||
check_core_dumps --delete quiet
|
||||
|
||||
prepare_build
|
||||
build_nvim
|
||||
|
||||
exit_suite --continue
|
||||
|
||||
source ~/.nvm/nvm.sh
|
||||
nvm use 10
|
||||
|
||||
|
||||
enter_suite tests
|
||||
|
||||
if test "$CLANG_SANITIZER" != "TSAN" ; then
|
||||
# Additional threads are only created when the builtin UI starts, which
|
||||
# doesn't happen in the unit/functional tests
|
||||
if test "${FUNCTIONALTEST}" != "functionaltest-lua"; then
|
||||
run_test run_unittests
|
||||
fi
|
||||
run_test run_functionaltests
|
||||
fi
|
||||
run_test run_oldtests
|
||||
|
||||
run_test install_nvim
|
||||
|
||||
exit_suite --continue
|
||||
|
||||
end_tests
|
19
ci/script.sh
Executable file
19
ci/script.sh
Executable file
@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
# This will pass the environment variables down to a bash process which runs
|
||||
# as $USER, while retaining the environment variables defined and belonging
|
||||
# to secondary groups given above in usermod.
|
||||
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
|
||||
sudo -E su "${USER}" -c "ci/run_${CI_TARGET}.sh"
|
||||
else
|
||||
ci/run_${CI_TARGET}.sh
|
||||
fi
|
||||
|
||||
if [[ -s "${GCOV_ERROR_FILE}" ]]; then
|
||||
echo '=== Unexpected gcov errors: ==='
|
||||
cat "${GCOV_ERROR_FILE}"
|
||||
exit 1
|
||||
fi
|
194
ci/snap/.snapcraft_payload
Normal file
194
ci/snap/.snapcraft_payload
Normal file
@ -0,0 +1,194 @@
|
||||
{
|
||||
"ref": "refs/heads/master",
|
||||
"before": "66b136c43c12df3dcf8f19ff48f206ad2e4f43fc",
|
||||
"after": "1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
|
||||
"repository": {
|
||||
"id": 292861950,
|
||||
"node_id": "MDEwOlJlcG9zaXRvcnkyOTI4NjE5NTA=",
|
||||
"name": "neovim-snap",
|
||||
"full_name": "hurricanehrndz/neovim-snap",
|
||||
"private": false,
|
||||
"owner": {
|
||||
"name": "hurricanehrndz",
|
||||
"email": "hurricanehrndz@users.noreply.github.com",
|
||||
"login": "hurricanehrndz",
|
||||
"id": 5804237,
|
||||
"node_id": "MDQ6VXNlcjU4MDQyMzc=",
|
||||
"avatar_url": "https://avatars0.githubusercontent.com/u/5804237?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/hurricanehrndz",
|
||||
"html_url": "https://github.com/hurricanehrndz",
|
||||
"followers_url": "https://api.github.com/users/hurricanehrndz/followers",
|
||||
"following_url": "https://api.github.com/users/hurricanehrndz/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/hurricanehrndz/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/hurricanehrndz/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/hurricanehrndz/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/hurricanehrndz/orgs",
|
||||
"repos_url": "https://api.github.com/users/hurricanehrndz/repos",
|
||||
"events_url": "https://api.github.com/users/hurricanehrndz/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/hurricanehrndz/received_events",
|
||||
"type": "User",
|
||||
"site_admin": false
|
||||
},
|
||||
"html_url": "https://github.com/hurricanehrndz/neovim-snap",
|
||||
"description": "snap build for neovim",
|
||||
"fork": false,
|
||||
"url": "https://github.com/hurricanehrndz/neovim-snap",
|
||||
"forks_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/forks",
|
||||
"keys_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/keys{/key_id}",
|
||||
"collaborators_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/collaborators{/collaborator}",
|
||||
"teams_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/teams",
|
||||
"hooks_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/hooks",
|
||||
"issue_events_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/issues/events{/number}",
|
||||
"events_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/events",
|
||||
"assignees_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/assignees{/user}",
|
||||
"branches_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/branches{/branch}",
|
||||
"tags_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/tags",
|
||||
"blobs_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/blobs{/sha}",
|
||||
"git_tags_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/tags{/sha}",
|
||||
"git_refs_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/refs{/sha}",
|
||||
"trees_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/trees{/sha}",
|
||||
"statuses_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/statuses/{sha}",
|
||||
"languages_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/languages",
|
||||
"stargazers_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/stargazers",
|
||||
"contributors_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/contributors",
|
||||
"subscribers_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/subscribers",
|
||||
"subscription_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/subscription",
|
||||
"commits_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/commits{/sha}",
|
||||
"git_commits_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/commits{/sha}",
|
||||
"comments_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/comments{/number}",
|
||||
"issue_comment_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/issues/comments{/number}",
|
||||
"contents_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/contents/{+path}",
|
||||
"compare_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/compare/{base}...{head}",
|
||||
"merges_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/merges",
|
||||
"archive_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/{archive_format}{/ref}",
|
||||
"downloads_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/downloads",
|
||||
"issues_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/issues{/number}",
|
||||
"pulls_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/pulls{/number}",
|
||||
"milestones_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/milestones{/number}",
|
||||
"notifications_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/notifications{?since,all,participating}",
|
||||
"labels_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/labels{/name}",
|
||||
"releases_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/releases{/id}",
|
||||
"deployments_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/deployments",
|
||||
"created_at": 1599227980,
|
||||
"updated_at": "2020-09-04T14:02:38Z",
|
||||
"pushed_at": 1599228352,
|
||||
"git_url": "git://github.com/hurricanehrndz/neovim-snap.git",
|
||||
"ssh_url": "git@github.com:hurricanehrndz/neovim-snap.git",
|
||||
"clone_url": "https://github.com/hurricanehrndz/neovim-snap.git",
|
||||
"svn_url": "https://github.com/hurricanehrndz/neovim-snap",
|
||||
"homepage": null,
|
||||
"size": 0,
|
||||
"stargazers_count": 0,
|
||||
"watchers_count": 0,
|
||||
"language": null,
|
||||
"has_issues": true,
|
||||
"has_projects": true,
|
||||
"has_downloads": true,
|
||||
"has_wiki": true,
|
||||
"has_pages": false,
|
||||
"forks_count": 0,
|
||||
"mirror_url": null,
|
||||
"archived": false,
|
||||
"disabled": false,
|
||||
"open_issues_count": 0,
|
||||
"license": {
|
||||
"key": "mit",
|
||||
"name": "MIT License",
|
||||
"spdx_id": "MIT",
|
||||
"url": "https://api.github.com/licenses/mit",
|
||||
"node_id": "MDc6TGljZW5zZTEz"
|
||||
},
|
||||
"forks": 0,
|
||||
"open_issues": 0,
|
||||
"watchers": 0,
|
||||
"default_branch": "master",
|
||||
"stargazers": 0,
|
||||
"master_branch": "master"
|
||||
},
|
||||
"pusher": {
|
||||
"name": "hurricanehrndz",
|
||||
"email": "hurricanehrndz@users.noreply.github.com"
|
||||
},
|
||||
"sender": {
|
||||
"login": "hurricanehrndz",
|
||||
"id": 5804237,
|
||||
"node_id": "MDQ6VXNlcjU4MDQyMzc=",
|
||||
"avatar_url": "https://avatars0.githubusercontent.com/u/5804237?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/hurricanehrndz",
|
||||
"html_url": "https://github.com/hurricanehrndz",
|
||||
"followers_url": "https://api.github.com/users/hurricanehrndz/followers",
|
||||
"following_url": "https://api.github.com/users/hurricanehrndz/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/hurricanehrndz/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/hurricanehrndz/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/hurricanehrndz/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/hurricanehrndz/orgs",
|
||||
"repos_url": "https://api.github.com/users/hurricanehrndz/repos",
|
||||
"events_url": "https://api.github.com/users/hurricanehrndz/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/hurricanehrndz/received_events",
|
||||
"type": "User",
|
||||
"site_admin": false
|
||||
},
|
||||
"created": false,
|
||||
"deleted": false,
|
||||
"forced": false,
|
||||
"base_ref": null,
|
||||
"compare": "https://github.com/hurricanehrndz/neovim-snap/compare/66b136c43c12...1bf69c32217c",
|
||||
"commits": [
|
||||
{
|
||||
"id": "1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
|
||||
"tree_id": "62ea83a2349be8c930c45fdc199f71b08bf5927e",
|
||||
"distinct": true,
|
||||
"message": "Build of latest tag",
|
||||
"timestamp": "2020-09-04T14:05:40Z",
|
||||
"url": "https://github.com/hurricanehrndz/neovim-snap/commit/1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
|
||||
"author": {
|
||||
"name": "Carlos Hernandez",
|
||||
"email": "carlos@techbyte.ca",
|
||||
"username": "hurricanehrndz"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Carlos Hernandez",
|
||||
"email": "carlos@techbyte.ca",
|
||||
"username": "hurricanehrndz"
|
||||
},
|
||||
"added": [
|
||||
|
||||
],
|
||||
"removed": [
|
||||
|
||||
],
|
||||
"modified": [
|
||||
"snap/snapcraft.yaml"
|
||||
]
|
||||
}
|
||||
],
|
||||
"head_commit": {
|
||||
"id": "1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
|
||||
"tree_id": "62ea83a2349be8c930c45fdc199f71b08bf5927e",
|
||||
"distinct": true,
|
||||
"message": "Build of latest tag",
|
||||
"timestamp": "2020-09-04T14:05:40Z",
|
||||
"url": "https://github.com/hurricanehrndz/neovim-snap/commit/1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
|
||||
"author": {
|
||||
"name": "Carlos Hernandez",
|
||||
"email": "carlos@techbyte.ca",
|
||||
"username": "hurricanehrndz"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Carlos Hernandez",
|
||||
"email": "carlos@techbyte.ca",
|
||||
"username": "hurricanehrndz"
|
||||
},
|
||||
"added": [
|
||||
|
||||
],
|
||||
"removed": [
|
||||
|
||||
],
|
||||
"modified": [
|
||||
"snap/snapcraft.yaml"
|
||||
]
|
||||
}
|
||||
}
|
14
ci/snap/after_success.sh
Executable file
14
ci/snap/after_success.sh
Executable file
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
|
||||
RESULT_SNAP=$(find ./ -name "*.snap")
|
||||
|
||||
sudo snap install "$RESULT_SNAP" --dangerous --classic
|
||||
|
||||
/snap/bin/nvim --version
|
||||
|
||||
SHA256=$(sha256sum "$RESULT_SNAP")
|
||||
echo "SHA256: ${SHA256} ."
|
39
ci/snap/deploy.sh
Executable file
39
ci/snap/deploy.sh
Executable file
@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
SNAP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
WEBHOOK_PAYLOAD="$(cat "${SNAP_DIR}/.snapcraft_payload")"
|
||||
PAYLOAD_SIG="${SECRET_SNAP_SIG}"
|
||||
|
||||
|
||||
snap_realease_needed() {
|
||||
last_committed_tag="$(git tag -l --sort=refname|head -1)"
|
||||
last_snap_release="$(snap info nvim | awk '$1 == "latest/edge:" { print $2 }' | perl -lpe 's/v\d.\d.\d-//g')"
|
||||
git fetch -f --tags
|
||||
git checkout "${last_committed_tag}" 2> /dev/null
|
||||
last_git_release="$(git describe --first-parent 2> /dev/null | perl -lpe 's/v\d.\d.\d-//g')"
|
||||
|
||||
if [[ -z "$(echo $last_snap_release | perl -ne "print if /${last_git_release}.*/")" ]]; then
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
|
||||
trigger_snapcraft_webhook() {
|
||||
[[ -n "${PAYLOAD_SIG}" ]] || exit
|
||||
echo "Triggering new snap release via webhook..."
|
||||
curl -X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Hub-Signature: sha1=${PAYLOAD_SIG}" \
|
||||
--data "${WEBHOOK_PAYLOAD}" \
|
||||
https://snapcraft.io/nvim/webhook/notify
|
||||
}
|
||||
|
||||
|
||||
if $(snap_realease_needed); then
|
||||
echo "New snap release required"
|
||||
trigger_snapcraft_webhook
|
||||
fi
|
11
ci/snap/install.sh
Executable file
11
ci/snap/install.sh
Executable file
@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
sudo apt update
|
||||
sudo usermod -aG lxd $USER
|
||||
sudo /snap/bin/lxd.migrate -yes
|
||||
sudo /snap/bin/lxd waitready
|
||||
sudo /snap/bin/lxd init --auto
|
||||
|
8
ci/snap/script.sh
Executable file
8
ci/snap/script.sh
Executable file
@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
mkdir -p "$CI_BUILD_DIR/snaps-cache"
|
||||
sg lxd -c snapcraft
|
||||
|
BIN
ci/snap/travis_snapcraft.cfg
Normal file
BIN
ci/snap/travis_snapcraft.cfg
Normal file
Binary file not shown.
@ -1,199 +0,0 @@
|
||||
include(CheckTypeSize)
|
||||
include(CheckSymbolExists)
|
||||
include(CheckFunctionExists)
|
||||
include(CheckIncludeFiles)
|
||||
include(CheckCSourceRuns)
|
||||
include(CheckCSourceCompiles)
|
||||
include(TestBigEndian)
|
||||
|
||||
check_c_source_compiles("
|
||||
#include <execinfo.h>
|
||||
int main(void)
|
||||
{
|
||||
void *trace[1];
|
||||
backtrace(trace, 1);
|
||||
return 0;
|
||||
}
|
||||
" HAVE_EXECINFO_BACKTRACE)
|
||||
|
||||
check_c_source_compiles("
|
||||
int main(void)
|
||||
{
|
||||
int a = 42;
|
||||
__builtin_add_overflow(a, a, &a);
|
||||
__builtin_sub_overflow(a, a, &a);
|
||||
return 0;
|
||||
}
|
||||
" HAVE_BUILTIN_ADD_OVERFLOW)
|
||||
|
||||
check_type_size("int" SIZEOF_INT LANGUAGE C)
|
||||
check_type_size("long" SIZEOF_LONG LANGUAGE C)
|
||||
check_type_size("intmax_t" SIZEOF_INTMAX_T LANGUAGE C)
|
||||
check_type_size("size_t" SIZEOF_SIZE_T LANGUAGE C)
|
||||
check_type_size("void *" SIZEOF_VOID_PTR LANGUAGE C)
|
||||
|
||||
check_symbol_exists(_NSGetEnviron crt_externs.h HAVE__NSGETENVIRON)
|
||||
|
||||
# Headers
|
||||
check_include_files(langinfo.h HAVE_LANGINFO_H)
|
||||
check_include_files(strings.h HAVE_STRINGS_H)
|
||||
check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H)
|
||||
check_include_files(termios.h HAVE_TERMIOS_H)
|
||||
check_include_files(sys/uio.h HAVE_SYS_UIO_H)
|
||||
check_include_files(sys/sdt.h HAVE_SYS_SDT_H)
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
check_include_files(sys/xattr.h HAVE_XATTR)
|
||||
endif()
|
||||
|
||||
# Functions
|
||||
check_function_exists(fseeko HAVE_FSEEKO)
|
||||
check_function_exists(readv HAVE_READV)
|
||||
check_function_exists(readlink HAVE_READLINK)
|
||||
check_function_exists(strnlen HAVE_STRNLEN)
|
||||
check_function_exists(strcasecmp HAVE_STRCASECMP)
|
||||
check_function_exists(strncasecmp HAVE_STRNCASECMP)
|
||||
check_function_exists(strptime HAVE_STRPTIME)
|
||||
|
||||
check_c_source_compiles("
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/file.h>
|
||||
int main(void)
|
||||
{
|
||||
DIR *dir = opendir(\"dirname\");
|
||||
dirfd(dir);
|
||||
flock(10, LOCK_SH);
|
||||
return 0;
|
||||
}
|
||||
" HAVE_DIRFD_AND_FLOCK)
|
||||
|
||||
|
||||
check_c_source_compiles("
|
||||
#include <pwd.h>
|
||||
int main(void)
|
||||
{
|
||||
getpwent();
|
||||
getpwuid(0);
|
||||
getpwnam(\"root\");
|
||||
return 0;
|
||||
}
|
||||
" HAVE_PWD_FUNCS)
|
||||
|
||||
check_c_source_compiles("
|
||||
#include <intrin.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
unsigned long index;
|
||||
unsigned char mask = 0x8000;
|
||||
_BitScanForward64(&index, mask);
|
||||
return 0;
|
||||
}
|
||||
" HAVE_BITSCANFORWARD64)
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
|
||||
check_c_source_compiles("
|
||||
#include <termios.h>
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
return forkpty(0, NULL, NULL, NULL);
|
||||
}
|
||||
" HAVE_FORKPTY)
|
||||
else()
|
||||
set(HAVE_FORKPTY 1)
|
||||
endif()
|
||||
|
||||
# Symbols
|
||||
check_symbol_exists(FD_CLOEXEC "fcntl.h" HAVE_FD_CLOEXEC)
|
||||
if(HAVE_LANGINFO_H)
|
||||
check_symbol_exists(CODESET "langinfo.h" HAVE_NL_LANGINFO_CODESET)
|
||||
endif()
|
||||
|
||||
check_include_files("endian.h" HAVE_ENDIAN_H)
|
||||
|
||||
set(ENDIAN_INCLUDE_FILE "endian.h")
|
||||
if(NOT HAVE_ENDIAN_H)
|
||||
check_include_files("sys/endian.h" HAVE_SYS_ENDIAN_H)
|
||||
if (HAVE_SYS_ENDIAN_H)
|
||||
set(ENDIAN_INCLUDE_FILE "sys/endian.h")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(SI "#include <stdint.h>\n")
|
||||
set(MS "int main(int argc,char**argv)\n{\n uint64_t i=0x0102030405060708ULL;")
|
||||
set(ME "}")
|
||||
check_c_source_compiles("
|
||||
#define _BSD_SOURCE 1
|
||||
#define _DEFAULT_SOURCE 1
|
||||
${SI}
|
||||
#include <${ENDIAN_INCLUDE_FILE}>
|
||||
#ifndef be64toh
|
||||
# error No be64toh macros
|
||||
#endif
|
||||
${MS}
|
||||
uint64_t j = be64toh(i);
|
||||
return (j == 0); // j must not be zero
|
||||
${ME}"
|
||||
HAVE_BE64TOH_MACROS)
|
||||
if(NOT "${HAVE_BE64TOH_MACROS}")
|
||||
check_function_exists(be64toh HAVE_BE64TOH_FUNC)
|
||||
endif()
|
||||
if("${HAVE_BE64TOH_MACROS}" OR "${HAVE_BE64TOH_FUNC}")
|
||||
set(HAVE_BE64TOH 1)
|
||||
endif()
|
||||
|
||||
test_big_endian(ORDER_BIG_ENDIAN)
|
||||
|
||||
configure_file (
|
||||
"${PROJECT_SOURCE_DIR}/cmake.config/config.h.in"
|
||||
"${PROJECT_BINARY_DIR}/cmake.config/auto/config.h"
|
||||
)
|
||||
|
||||
set(VERSION_STRING "${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} ")
|
||||
|
||||
foreach(BUILD_TYPE Debug Release RelWithDebInfo MinSizeRel)
|
||||
string(TOUPPER ${BUILD_TYPE} BUILD_TYPE_UPPER)
|
||||
set(GEN_CONFIG "$<CONFIG:${BUILD_TYPE}>")
|
||||
|
||||
set(GEN_RHS "${CMAKE_C_FLAGS_${BUILD_TYPE_UPPER}} ")
|
||||
string(APPEND VERSION_STRING "$<${GEN_CONFIG}:${GEN_RHS}>")
|
||||
|
||||
set(GEN_RHS "$<$<BOOL:$<TARGET_PROPERTY:nvim_bin,INTERPROCEDURAL_OPTIMIZATION_${BUILD_TYPE_UPPER}>>:${CMAKE_C_COMPILE_OPTIONS_IPO}>")
|
||||
string(APPEND VERSION_STRING "$<${GEN_CONFIG}:${GEN_RHS}>")
|
||||
endforeach()
|
||||
|
||||
string(APPEND VERSION_STRING " ")
|
||||
|
||||
function(append_target_expression)
|
||||
cmake_parse_arguments(ARG
|
||||
""
|
||||
"PREFIX;PROPERTY"
|
||||
""
|
||||
${ARGN})
|
||||
|
||||
set(TARGET_EXPRESSION "$<TARGET_PROPERTY:nvim_bin,${ARG_PROPERTY}>")
|
||||
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL 3.15)
|
||||
set(TARGET_EXPRESSION "$<REMOVE_DUPLICATES:${TARGET_EXPRESSION}>")
|
||||
endif()
|
||||
set(TARGET_EXPRESSION "${ARG_PREFIX}$<JOIN:${TARGET_EXPRESSION}, ${ARG_PREFIX}>")
|
||||
|
||||
set(VERSION_STRING "${VERSION_STRING} ${TARGET_EXPRESSION} " PARENT_SCOPE)
|
||||
endfunction()
|
||||
append_target_expression(PROPERTY COMPILE_OPTIONS)
|
||||
append_target_expression(PROPERTY LINK_OPTIONS)
|
||||
append_target_expression(PREFIX "-D" PROPERTY COMPILE_DEFINITIONS)
|
||||
append_target_expression(PREFIX "-I" PROPERTY INCLUDE_DIRECTORIES)
|
||||
string(REPLACE ";" " " VERSION_STRING "${VERSION_STRING}")
|
||||
string(REPLACE " " " " VERSION_STRING "${VERSION_STRING}")
|
||||
|
||||
configure_file(versiondef.h.in auto/versiondef.h.gen)
|
||||
|
||||
file(GENERATE
|
||||
OUTPUT "${PROJECT_BINARY_DIR}/cmake.config/auto/versiondef-$<CONFIG>.h"
|
||||
INPUT "${PROJECT_BINARY_DIR}/cmake.config/auto/versiondef.h.gen")
|
||||
|
||||
configure_file (
|
||||
"${PROJECT_SOURCE_DIR}/cmake.config/pathdef.h.in"
|
||||
"${PROJECT_BINARY_DIR}/cmake.config/auto/pathdef.h"
|
||||
ESCAPE_QUOTES)
|
File diff suppressed because it is too large
Load Diff
@ -1,30 +0,0 @@
|
||||
[
|
||||
{ ref: "c99.imp" },
|
||||
{ ref: "posix.imp" },
|
||||
|
||||
{ symbol: [ "FUNC_ATTR_ALLOC_ALIGN", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_ALLOC_SIZE", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_ALLOC_SIZE_PROD", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_ALWAYS_INLINE", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_CONST", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_MALLOC", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_NONNULL_ALL", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_NONNULL_ARG", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_NONNULL_RET", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_NORETURN", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_NO_SANITIZE_ADDRESS", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_NO_SANITIZE_UNDEFINED", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_PRINTF", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_PURE", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_UNUSED", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "FUNC_ATTR_WARN_UNUSED_RESULT", private, '"nvim/func_attr.h"', public ] },
|
||||
{ symbol: [ "MAX", private, '"nvim/macros_defs.h"', public ] },
|
||||
{ symbol: [ "MIN", private, '"nvim/macros_defs.h"', public ] },
|
||||
{ symbol: [ "extern_proc", private, '<uv.h>', public ] },
|
||||
{ symbol: [ "iovec", private, '<sys/uio.h>', public ] },
|
||||
{ symbol: [ "ssize_t", private, '<uv.h>', public ] },
|
||||
|
||||
{ include: [ '<uv/unix.h>', private, '<uv.h>', public ] },
|
||||
]
|
||||
|
||||
# vim: set ft=toml:
|
@ -1,33 +0,0 @@
|
||||
[
|
||||
{ include: [ "<arm/limits.h>", private, "<limits.h>", public ] },
|
||||
{ include: [ "<asm/ioctls.h>", private, "<bits/ioctls.h>", private ] },
|
||||
{ include: [ "<bits/termios-c_lflag.h>", private, "<termios.h>", public ] },
|
||||
{ include: [ "<bits/termios-struct.h>", private, "<termios.h>", public ] },
|
||||
{ include: [ "<sys/errno.h>", private, "<errno.h>", public ] },
|
||||
{ include: [ "<sys/fcntl.h>", private, "<fcntl.h>", public ] },
|
||||
{ include: [ "<sys/signal.h>", private, "<signal.h>", public ] },
|
||||
{ include: [ "<sys/termios.h>", private, "<termios.h>", public ] },
|
||||
{ include: [ '<asm/errno-base.h>', private, '<errno.h>', public ] },
|
||||
{ include: [ '<asm/errno.h>', private, '<errno.h>', public ] },
|
||||
{ include: [ '<bits/termios-c_cc.h>', private, '<termios.h>', public ] },
|
||||
{ include: [ '<bits/termios-c_cflag.h>', private, '<termios.h>', public ] },
|
||||
{ include: [ '<bits/termios-c_iflag.h>', private, '<termios.h>', public ] },
|
||||
{ include: [ '<bits/termios-c_oflag.h>', private, '<termios.h>', public ] },
|
||||
{ include: [ '<sys/ttycom.h>', private, '<sys/ioctl.h>', public ] },
|
||||
{ include: [ '<sys/unistd.h>', private, '<unistd.h>', private ] },
|
||||
|
||||
{ symbol: ["SOCK_STREAM", private, "<sys/socket.h>", public ] },
|
||||
{ symbol: ["SSIZE_MAX", private, "<limits.h>", public ] },
|
||||
{ symbol: ["S_IREAD", private, "<sys/stat.h>", public ] },
|
||||
{ symbol: ["S_IWRITE", private, "<sys/stat.h>", public ] },
|
||||
{ symbol: ["_POSIX_VDISABLE", private, "<unistd.h>", private ] },
|
||||
{ symbol: ["flock", private, "<sys/file.h>", public ] },
|
||||
{ symbol: ["iovec", private, "<sys/uio.h>", public ] },
|
||||
{ symbol: ["mode_t", private, "<sys/types.h>", public ] },
|
||||
{ symbol: ["ntohs", private, "<arpa/inet.h>", public ] },
|
||||
{ symbol: ["pthread_sigmask", private, "<signal.h>", public ] },
|
||||
{ symbol: ["sigset_t", private, "<signal.h>", public ] },
|
||||
{ symbol: ["uid_t", private, "<sys/types.h>", public ] },
|
||||
]
|
||||
|
||||
# vim: set ft=toml:
|
@ -1,3 +0,0 @@
|
||||
char *default_vim_dir = "${CMAKE_INSTALL_FULL_DATAROOTDIR}/nvim";
|
||||
char *default_vimruntime_dir = "";
|
||||
char *default_lib_dir = "${CMAKE_INSTALL_FULL_LIBDIR}/nvim";
|
@ -1,152 +0,0 @@
|
||||
# This is not meant to be included by the top-level.
|
||||
cmake_minimum_required (VERSION 3.13)
|
||||
project(NVIM_DEPS C)
|
||||
|
||||
if(POLICY CMP0135)
|
||||
cmake_policy(SET CMP0135 NEW)
|
||||
endif()
|
||||
|
||||
# Point CMake at any custom modules we may ship
|
||||
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" "${PROJECT_SOURCE_DIR}/../cmake")
|
||||
|
||||
include(CheckCCompilerFlag)
|
||||
include(ExternalProject)
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
include(Deps)
|
||||
include(Find)
|
||||
include(Util)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# User settings
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
set(DEPS_IGNORE_SHA FALSE)
|
||||
|
||||
# Options
|
||||
option(USE_BUNDLED "Use bundled dependencies." ON)
|
||||
|
||||
option(USE_BUNDLED_LIBUV "Use the bundled libuv." ${USE_BUNDLED})
|
||||
option(USE_BUNDLED_LIBVTERM "Use the bundled libvterm." ${USE_BUNDLED})
|
||||
option(USE_BUNDLED_LPEG "Use the bundled lpeg." ${USE_BUNDLED})
|
||||
# PUC Lua is only used for tests, unless explicitly requested.
|
||||
option(USE_BUNDLED_LUA "Use the bundled version of lua." OFF)
|
||||
option(USE_BUNDLED_LUAJIT "Use the bundled version of luajit." ${USE_BUNDLED})
|
||||
option(USE_BUNDLED_LUV "Use the bundled version of luv." ${USE_BUNDLED})
|
||||
option(USE_BUNDLED_MSGPACK "Use the bundled msgpack." ${USE_BUNDLED})
|
||||
option(USE_BUNDLED_TS "Use the bundled treesitter runtime." ${USE_BUNDLED})
|
||||
option(USE_BUNDLED_TS_PARSERS "Use the bundled treesitter parsers." ${USE_BUNDLED})
|
||||
option(USE_BUNDLED_UNIBILIUM "Use the bundled unibilium." ${USE_BUNDLED})
|
||||
if(USE_BUNDLED AND MSVC)
|
||||
option(USE_BUNDLED_GETTEXT "Use the bundled version of gettext." ON)
|
||||
option(USE_BUNDLED_LIBICONV "Use the bundled version of libiconv." ON)
|
||||
else()
|
||||
option(USE_BUNDLED_GETTEXT "Use the bundled version of gettext." OFF)
|
||||
option(USE_BUNDLED_LIBICONV "Use the bundled version of libiconv." OFF)
|
||||
endif()
|
||||
|
||||
option(USE_EXISTING_SRC_DIR "Skip download of deps sources in case of existing source directory." OFF)
|
||||
|
||||
set_default_buildtype(Release)
|
||||
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if(NOT isMultiConfig)
|
||||
list(APPEND DEPS_CMAKE_ARGS -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE})
|
||||
endif()
|
||||
|
||||
set(DEFAULT_MAKE_CFLAGS CFLAGS+=-g)
|
||||
|
||||
check_c_compiler_flag(-Og HAS_OG_FLAG)
|
||||
if(HAS_OG_FLAG)
|
||||
set(DEFAULT_MAKE_CFLAGS CFLAGS+=-Og ${DEFAULT_MAKE_CFLAGS})
|
||||
endif()
|
||||
|
||||
set(DEPS_INCLUDE_FLAGS "-I${DEPS_INSTALL_DIR}/include -I${DEPS_INSTALL_DIR}/include/luajit-2.1")
|
||||
|
||||
# If the macOS deployment target is not set manually (via $MACOSX_DEPLOYMENT_TARGET),
|
||||
# fall back to local system version. Needs to be done here and in top-level CMakeLists.txt.
|
||||
if(APPLE)
|
||||
if(NOT CMAKE_OSX_DEPLOYMENT_TARGET)
|
||||
execute_process(COMMAND sw_vers -productVersion
|
||||
OUTPUT_VARIABLE MACOS_VERSION
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "${MACOS_VERSION}")
|
||||
endif()
|
||||
message(STATUS "Using deployment target ${CMAKE_OSX_DEPLOYMENT_TARGET}")
|
||||
endif()
|
||||
|
||||
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)
|
||||
include(BuildUnibilium)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_LIBVTERM)
|
||||
include(BuildLibvterm)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_LIBUV)
|
||||
include(BuildLibuv)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_MSGPACK)
|
||||
include(BuildMsgpack)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_LUAJIT)
|
||||
include(BuildLuajit)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_LUA)
|
||||
include(BuildLua)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_LUV)
|
||||
include(BuildLuv)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_LPEG)
|
||||
include(BuildLpeg)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_GETTEXT)
|
||||
include(BuildGettext)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_LIBICONV)
|
||||
include(BuildLibiconv)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_TS_PARSERS)
|
||||
include(BuildTreesitterParsers)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_TS)
|
||||
include(BuildTreesitter)
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
include(GetBinaryDeps)
|
||||
|
||||
GetExecutable(TARGET cat)
|
||||
GetExecutable(TARGET tee)
|
||||
GetExecutable(TARGET xxd)
|
||||
|
||||
GetBinaryDep(TARGET win32yank_X86_64
|
||||
INSTALL_COMMAND ${CMAKE_COMMAND} -E copy win32yank.exe ${DEPS_BIN_DIR})
|
||||
endif()
|
@ -1,25 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"configurePresets": [
|
||||
{
|
||||
"name": "base",
|
||||
"generator": "Ninja",
|
||||
"binaryDir": "${sourceDir}/../.deps",
|
||||
"hidden": true
|
||||
},
|
||||
{
|
||||
"name": "ci",
|
||||
"inherits": ["base"]
|
||||
},
|
||||
{
|
||||
"name": "external_deps",
|
||||
"description": "Build neovim with external deps on ubuntu",
|
||||
"cacheVariables": {
|
||||
"USE_BUNDLED":"OFF",
|
||||
"USE_BUNDLED_LIBVTERM":"ON",
|
||||
"USE_BUNDLED_TS":"ON"
|
||||
},
|
||||
"inherits": ["base"]
|
||||
}
|
||||
]
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
if(MSVC)
|
||||
get_externalproject_options(gettext ${DEPS_IGNORE_SHA})
|
||||
ExternalProject_Add(gettext
|
||||
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/gettext
|
||||
PATCH_COMMAND ${CMAKE_COMMAND} -E copy
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake/GettextCMakeLists.txt
|
||||
${DEPS_BUILD_DIR}/src/gettext/CMakeLists.txt
|
||||
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
|
||||
-D LIBICONV_INCLUDE_DIRS=${DEPS_INSTALL_DIR}/include
|
||||
-D LIBICONV_LIBRARIES=${DEPS_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}libcharset${CMAKE_STATIC_LIBRARY_SUFFIX}$<SEMICOLON>${DEPS_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}libiconv${CMAKE_STATIC_LIBRARY_SUFFIX}
|
||||
${EXTERNALPROJECT_OPTIONS})
|
||||
else()
|
||||
message(FATAL_ERROR "Trying to build gettext in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_LIBICONV)
|
||||
add_dependencies(gettext libiconv)
|
||||
endif()
|
@ -1,12 +0,0 @@
|
||||
if(MSVC)
|
||||
get_externalproject_options(libiconv ${DEPS_IGNORE_SHA})
|
||||
ExternalProject_Add(libiconv
|
||||
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libiconv
|
||||
PATCH_COMMAND ${CMAKE_COMMAND} -E copy
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibiconvCMakeLists.txt
|
||||
${DEPS_BUILD_DIR}/src/libiconv/CMakeLists.txt
|
||||
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
|
||||
${EXTERNALPROJECT_OPTIONS})
|
||||
else()
|
||||
message(FATAL_ERROR "Trying to build libiconv in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
|
||||
endif()
|
@ -1,9 +0,0 @@
|
||||
get_externalproject_options(libuv ${DEPS_IGNORE_SHA})
|
||||
ExternalProject_Add(libuv
|
||||
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libuv
|
||||
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
|
||||
-D CMAKE_INSTALL_LIBDIR=lib
|
||||
-D BUILD_TESTING=OFF
|
||||
-D LIBUV_BUILD_SHARED=OFF
|
||||
-D UV_LINT_W4=OFF
|
||||
${EXTERNALPROJECT_OPTIONS})
|
@ -1,8 +0,0 @@
|
||||
get_externalproject_options(libvterm ${DEPS_IGNORE_SHA})
|
||||
ExternalProject_Add(libvterm
|
||||
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libvterm
|
||||
PATCH_COMMAND ${CMAKE_COMMAND} -E copy
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibvtermCMakeLists.txt
|
||||
${DEPS_BUILD_DIR}/src/libvterm/CMakeLists.txt
|
||||
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
|
||||
${EXTERNALPROJECT_OPTIONS})
|
@ -1,14 +0,0 @@
|
||||
get_externalproject_options(lpeg ${DEPS_IGNORE_SHA})
|
||||
ExternalProject_Add(lpeg
|
||||
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/lpeg
|
||||
PATCH_COMMAND ${CMAKE_COMMAND} -E copy
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake/LpegCMakeLists.txt
|
||||
${DEPS_BUILD_DIR}/src/lpeg/CMakeLists.txt
|
||||
CMAKE_ARGS ${DEPS_CMAKE_ARGS} -DCMAKE_C_FLAGS=${DEPS_INCLUDE_FLAGS}
|
||||
${EXTERNALPROJECT_OPTIONS})
|
||||
|
||||
if(USE_BUNDLED_LUAJIT)
|
||||
add_dependencies(lpeg luajit)
|
||||
elseif(USE_BUNDLED_LUA)
|
||||
add_dependencies(lpeg lua)
|
||||
endif()
|
@ -1,50 +0,0 @@
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
set(LUA_TARGET linux)
|
||||
elseif(APPLE)
|
||||
set(LUA_TARGET macosx)
|
||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
|
||||
set(LUA_TARGET freebsd)
|
||||
elseif(CMAKE_SYSTEM_NAME MATCHES "BSD")
|
||||
set(LUA_TARGET bsd)
|
||||
elseif(CMAKE_SYSTEM_NAME MATCHES "^MINGW")
|
||||
set(LUA_TARGET mingw)
|
||||
else()
|
||||
if(UNIX)
|
||||
set(LUA_TARGET posix)
|
||||
else()
|
||||
set(LUA_TARGET generic)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(LUA_CFLAGS "-O2 -g3 -fPIC")
|
||||
set(LUA_LDFLAGS "")
|
||||
|
||||
if(ENABLE_ASAN_UBSAN)
|
||||
set(LUA_CFLAGS "${LUA_CFLAGS} -fsanitize=address")
|
||||
set(LUA_CFLAGS "${LUA_CFLAGS} -fno-omit-frame-pointer")
|
||||
set(LUA_CFLAGS "${LUA_CFLAGS} -fno-optimize-sibling-calls")
|
||||
|
||||
set(LUA_LDFLAGS "${LUA_LDFLAGS} -fsanitize=address")
|
||||
endif()
|
||||
|
||||
set(LUA_CONFIGURE_COMMAND
|
||||
sed -e "/^CC/s@gcc@${CMAKE_C_COMPILER}@"
|
||||
-e "/^CFLAGS/s@-O2@${LUA_CFLAGS}@"
|
||||
-e "/^MYLDFLAGS/s@$@${LUA_LDFLAGS}@"
|
||||
-e "s@-lreadline@@g"
|
||||
-e "s@-lhistory@@g"
|
||||
-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}")
|
||||
|
||||
get_externalproject_options(lua ${DEPS_IGNORE_SHA})
|
||||
ExternalProject_Add(lua
|
||||
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/lua
|
||||
CONFIGURE_COMMAND "${LUA_CONFIGURE_COMMAND}"
|
||||
BUILD_IN_SOURCE 1
|
||||
BUILD_COMMAND ${MAKE_PRG} ${LUA_INSTALL_TOP_ARG} ${LUA_TARGET}
|
||||
INSTALL_COMMAND ${MAKE_PRG} ${LUA_INSTALL_TOP_ARG} install
|
||||
${EXTERNALPROJECT_OPTIONS})
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user