I'm trying to return a useful error message when cmake < 3.19 is used by the user to compile a project that has presets. The problem is that, for cmakes older than 3.19 the flag --preset is meaningless and, i believe, it is completely ignored.
Here is an example:
cmake --preset ValidPreset
> CMake Error: The source directory "/absolute/path/ValidPreset" does not exist.
which is misleading at best and has nothing to do with the version of cmake. Is there any way to signal this to the users?
Putting
cmake_minimum_required(VERSION 3.19)
in the CMakeLists.txt is useless as the file is not even open, the same goes for something like:
"cmakeMinimumRequired": {
"major": 3,
"minor": 19,
"patch": 0
},
in the CMakePresets.json as earlier version of cmake have no idea what that file is.
Is there an hack or workaround to signal the wrong version to the users?
You may create for every preset a directory with the same name, where put the
CMakeLists.txtfile. That file would just emit an error message. E.g.So, instead of emitting a message about non-existence directory
<...>/ValidPresetCMake will findCMakeLists.txtin that directory and execute it.Downside of this approach is that CMake will organize a source directory of your project as a build one, so every further attempt to build your project will silently(!) use the same build directory, until a user removes at least
CMakeCache.txtfile from it.I have seen a project which contains
CMakeLists.txtin some of its subdirectories, which was a legacy way for run CMake. In that project "fake"CMakeLists.txtjust emits a warning, but then calls rootCMakeLists.txt.But in your case I don't find useful for fake
CMakeLists.txtto attempt to perform a regular build. The main reason is that root directory will be used as a build one, which is definitely not desired neither by you (as the project developer) nor by a user. So it is better to explicitly ask user to invokecmakewithout--presetoption.