-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcompiler_flags.cmake
More file actions
269 lines (242 loc) · 8.6 KB
/
compiler_flags.cmake
File metadata and controls
269 lines (242 loc) · 8.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
################################################################################
# Copyright (c) 2018 David D. Marshall <ddmarsha@calpoly.edu>
#
# This program and the accompanying materials are made
# available under the terms of the Eclipse Public License 2.0
# which is available at https://www.eclipse.org/legal/epl-2.0/
#
# See LICENSE.md file in the project root for full license information.
#
# SPDX-License-Identifier: EPL-2.0
#
# Contributors:
# David D. Marshall - initial code and implementation
################################################################################
#
# - Prints out name and value of variable name passed in
#
# This function simplifies the displaying of variables, which is useful
# during debugging.
# * var_ - the name of the variable to be displayed
#
################################################################################
#
# determine the location of this file
#
set(_this_dir "${CMAKE_CURRENT_LIST_DIR}")
################################################################################
#
# C++ Settings
#
################################################################################
include(${_this_dir}/internal/enable_cxx_language_version.cmake)
include(${_this_dir}/internal/enable_cxx_pedantic.cmake)
include(${_this_dir}/internal/enable_cxx_warning_level.cmake)
#
# Allow compiler to assume the strictest aliasing rules apply
#
function(ENABLE_CXX_COMPILER_STRICT_ALIASING flag_name_)
set(${flag_name_} "NOT_FOUND" PARENT_SCOPE)
# g++, clang++
set(flag_ "-fstrict-aliasing")
check_cxx_compiler_flag(${flag_} COMPILER_SUPPORT_CXX_STRICT_ALIASING)
if(COMPILER_SUPPORT_CXX_STRICT_ALIASING)
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
endfunction()
#
# Set the recursion depth for evaluation of constexpr.
# requires c++11: gcc default 512
#
function(ENABLE_CXX_COMPILER_CONSTEXPR_DEPTH flag_name_ depth_)
set(${flag_name_} "NOT_FOUND" PARENT_SCOPE)
# g++, clang++
if ((depth_ MATCHES "^[1-9][0-9]+$") AND (depth_ GREATER 2))
set(flag_ "-fconstexpr-depth=${depth_}")
check_cxx_compiler_flag(${flag_} COMPILER_SUPPORT_CXX_CONSTEXPR_DEPTH)
if(COMPILER_SUPPORT_CXX_CONSTEXPR_DEPTH)
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
else()
message(FATAL_ERROR "Invalid constexpr depth of ${depth_}")
endif()
endfunction()
#
# Set the maximum on number of iterations on a loop for constexpr.
# requires c++14: gcc default 262144
#
function(ENABLE_CXX_COMPILER_CONSTEXPR_LOOP_LIMIT flag_name_ depth_)
set(${flag_name_} "NOT_FOUND" PARENT_SCOPE)
# g++, clang++
if ((depth_ MATCHES "^[1-9][0-9]+$") AND (depth_ GREATER 2))
set(flag_ "-fconstexpr-loop-limit=${depth_}")
check_cxx_compiler_flag(${flag_} COMPILER_SUPPORT_CXX_CONSTEXPR_LOOP_LIMIT)
if(COMPILER_SUPPORT_CXX_CONSTEXPR_LOOP_LIMIT)
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
else()
message(FATAL_ERROR "Invalid constexpr loop limit of ${depth_}")
endif()
endfunction()
#
# Set the message length for compiler
#
function(ENABLE_CXX_COMPILER_MESSAGE_LENGTH flag_name_ length_)
set(${flag_name_} "NOT_FOUND" PARENT_SCOPE)
# g++, clang++
if (length_ MATCHES "^[0-9]+$")
set(flag_ "-fmessage-length=${length_}")
check_cxx_compiler_flag(${flag_}
COMPILER_SUPPORT_CXX_MESSAGE_LENGTH${length_})
if(COMPILER_SUPPORT_CXX_MESSAGE_LENGTH${length_})
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
else()
message(FATAL_ERROR "Invalid message length of ${length_}")
endif()
endfunction()
################################################################################
#
# C Settings
#
################################################################################
include(${_this_dir}/internal/enable_c_language_version.cmake)
include(${_this_dir}/internal/enable_c_pedantic.cmake)
include(${_this_dir}/internal/enable_c_warning_level.cmake)
#
# Allow compiler to assume the strictest aliasing rules apply
#
function(ENABLE_C_COMPILER_STRICT_ALIASING flag_name_)
set(${flag_name_} "NOT_FOUND" PARENT_SCOPE)
# gcc, clang
set(flag_ "-fstrict-aliasing")
check_c_compiler_flag(${flag_} COMPILER_SUPPORT_C_STRICT_ALIASING)
if(COMPILER_SUPPORT_C_STRICT_ALIASING)
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
endfunction()
#
# Set the message length for compiler
#
function(ENABLE_C_COMPILER_MESSAGE_LENGTH flag_name_ length_)
set(${flag_name_} "NOT_FOUND" PARENT_SCOPE)
# gcc, clang
if (length_ MATCHES "^[0-9]+$")
set(flag_ "-fmessage-length=${length_}")
check_c_compiler_flag(${flag_}
COMPILER_SUPPORT_C_MESSAGE_LENGTH${length_})
if(COMPILER_SUPPORT_C_MESSAGE_LENGTH${length_})
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
else()
message(FATAL_ERROR "Invalid message length of ${length_}")
endif()
endfunction()
################################################################################
#
# Fortran Settings
#
################################################################################
include(${_this_dir}/internal/enable_fortran_language_version.cmake)
include(${_this_dir}/internal/enable_fortran_pedantic.cmake)
include(${_this_dir}/internal/enable_fortran_warning_level.cmake)
#
# Allow no implicit typing
#
function(ENABLE_FORTRAN_COMPILER_IMPLICIT_NONE flag_name_)
set(${flag_name_} "NOT_FOUND" PARENT_SCOPE)
# gfortran
set(flag_ "-fimplicit-none")
check_fortran_compiler_flag(${flag_} COMPILER_SUPPORT_FORTRAN_IMPLICIT_NONE)
if(COMPILER_SUPPORT_FORTRAN_IMPLICIT_NONE)
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
endfunction()
#
# Set the integer size to passed in value
#
function(ENABLE_FORTRAN_COMPILER_INTEGER_SIZE flag_name_ integer_size_)
set(${flag_name_} "NOT_FOUND" PARENT_SCOPE)
# gfortran
if (integer_size_ EQUAL 4)
set(${flag_name_} "" PARENT_SCOPE)
elseif(integer_size_ EQUAL 8)
set(flag_ "-fdefault-integer-8")
check_fortran_compiler_flag(${flag_}
COMPILER_SUPPORT_FORTRAN_INTEGER_SIZE_${integer_size_})
if(COMPILER_SUPPORT_FORTRAN_INTEGER_SIZE_${integer_size_})
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
else()
message(FATAL_ERROR "Invalid integer size of ${integer_size_}")
endif()
endfunction()
#
# Set the real size to passed in value
#
function(ENABLE_FORTRAN_COMPILER_REAL_SIZE flag_name_ real_size_)
set(${flag_name_} "NOT_FOUND" PARENT_SCOPE)
# gfortran
if (real_size_ EQUAL 4)
set(${flag_name_} "" PARENT_SCOPE)
elseif(real_size_ EQUAL 8)
set(flag_ "-fdefault-real-8")
check_fortran_compiler_flag(${flag_}
COMPILER_SUPPORT_FORTRAN_REAL_SIZE_${real_size_})
if(COMPILER_SUPPORT_FORTRAN_REAL_SIZE_${real_size_})
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
elseif(real_size_ EQUAL 10)
set(flag_ "-fdefault-real-10")
check_fortran_compiler_flag(${flag_}
COMPILER_SUPPORT_FORTRAN_REAL_SIZE_${real_size_})
if(COMPILER_SUPPORT_FORTRAN_REAL_SIZE_${real_size_})
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
elseif(real_size_ EQUAL 16)
set(flag_ "-fdefault-real-16")
check_fortran_compiler_flag(${flag_}
COMPILER_SUPPORT_FORTRAN_REAL_SIZE_${real_size_})
if(COMPILER_SUPPORT_FORTRAN_REAL_SIZE_${real_size_})
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
else()
message(FATAL_ERROR "Invalid real size of ${real_size_}")
endif()
endfunction()
#
# Set the double size to passed in value
#
function(ENABLE_FORTRAN_COMPILER_DOUBLE_SIZE flag_name_ double_size_)
set(${flag_name_} "NOT_FOUND" PARENT_SCOPE)
# gfortran
if (double_size_ EQUAL 8)
set(${flag_name_} "" PARENT_SCOPE)
elseif(double_size_ EQUAL 16)
set(flag_ "-fdefault-double-16")
check_fortran_compiler_flag(${flag_}
COMPILER_SUPPORT_FORTRAN_DOUBLE_SIZE_${double_size_})
if(COMPILER_SUPPORT_FORTRAN_DOUBLE_SIZE_${double_size_})
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
else()
message(FATAL_ERROR "Invalid double size of ${double_size_}")
endif()
endfunction()
#
# Set the message length for compiler
#
function(ENABLE_FORTRAN_COMPILER_MESSAGE_LENGTH flag_name_ length_)
set(${flag_name_} "NOT_FOUND" PARENT_SCOPE)
# gfortran
if (length_ MATCHES "^[0-9]+$")
set(flag_ "-fmessage-length=${length_}")
check_fortran_compiler_flag(${flag_}
COMPILER_SUPPORT_FORTRAN_MESSAGE_LENGTH${length_})
if(COMPILER_SUPPORT_FORTRAN_MESSAGE_LENGTH${length_})
set(${flag_name_} ${flag_} PARENT_SCOPE)
endif()
else()
message(FATAL_ERROR "Invalid message length of ${length_}")
endif()
endfunction()