author | April Chin <april.chin@oracle.com> |
Wed, 11 Nov 2015 12:06:59 -0800 | |
changeset 5081 | 198d4a3e4b73 |
permissions | -rw-r--r-- |
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 |
. |