[CMake] Where do all the extra clang flags come from in Xcode?

Ruslan Baratov ruslan_baratov at yahoo.com
Mon May 18 06:32:52 EDT 2015


On 18-May-15 06:50, Paul Smith wrote:
> On Sun, 2015-05-17 at 14:43 +0200, Ruslan Baratov via CMake wrote:
>> As far as I know extra flags set by Xcode itself. You can use
>> XCODE_ATTRIBUTE_* target properties to enable/disable warnings. This
>> table can be helpful:
>> https://github.com/ruslo/leathers/wiki/List#xcodeclang-table
> Thanks for your reply... but I don't quite understand what this table is
> telling me.
This table tells you what attribute you need to set to disable/enable 
specific warning.
E.g.:

    | Clang           | Xcode                      |

    +-----------------+----------------------------+

    | enum-conversion | CLANG_WARN_ENUM_CONVERSION |


Makefile generator:

     > cat CMakeLists.txt
    cmake_minimum_required(VERSION 3.0)
    project(Foo)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wenum-conversion")
    add_library(foo foo.cpp)

     > cmake -H. -B_builds "-GUnix Makefiles" -DCMAKE_VERBOSE_MAKEFILE=ON
     > cmake --build _builds
    /.../usr/bin/c++ -Wenum-conversion ...


Xcode generator (default):

     > cat CMakeLists.txt
    cmake_minimum_required(VERSION 3.0)
    project(Foo)
    add_library(foo foo.cpp)

     > cmake -H. -B_builds -GXcode
     > cmake --build _builds
    /.../usr/bin/clang ... -Wno-enum-conversion ...

Xcode generator (enable):

     > cat CMakeLists.txt
    cmake_minimum_required(VERSION 3.0)
    project(Foo)
    add_library(foo foo.cpp)

    set_target_properties(
         foo
         PROPERTIES
         XCODE_ATTRIBUTE_CLANG_WARN_ENUM_CONVERSION YES
    )

     > cmake -H. -B_builds -GXcode
     > cmake --build _builds
    /.../usr/bin/clang ... -Wenum-conversion ...

Xcode generator (disable):

     > cat CMakeLists.txt
    cmake_minimum_required(VERSION 3.0)
    project(Foo)
    add_library(foo foo.cpp)

    set_target_properties(
         foo
         PROPERTIES
         XCODE_ATTRIBUTE_CLANG_WARN_ENUM_CONVERSION NO
    )

     > cmake -H. -B_builds -GXcode
     > cmake --build _builds
    /.../usr/bin/clang ... -Wno-enum-conversion ...

>
> As mentioned, these builds are performed on build servers running OSX,
> where basically the code is retrieved via Git, then cmake is run, then
> cmake -build is run (which invokes xcodebuild via the command line), all
> using SSH commands from a build control server.  At no time is Xcode
> itself invoked.
I don't understand what you mean by "no time is Xcode itself invoked". 
When you set generator to "Unix Makefiles" then Makefile project generated:
 > cmake -H. -B_builds "-GUnix Makefiles"
 > ls _builds/Makefile
_builds/Makefile

when you set generator to "Xcode" then Xcode project used:
 > cmake -H. -B_builds -GXcode
 > ls _builds/Foo.xcodeproj/project.pbxproj
_builds/Foo.xcodeproj/project.pbxproj

so there is no difference between:
* open Xcode project and hit "Build"
* cmake --build _builds
* (cd _builds && xcodebuild -alltargets)
>
> So, if the properties you describe are Xcode settings that need to be
> tweaked then do you know if there is some command-line way to do it,
> that I could encode into my build scripts for example?
See example above.

Also you can use some helper functions to do it in cross-platform way:

    sugar_generate_warning_flags(
         target_compile_options
         target_properties
         ENABLE enum-conversion
    )

    set_target_properties(
         foo
         PROPERTIES
         ${target_properties}
         COMPILE_OPTIONS
         "${target_compile_options}"
    )

This will set MSVC flags too. See this wiki: 
https://github.com/ruslo/sugar/wiki/Cross-platform-warning-suppression

Cheers, Ruslo
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20150518/7bb6e5b3/attachment-0001.html>


More information about the CMake mailing list