Some fields from `.cmake-kits.json` get ignored?
i-ilak opened this issue ยท 6 comments
Describe the bug
I'm having trouble with the .cmake-kits.json
configuration. I have a project and in its root I created the .cmake-kits.json
file and I pasted the following configuration:
{
"gcc Debug": {
"cmake_src_dir": "~/test",
"cmake_build_type": "Debug",
"cmake_usr_args": {
"CONAN": "ON",
"CONAN_DISABLE_CHECK_COMPILER": "ON"
},
"cmake_build_dir": "~/build_folder_to_test_something",
"cmake_build_args": {
"parallel": "14"
},
"generator": "Ninja"
}
}
The file gets correctly recognized by nvim
, i.e. I can run :CMakeSelectKit gcc Debug
and then I run :CMake
. If I then run :CMakeInfo
, half of the settings from above have been ignored (build type, build dir, build args).
To Reproduce
Steps to reproduce the behavior:
- Go to empty folder and create minimal
CMakeLists.txt
,main.cpp
, and.cmake-kits.json
with the above content - Open
CMakeLists.txt
innvim
and run:CMakeSelectKit gcc Debug
and:CMake
- Run
:CMakeInfo
. You should now see this
CMake:
version: 3.22.1
Project:
name: example_project
build type: Release
build directory: ~/test/cmake-build-Release
generator: Ninja
generation command: cmake -DCMAKE_BUILD_TYPE=Release -G "Ninja" -DCONAN_DISABLE_CHECK_COMPILER=ON -DCONAN=ON -B ~/test/cmake-build-Release -S ~/test
build command: cmake --build ~/test/cmake-build-Release --target all -- -C ~/test/cmake-build-Release
As you can see, anything related to the build config is not working.
Expected behavior
A configuration that corresponds to the specified .cmake-kits.json
.
If I'm misunderstanding how the .cmake-kits.json
should work, I apologize for the bug report and would appreciate some guidance on how to get it working.^^
Desktop (please complete the following information):
- OS: macOS, Ubuntu
- Editor: nvim
- Version: NVIM v0.10.0-dev, Build type: RelWithDebInfo, LuaJIT 2.1.0-beta3
Hi!๐
Thank you for raising the issue.
I hope, the plugin makes your workflow easier!
We will take a look to your issue as soon as possible.๐
The cmake-kits
support/parse only a handful of options, for e.g. cmake_build_type
and cmake_build_args
I'd recommend using the g:cmake_variants
variable.
As for the cmake_build_dir
it's done through g:cmake_build_dir
, or better yet through g:cmake_build_path_pattern
so you can have simultaneous builds of different build types/compilers/etc.
The way I use it is:
- select a cmake kit
- select a build variant
- run
:CMake
These are just some of my build variants:
let g:cmake_variants =
\{
\ 'debug-with-warnings': {
\ 'cmake_build_type' : 'Debug',
\ 'cmake_usr_args' : '-DENABLE_RUNTIME_CHECKS=ON -DMB_TREAT_WARNINGS_AS_ERRORS=OFF'
\ },
\ 'debug': {
\ 'cmake_build_type' : 'Debug',
\ 'cmake_usr_args' : '-DENABLE_RUNTIME_CHECKS=ON -DMB_TREAT_WARNINGS_AS_ERRORS=ON'
\ },
\ 'release': {
\ 'cmake_build_type' : 'Release',
\ 'cmake_usr_args' : '-DENABLE_RUNTIME_CHECKS=OFF -DMB_TREAT_WARNINGS_AS_ERRORS=OFF -DMB_INTEL_OPTIMIZATION=haswell'
\ }}
And these are some of my cmake_kits.json
:
...
"clang": {
"compilers": {
"C" : "/usr/bin/clang",
"CXX" : "/usr/bin/clang++"
},
"query_driver" : "/usr/bin/clang++",
"generator": "Ninja"
},
"gcc": {
"compilers": {
"C" : "/usr/bin/gcc",
"CXX" : "/usr/bin/g++"
},
"query_driver" : "/usr/bin/g++",
"generator": "Ninja"
},
...
As for the cmake_build_path_pattern
, I have this:
let g:cmake_build_path_pattern = [ '%s/workspace/build/%s/%s/%s', "$HOME, fnamemodify( getcwd(), ':t' ), g:cmake_selected_kit, g:cmake_build_type" ]
That way I get builds like:
~/workspace/build/ProjectName/clang/debug
~/workspace/build/ProjectName/clang/release
~/workspace/build/ProjectName/gcc/debug-with-warnings
~/workspace/build/AnotherProject/clang/debug-with-warnings
Hi @mark2185
I see, I didn't know that the .cmake-kits.json
where limited in that sense. From the README here I just assumed that everything that was listed in terms of vim variables could be moved to the json
-file. Sorry and thanks for the other suggestions!
The cmake_variants
works perfectly but with the cmake_build_path_pattern
I'm struggling a bit. Since I use nvim
my configuration is in Lua, i.e. I translated you suggestion to this
vim.g.cmake_build_path_pattern = {
string.format('%s/iilak/prg/build_folders/%s/%s/%s',
os.getenv('HOME'),
vim.fn.fnamemodify(vim.fn.getcwd(), ':t'),
vim.g.cmake_selected_kit,
vim.g.cmake_build_type
)
}
Unfortunately, this still doesn't work. When I open the a file in the test folder, it evaluates the above expression to e.g. ~/iilak/prg/build_folders/test//
since cmake_selected_kit
and cmake_build_type
are not yet set. So once I run :CMakeSelectKit gcc
and :CMakeSelectBuildType debug
it runs cmake
, but the build folder is then still ~/test/cmake-build-debug
, which seems to be the default pattern.
I'm sorry, I assume this is my inexperience with nvim that is causing this...
That's actually why both of the elements in g:cmake_build_path_pattern
are strings, they're being eval'd
at the time of use so it can "pick up" the g:cmake_selected_kit
and g:cmake_build_type
.
I'd suggest either writing that variable definition like this:
vim.cmd([[
let g:cmake_build_path_pattern = [ '%s/iilak/prg/build_folders/%s/%s/%s', "$HOME, fnamemodify( getcwd(), ':t' ), g:cmake_selected_kit, g:cmake_build_type" ]
]])
Or you could try writing it in lua, but as two strings, so just vim.g.cmake_build_path_pattern = { '%s/iilak/prg/build_folders/%s/%s/%s', "$HOME, fnamemodify( getcwd(), ':t' ), g:cmake_selected_kit, g:cmake_build_type" }
, I think that could work too.
Since the plugin is written in vimscript
I'm guessing the g:cmake_selected_kit
and g:cmake_build_type
in the second approach should work.
Hi @mark2185
Your Lua suggestion worked like a charm. Thanks a lot for the support! I'll close the issue, hope that works for you ๐
Great! Glad to have helped! :)