rjvbb added a comment.
> Thus these places need to be turned into:
>
> ...
> if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND
CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.8")
> elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND
CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.1.0")
As you know this doesn't work reliably: whether it works or not depends on
cmake version and on CMP0025 - and thus requires all projects to set that
policy before calling `project`. I don't think that's an option, nor is
expecting Mac users to patch all toplevel CMake files of projects they want to
work with (or patch CMake so it sets the policy which is basically what I do on
my end). I also vaguely recall that cmake used the dotless AppleClang version
in earlier versions (= 810 instead of 8.1.0).
Besides, all those repeated separate ifs and elses do not make the code
easier to read or parse. Isn't it the whole purpose of having macros to reduce
code duplication and to hide complexity in a single location so that the
intended behaviour becomes easier to follow?
This makes Aleix's suggestion just to use `compiler<lang>_check_flag` much
more appealing, despite the cost and the fact it's so easy to break.
> Statements like `CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT
CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5` do not make sense.
That's a bit too strong. They make sense everywhere except on APPLE (and even
there they can be reliable).
> If you're unsure in which version of AppleClang a certain feature was
introduced then:
This is the gist of what I'm doing, except that I do not want to rely on
Apple clang being reported as AppleClang (= CMP0025 set to NEW).
> This "let's abuse ${ARGN} as code to be evaluated later" is pretty ugly.
It comes from a cmake ML post by a cmake dev (Brad Kind IIRC) so I guess it's
sanctioned ugliness (as so much in cmake syntax). The boolean operators are
only available in the IF functions so there aren't much options if you don't
want to use CmakeParseArguments. I'm already looking at doing just that for a
version that will look like `kde_add_supported_compiler_flags(FLAGS <flags>
SUPPORTED_IF <conditions>)`. The names (macro and keywords) are open for
discussion of course, and so is the addition of additional options.
I'll look at kdevelop's versions too. I have no real objection to favour my
own code over them if they work reliably. But now that you mention kdevelop:
I've long been forced to use stock compilers to build KDevelop (on Mac). I
always put that off to my AppleClang being too old but with this new knowledge
I suspect it's simply because something goes wrong in the compiler detection.
> I don't really understand why this branch is needed. The macro name name
suggests it does the compile check on all compilers. Again very misleading.
Erm, no?! The macro name suggests it runs a check, which is true. It doesn't
say which check...
(FWIW, `cmake_<lang>_compiler_check_flag` is equally misleading: it doesn't
check `${flag}` but `"${CMAKE_CXX_FLAGS} ${flag}"`)
REPOSITORY
R240 Extra CMake Modules
REVISION DETAIL
https://phabricator.kde.org/D16894
To: rjvbb, #build_system, kfunk
Cc: kfunk, apol, kde-frameworks-devel, kde-buildsystem, #build_system,
michaelh, ngraham, bruns