summaryrefslogtreecommitdiffstats
path: root/Help/guide/tutorial/index.rst
diff options
context:
space:
mode:
authorRobert Maynard <robert.maynard@kitware.com>2019-07-18 17:48:58 (GMT)
committerBrad King <brad.king@kitware.com>2019-07-25 11:30:13 (GMT)
commitfa203ee32375d1e1f92a5be0155b02ca46ab8ead (patch)
tree7eb76397e02397bb80e50f9337578918950c633f /Help/guide/tutorial/index.rst
parenta1c6d7e9af5a241b1afa29b3f7459ee9ee4ec77a (diff)
downloadCMake-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.rst50
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)
=====================================