diff options
author | Robert Maynard <robert.maynard@kitware.com> | 2019-07-18 17:48:58 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2019-07-25 11:30:13 (GMT) |
commit | fa203ee32375d1e1f92a5be0155b02ca46ab8ead (patch) | |
tree | 7eb76397e02397bb80e50f9337578918950c633f /Help/guide/tutorial/index.rst | |
parent | a1c6d7e9af5a241b1afa29b3f7459ee9ee4ec77a (diff) | |
download | CMake-fa203ee32375d1e1f92a5be0155b02ca46ab8ead.zip CMake-fa203ee32375d1e1f92a5be0155b02ca46ab8ead.tar.gz CMake-fa203ee32375d1e1f92a5be0155b02ca46ab8ead.tar.bz2 |
Tutorial: Improve Step 10 generator expression example.
Use compiler flags and standard levels as the compelling argument
for using generator expressions and interface libraries
Diffstat (limited to 'Help/guide/tutorial/index.rst')
-rw-r--r-- | Help/guide/tutorial/index.rst | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/Help/guide/tutorial/index.rst b/Help/guide/tutorial/index.rst index 41ed0c4..068499e 100644 --- a/Help/guide/tutorial/index.rst +++ b/Help/guide/tutorial/index.rst @@ -598,27 +598,47 @@ expressions are the 0 and 1 expressions. A ``$<0:...>`` results in the empty string, and ``<1:...>`` results in the content of "...". They can also be nested. -For example: +A common usage of generator expressions is to conditionally add compiler +flags, such as those as language levels or warnings. A nice pattern is +to associate this information to an ``INTERFACE`` target allowing this +information to propagate. Lets start by constructing an ``INTERFACE`` +target and specifying the required C++ standard level of ``11`` instead +of using ``CMAKE_CXX_STANDARD``. -.. code-block:: cmake +So the following code: + +.. literalinclude:: Step10/CMakeLists.txt + :language: cmake + :start-after: project(Tutorial) + :end-before: # Set the version number - if(HAVE_LOG AND HAVE_EXP) - target_compile_definitions(SqrtLibrary - PRIVATE "HAVE_LOG" "HAVE_EXP") - endif() +Would be replaced with: -Can be rewritten with generator expressions: +.. literalinclude:: Step11/CMakeLists.txt + :language: cmake + :start-after: project(Tutorial) + :end-before: # add compiler warning flags just when building this project via + + +Next we add the desired compiler warning flags that we want for our +project. As warning flags vary based on the compiler we use +the ``COMPILE_LANG_AND_ID`` generator expression to control which +flags to apply given a language and a set of compiler ids as seen +below: + +.. literalinclude:: Step11/CMakeLists.txt + :language: cmake + :start-after: # the BUILD_INTERFACE genex + :end-before: # set the version number + +Looking at this we see that the warning flags are encapsulated inside a +``BUILD_INTERFACE`` condition. This is done so that consumers of our installed +project will not inherit our warning flags. -.. code-block:: cmake - target_compile_definitions(SqrtLibrary PRIVATE - "$<$<BOOL:${HAVE_LOG}>:HAVE_LOG>" - "$<$<BOOL:${HAVE_EXP}>:HAVE_EXP>" - ) +**Exercise**: Modify ``MathFunctions/CMakeLists.txt`` so that +all targets have a ``target_link_libraries()`` call to ``tutorial_compiler_flags``. -Note that ``${HAVE_LOG}`` is evaluated at CMake configure time while -``$<$<BOOL:${HAVE_LOG}>:HAVE_LOG>`` is evaluated at build system generation -time. Adding Export Configuration (Step 11) ===================================== |