On 2015-10-05 14:30, Frederik Schwarzer wrote:
Am Samstag, 3. Oktober 2015, 00:30:04 schrieben Sie:
On Fri, Oct 2, 2015 at 11:09 PM, Frederik Schwarzer
<[email protected]> wrote:
> while looking through some make files, I found two things that I
> do
> not understand.
>
> 1)  add_definitions("-Dx -Dy") vs. add_definitions(-Dx -Dy)
> Is there a difference? Laurent added the quoted version in KShisen
> but "in the wild" I can only find the non-quoted version.

Well, not that I know of. If anything I would suggest /not/ using
the quotes, without knowing Laurent's reasoning. Maybe you can ask
him and enlighten us?

Unfortunately he wasn't as talkative as I had hoped. :)
He said that he does not understand my problem since both versions
worked. Well, he is right but my curiosity was not satisfied that day.
:)

There is a difference, and the second form is the correct one (although it makes very little practical difference, at least on most UNIX systems).

In CMake's internal language, the quoting works pretty much like on the command line -- with add_definitions("-Dx -Dy"), add_definitions is being passed a single argument "-Dx -Dy", and in add_definitions(-Dx -Dy) it is being passed two arguments, "-Dx" and "-Dy". You could equivalently write add_definitions("-Dx" "-Dy").

The difference is that when add_definitions receives "-Dx" as a single argument, it recognises it as a definition declaration and munges it if necessary. In particular, with MSVC it will produce "/Dx" (it also attempts some escaping magic if necessary, as with "-DFOO=\"some string\""). It also gets stored internally as a "definition" argument for the compiler.

When it receives "-Dx -Dy", it doesn't recognise it as a definition declaration, and assumes you want to dump it wholesale on the compiler command line. It gets stored internally as a compiler "flag", and doesn't get munged.

You may wonder why "-Dx -Dy" works at all -- why doesn't this get passed as a single argument to the compiler, and then get rejected for not being a valid argument? Well, for compatibility reasons, CMake stores all the "compiler flags" added this way as a single string, and just appends each new one with a space separator and without attempting any escaping. Then the shell / build tool uses the spaces to tokenise the flags.

Incidentally, if you do want to add actual flags, you should use add_compile_options() instead.

Alex
_______________________________________________
Kde-buildsystem mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/kde-buildsystem

Reply via email to