[CMake] CMAKE_BUILD_TYPE and exact control of compiler options

Andreas Pakulat apaku at gmx.de
Mon Oct 12 08:18:54 EDT 2015


Hi,

On Mon, Oct 12, 2015 at 10:39 AM, René J. V. <rjvbertin at gmail.com> wrote:

> Hello,
>
> I'm using cmake in conjunction with a packaging/distribution system that
> aims to
> control the compiler and linker flags, a priori via the usual environment
> variables. (We're talking about MacPorts.)
>
> Using one of the CMAKE_BUILD_TYPE presets, the value of those env.
> variables
> appears at most to be added in front of the preset options, which means
> user
> options can be overridden. That may be intended behaviour, but not ideal
> for my
> use case.
>
> Working with Debian and Ubuntu systems, I deduced that using a
> non-pre-defined
> BUILD_TYPE make cmake use the values of CFLAGS, CXXFLAGS etc, through
> CMAKE_C_FLAGS, CMAKE_CXX_FLAGS etc (instead of CMAKE_C*_FLAGS_RELEASE, for
> instance).
>
> Experimenting with -DCMAKE_BUILD_TYPE=MacPorts in the toplevel control file
> (cmake PortGroup), that appeared indeed to work, but I appear to have been
> mistaken. Adding -DCMAKE_C*_FLAGS_MACPORTS definitions has no effect, nor
> has
> setting CMAKE_C*_FLAGS from the CMake command line.
>
> Which leads me to the following questions:
> - Is it indeed possible to get CMake to take all compiler and linker flags
> from
> the environment, and if so, how?

- If not, what is the best/official way to get exact control over the
> compiler
> and linker options used?


No this is not possible in general. A CMakeLists.txt file can always just
set their own compiler/linker flags.

However if I understand you correctly (in what kind of flags you want to
change), then this could be doable with a toolchain file. These are usually
used to teach CMake specialities about compilers/linkers that it does not
support itself and behave sufficiently different from one it does know.
That is for example gcc builds for doing cross-compilation to some
specialized hardware may not work with certain flags CMake uses by default
for gcc builds.

The toolchain files are just cmake scripts, you can see some examples in
the Modules/Platform directory of your cmake install. They set certain
special variables that CMake will read out again when creating
compiler/linker commandlines. The variables are explained in the
documentation of CMake IIRC.


> - Out of curiosity, what's special about the CMAKE_BUILD_TYPE=Debian build
> type?
>

There's no such build type in CMake, see the Compilers and Tools section
here: https://cmake.org/Wiki/CMake_Useful_Variables#Various_Options that
details the built-in types in CMake.

Andreas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20151012/4390dd8d/attachment-0001.html>


More information about the CMake mailing list