[CMake] Replacing compiler flags for certain project subdirectories

Yuri Timenkov yuri at timenkov.ru
Thu Mar 31 23:57:06 EDT 2011


Actually there is a way. But you should be careful to track in what scope
particular flags are defined.

If you don't put a lot of stuff into directory scopes you can modify
CMAKE_<LANG>_FLAGS and etc before calling to add_library/add_executable
call. You can even completely replace them. As I understand calling set()
command takes preference over cached variable and its value is restored when
CMake leaves directory (if I'm right).

For example, we have a "treat warnings as errors" policy for 100+ projects,
so we have /WX option in CMAKE_CXX_FLAGS. But for some legacy projects which
we don't want to touch we use:
# Don't treat warnings as errors.
string(REPLACE "/WX" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})

As I said, you should be aware of the place where particular flag comes
from. If you use directory-scope or source-file scope (or whatever)
properties, you should modify them instead.

On Wed, Mar 30, 2011 at 10:00 PM, Whitcomb, Mr. Tim <
Tim.Whitcomb at nrlmry.navy.mil> wrote:

> Shortening to reduce wall-of-text:
>
> I have a Fortran project with a top-level CMakeLists.txt file with 47
> add_subdirectory calls.  Three of the subdirectories require a different set
> of preprocessor definitions and compiler flags than the other 47.  I can add
> the preprocessor definitions, but am having trouble with the compiler flags.
>  I need to have a completely different set in those subdirectories, so
> COMPILE_FLAGS target property won't work as it augments what's already
> there.
>
> How can I replace (not extend) the compiler flags for these few
> subdirectories?
>
> Tim
>
> > -----Original Message-----
> > From: cmake-bounces at cmake.org
> > [mailto:cmake-bounces at cmake.org] On Behalf Of Whitcomb, Mr. Tim
> > Sent: Friday, March 25, 2011 3:18 PM
> > To: 'cmake at cmake.org'
> > Subject: [CMake] Replacing compiler flags for certain project
> > subdirectories
> >
> > I'm in the process of adding Cmake-build capability to a
> > Fortran project that currently follows a traditional
> > recursive-make build structure.  I've converted all the
> > makefiles to CMakeLists.txt files and can now produce all the
> > target libraries and executables with their dependencies
> > correctly recognized.  These dependencies have made a huge
> > difference in allowing us to perform parallel builds and have
> > the project ready to go *much* faster than before.  I have a
> > top-level CMakeLists.txt file that contains a few library
> > searches (e.g. LAPACK, BLAS) and then an add_subdirectory
> > call for each subdirectory in the project.  Each subdirectory
> > corresponds to a library and/or an executable.
> >
> > Now that the listing files contain all the sources files they
> > need, my current task is to go through and set the proper
> > compiler/preprocessor flags to match the original makefiles.
> > We have several directories in our source tree that are
> > auxiliary libraries that we store in our Subversion
> > repository and build as part of our regular build process.
> > The libraries that are built in these directories are
> > compiled with different compiler flags and different
> > preprocessor definitions than the rest of the project.  I've
> > been able to handle the preprocessor definitions by using
> > add_definitions in the CMakeLists.txt files in the
> > lower-level directories.  I see based on reading through some
> > past threads (including the recent "Different CMAKE_CXX_FLAGS
> > for different executables") on this list and on some
> > StackOverflow questions that the COMPILE_FLAGS target
> > property is very close to what I need (and actually *was*
> > what I needed in several cases) but only appends flags to
> > those currently  in use.  What I need is to be able to define
> > a new set of compile flags (i.e. "forget everything you were
> > using before and use THIS set in this directory").
> >
> > I've started going through the documentation for Building
> > External Projects[*] but the first line states that "[a]n
> > "external project" is one that you can get the source code
> > for, but does not readily build with a simple
> > ADD_SUBDIRECTORY call in your CMakeLists.txt file."  This
> > feels like it's designed to solve a slightly different
> > problem than what I'm trying to do - I have an
> > add_subdirectory call in my CMakeLists.txt file - is the
> > proper fix for this issue to make the pieces that require
> > different flags external projects?  Will making some of these
> > libraries external projects mess with the dependency calculation?
> >
> > I'm just getting started and trying to wrap my head around
> > the options available.  What is the standard way of dealing
> > with this issue?  Is there anything I'm missing?  Thank you
> > for your assistance!
> >
> > Tim
> > [w]
> >
> > [*]
> > http://www.kitware.com/products/html/BuildingExternalProjectsW
> > ithCMake2.8.html
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20110401/48bca9d5/attachment-0001.htm>


More information about the CMake mailing list