components/cmake/files/man7/cmake-compile-features.7
author April Chin <april.chin@oracle.com>
Wed, 11 Nov 2015 12:06:59 -0800
changeset 5081 198d4a3e4b73
permissions -rw-r--r--
21834219 update cmake to 3.3.2 22121918 enable system-test target for cmake
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5081
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
     1
.\" Man page generated from reStructuredText.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
     2
.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
     3
.TH "CMAKE-COMPILE-FEATURES" "7" "October 14, 2015" "3.3.2" "CMake"
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
     4
.SH NAME
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
     5
cmake-compile-features \- CMake Compile Features Reference
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
     6
.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
     7
.nr rst2man-indent-level 0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
     8
.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
     9
.de1 rstReportMargin
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    10
\\$1 \\n[an-margin]
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    11
level \\n[rst2man-indent-level]
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    12
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    13
-
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    14
\\n[rst2man-indent0]
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    15
\\n[rst2man-indent1]
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    16
\\n[rst2man-indent2]
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    17
..
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    18
.de1 INDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    19
.\" .rstReportMargin pre:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    20
. RS \\$1
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    21
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    22
. nr rst2man-indent-level +1
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    23
.\" .rstReportMargin post:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    24
..
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    25
.de UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    26
. RE
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    27
.\" indent \\n[an-margin]
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    28
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    29
.nr rst2man-indent-level -1
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    30
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    31
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    32
..
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    33
.SH INTRODUCTION
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    34
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    35
Project source code may depend on, or be conditional on, the availability
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    36
of certain features of the compiler.  There are three use\-cases which arise:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    37
\fI\%Compile Feature Requirements\fP, \fI\%Optional Compile Features\fP
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    38
and \fI\%Conditional Compilation Options\fP\&.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    39
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    40
While features are typically specified in programming language standards,
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    41
CMake provides a primary user interface based on granular handling of
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    42
the features, not the language standard that introduced the feature.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    43
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    44
The \fBCMAKE_C_KNOWN_FEATURES\fP and
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    45
\fBCMAKE_CXX_KNOWN_FEATURES\fP global properties contain all the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    46
features known to CMake, regardless of compiler support for the feature.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    47
The \fBCMAKE_C_COMPILE_FEATURES\fP and
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    48
\fBCMAKE_CXX_COMPILE_FEATURES\fP variables contain all features
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    49
CMake knows are known to the compiler, regardless of language standard
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    50
or compile flags needed to use them.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    51
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    52
Features known to CMake are named mostly following the same convention
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    53
as the Clang feature test macros.  The are some exceptions, such as
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    54
CMake using \fBcxx_final\fP and \fBcxx_override\fP instead of the single
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    55
\fBcxx_override_control\fP used by Clang.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    56
.SH COMPILE FEATURE REQUIREMENTS
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    57
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    58
Compile feature requirements may be specified with the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    59
\fBtarget_compile_features()\fP command.  For example, if a target must
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    60
be compiled with compiler support for the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    61
\fBcxx_constexpr\fP feature:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    62
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    63
.INDENT 3.5
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    64
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    65
.nf
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    66
.ft C
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    67
add_library(mylib requires_constexpr.cpp)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    68
target_compile_features(mylib PRIVATE cxx_constexpr)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    69
.ft P
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    70
.fi
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    71
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    72
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    73
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    74
In processing the requirement for the \fBcxx_constexpr\fP feature,
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    75
\fBcmake(1)\fP will ensure that the in\-use C++ compiler is capable
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    76
of the feature, and will add any necessary flags such as \fB\-std=gnu++11\fP
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    77
to the compile lines of C++ files in the \fBmylib\fP target.  A
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    78
\fBFATAL_ERROR\fP is issued if the compiler is not capable of the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    79
feature.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    80
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    81
The exact compile flags and language standard are deliberately not part
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    82
of the user interface for this use\-case.  CMake will compute the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    83
appropriate compile flags to use by considering the features specified
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    84
for each target.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    85
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    86
Such compile flags are added even if the compiler supports the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    87
particular feature without the flag. For example, the GNU compiler
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    88
supports variadic templates (with a warning) even if \fB\-std=gnu++98\fP is
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    89
used.  CMake adds the \fB\-std=gnu++11\fP flag if \fBcxx_variadic_templates\fP
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    90
is specified as a requirement.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    91
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    92
In the above example, \fBmylib\fP requires \fBcxx_constexpr\fP when it
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    93
is built itself, but consumers of \fBmylib\fP are not required to use a
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    94
compiler which supports \fBcxx_constexpr\fP\&.  If the interface of
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    95
\fBmylib\fP does require the \fBcxx_constexpr\fP feature (or any other
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    96
known feature), that may be specified with the \fBPUBLIC\fP or
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    97
\fBINTERFACE\fP signatures of \fBtarget_compile_features()\fP:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    98
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
    99
.INDENT 3.5
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   100
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   101
.nf
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   102
.ft C
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   103
add_library(mylib requires_constexpr.cpp)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   104
# cxx_constexpr is a usage\-requirement
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   105
target_compile_features(mylib PUBLIC cxx_constexpr)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   106
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   107
# main.cpp will be compiled with \-std=gnu++11 on GNU for cxx_constexpr.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   108
add_executable(myexe main.cpp)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   109
target_link_libraries(myexe mylib)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   110
.ft P
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   111
.fi
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   112
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   113
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   114
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   115
Feature requirements are evaluated transitively by consuming the link
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   116
implementation.  See \fBcmake\-buildsystem(7)\fP for more on
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   117
transitive behavior of build properties and usage requirements.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   118
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   119
Because the \fBCXX_EXTENSIONS\fP target property is \fBON\fP by default,
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   120
CMake uses extended variants of language dialects by default, such as
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   121
\fB\-std=gnu++11\fP instead of \fB\-std=c++11\fP\&.  That target property may be
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   122
set to \fBOFF\fP to use the non\-extended variant of the dialect flag.  Note
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   123
that because most compilers enable extensions by default, this could
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   124
expose cross\-platform bugs in user code or in the headers of third\-party
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   125
dependencies.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   126
.SH OPTIONAL COMPILE FEATURES
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   127
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   128
Compile features may be preferred if available, without creating a hard
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   129
requirement.  For example, a library may provides alternative
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   130
implementations depending on whether the \fBcxx_variadic_templates\fP
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   131
feature is available:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   132
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   133
.INDENT 3.5
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   134
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   135
.nf
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   136
.ft C
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   137
#if Foo_COMPILER_CXX_VARIADIC_TEMPLATES
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   138
template<int I, int... Is>
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   139
struct Interface;
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   140
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   141
template<int I>
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   142
struct Interface<I>
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   143
{
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   144
  static int accumulate()
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   145
  {
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   146
    return I;
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   147
  }
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   148
};
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   149
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   150
template<int I, int... Is>
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   151
struct Interface
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   152
{
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   153
  static int accumulate()
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   154
  {
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   155
    return I + Interface<Is...>::accumulate();
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   156
  }
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   157
};
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   158
#else
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   159
template<int I1, int I2 = 0, int I3 = 0, int I4 = 0>
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   160
struct Interface
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   161
{
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   162
  static int accumulate() { return I1 + I2 + I3 + I4; }
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   163
};
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   164
#endif
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   165
.ft P
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   166
.fi
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   167
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   168
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   169
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   170
Such an interface depends on using the correct preprocessor defines for the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   171
compiler features.  CMake can generate a header file containing such
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   172
defines using the \fBWriteCompilerDetectionHeader\fP module.  The
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   173
module contains the \fBwrite_compiler_detection_header\fP function which
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   174
accepts parameters to control the content of the generated header file:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   175
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   176
.INDENT 3.5
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   177
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   178
.nf
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   179
.ft C
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   180
write_compiler_detection_header(
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   181
  FILE "${CMAKE_CURRENT_BINARY_DIR}/foo_compiler_detection.h"
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   182
  PREFIX Foo
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   183
  COMPILERS GNU
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   184
  FEATURES
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   185
    cxx_variadic_templates
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   186
)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   187
.ft P
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   188
.fi
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   189
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   190
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   191
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   192
Such a header file may be used internally in the source code of a project,
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   193
and it may be installed and used in the interface of library code.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   194
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   195
For each feature listed in \fBFEATURES\fP, a preprocessor definition
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   196
is created in the header file, and defined to either \fB1\fP or \fB0\fP\&.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   197
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   198
Additionally, some features call for additional defines, such as the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   199
\fBcxx_final\fP and \fBcxx_override\fP features. Rather than being used in
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   200
\fB#ifdef\fP code, the \fBfinal\fP keyword is abstracted by a symbol
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   201
which is defined to either \fBfinal\fP, a compiler\-specific equivalent, or
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   202
to empty.  That way, C++ code can be written to unconditionally use the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   203
symbol, and compiler support determines what it is expanded to:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   204
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   205
.INDENT 3.5
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   206
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   207
.nf
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   208
.ft C
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   209
struct Interface {
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   210
  virtual void Execute() = 0;
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   211
};
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   212
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   213
struct Concrete Foo_FINAL {
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   214
  void Execute() Foo_OVERRIDE;
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   215
};
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   216
.ft P
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   217
.fi
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   218
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   219
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   220
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   221
In this case, \fBFoo_FINAL\fP will expand to \fBfinal\fP if the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   222
compiler supports the keyword, or to empty otherwise.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   223
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   224
In this use\-case, the CMake code will wish to enable a particular language
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   225
standard if available from the compiler. The \fBCXX_STANDARD\fP
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   226
target property variable may be set to the desired language standard
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   227
for a particular target, and the \fBCMAKE_CXX_STANDARD\fP may be
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   228
set to influence all following targets:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   229
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   230
.INDENT 3.5
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   231
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   232
.nf
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   233
.ft C
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   234
write_compiler_detection_header(
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   235
  FILE "${CMAKE_CURRENT_BINARY_DIR}/foo_compiler_detection.h"
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   236
  PREFIX Foo
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   237
  COMPILERS GNU
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   238
  FEATURES
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   239
    cxx_final cxx_override
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   240
)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   241
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   242
# Includes foo_compiler_detection.h and uses the Foo_FINAL symbol
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   243
# which will expand to \(aqfinal\(aq if the compiler supports the requested
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   244
# CXX_STANDARD.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   245
add_library(foo foo.cpp)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   246
set_property(TARGET foo PROPERTY CXX_STANDARD 11)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   247
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   248
# Includes foo_compiler_detection.h and uses the Foo_FINAL symbol
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   249
# which will expand to \(aqfinal\(aq if the compiler supports the feature,
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   250
# even though CXX_STANDARD is not set explicitly.  The requirement of
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   251
# cxx_constexpr causes CMake to set CXX_STANDARD internally, which
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   252
# affects the compile flags.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   253
add_library(foo_impl foo_impl.cpp)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   254
target_compile_features(foo_impl PRIVATE cxx_constexpr)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   255
.ft P
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   256
.fi
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   257
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   258
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   259
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   260
The \fBwrite_compiler_detection_header\fP function also creates compatibility
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   261
code for other features which have standard equivalents.  For example, the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   262
\fBcxx_static_assert\fP feature is emulated with a template and abstracted
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   263
via the \fB<PREFIX>_STATIC_ASSERT\fP and \fB<PREFIX>_STATIC_ASSERT_MSG\fP
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   264
function\-macros.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   265
.SH CONDITIONAL COMPILATION OPTIONS
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   266
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   267
Libraries may provide entirely different header files depending on
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   268
requested compiler features.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   269
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   270
For example, a header at \fBwith_variadics/interface.h\fP may contain:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   271
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   272
.INDENT 3.5
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   273
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   274
.nf
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   275
.ft C
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   276
template<int I, int... Is>
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   277
struct Interface;
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   278
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   279
template<int I>
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   280
struct Interface<I>
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   281
{
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   282
  static int accumulate()
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   283
  {
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   284
    return I;
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   285
  }
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   286
};
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   287
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   288
template<int I, int... Is>
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   289
struct Interface
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   290
{
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   291
  static int accumulate()
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   292
  {
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   293
    return I + Interface<Is...>::accumulate();
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   294
  }
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   295
};
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   296
.ft P
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   297
.fi
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   298
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   299
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   300
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   301
while a header at \fBno_variadics/interface.h\fP may contain:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   302
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   303
.INDENT 3.5
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   304
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   305
.nf
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   306
.ft C
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   307
template<int I1, int I2 = 0, int I3 = 0, int I4 = 0>
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   308
struct Interface
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   309
{
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   310
  static int accumulate() { return I1 + I2 + I3 + I4; }
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   311
};
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   312
.ft P
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   313
.fi
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   314
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   315
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   316
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   317
It would be possible to write a abstraction \fBinterface.h\fP header
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   318
containing something like:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   319
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   320
.INDENT 3.5
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   321
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   322
.nf
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   323
.ft C
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   324
#include "foo_compiler_detection.h"
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   325
#if Foo_COMPILER_CXX_VARIADIC_TEMPLATES
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   326
#include "with_variadics/interface.h"
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   327
#else
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   328
#include "no_variadics/interface.h"
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   329
#endif
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   330
.ft P
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   331
.fi
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   332
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   333
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   334
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   335
However this could be unmaintainable if there are many files to
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   336
abstract. What is needed is to use alternative include directories
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   337
depending on the compiler capabilities.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   338
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   339
CMake provides a \fBCOMPILE_FEATURES\fP
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   340
\fBgenerator expression\fP to implement
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   341
such conditions.  This may be used with the build\-property commands such as
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   342
\fBtarget_include_directories()\fP and \fBtarget_link_libraries()\fP
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   343
to set the appropriate \fBbuildsystem\fP
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   344
properties:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   345
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   346
.INDENT 3.5
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   347
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   348
.nf
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   349
.ft C
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   350
add_library(foo INTERFACE)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   351
set(with_variadics ${CMAKE_CURRENT_SOURCE_DIR}/with_variadics)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   352
set(no_variadics ${CMAKE_CURRENT_SOURCE_DIR}/no_variadics)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   353
target_include_directories(foo
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   354
  INTERFACE
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   355
    "$<$<COMPILE_FEATURES:cxx_variadic_templates>:${with_variadics}>"
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   356
    "$<$<NOT:$<COMPILE_FEATURES:cxx_variadic_templates>>:${no_variadics}>"
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   357
  )
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   358
.ft P
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   359
.fi
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   360
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   361
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   362
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   363
Consuming code then simply links to the \fBfoo\fP target as usual and uses
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   364
the feature\-appropriate include directory
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   365
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   366
.INDENT 3.5
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   367
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   368
.nf
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   369
.ft C
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   370
add_executable(consumer_with consumer_with.cpp)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   371
target_link_libraries(consumer_with foo)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   372
set_property(TARGET consumer_with CXX_STANDARD 11)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   373
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   374
add_executable(consumer_no consumer_no.cpp)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   375
target_link_libraries(consumer_no foo)
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   376
.ft P
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   377
.fi
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   378
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   379
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   380
.SH SUPPORTED COMPILERS
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   381
.sp
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   382
CMake is currently aware of the \fBlanguage standards\fP
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   383
and \fBcompile features\fP available from
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   384
the following \fBcompiler ids\fP as of the
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   385
versions specified for each:
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   386
.INDENT 0.0
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   387
.IP \(bu 2
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   388
\fBAppleClang\fP: Apple Clang for Xcode versions 4.4 though 6.2.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   389
.IP \(bu 2
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   390
\fBClang\fP: Clang compiler versions 2.9 through 3.4.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   391
.IP \(bu 2
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   392
\fBGNU\fP: GNU compiler versions 4.4 through 5.0.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   393
.IP \(bu 2
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   394
\fBMSVC\fP: Microsoft Visual Studio versions 2010 through 2015.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   395
.IP \(bu 2
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   396
\fBSunPro\fP: Oracle SolarisStudio version 12.4.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   397
.UNINDENT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   398
.SH COPYRIGHT
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   399
2000-2015 Kitware, Inc.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   400
.\" Generated by docutils manpage writer.
198d4a3e4b73 21834219 update cmake to 3.3.2
April Chin <april.chin@oracle.com>
parents:
diff changeset
   401
.