Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F1494478
HandleROSAOptions.cmake
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Size
7 KB
Referenced Files
None
Subscribers
None
HandleROSAOptions.cmake
View Options
# This CMake module is responsible for interpreting the user defined ROSA_
# options and executing the appropriate CMake commands to realize the users'
# selections.
include
(
CheckCCompilerFlag
)
include
(
CheckCXXCompilerFlag
)
if
(
"${CMAKE_CXX_COMPILER_ID}"
MATCHES
"Clang"
)
set
(
ROSA_COMPILER_IS_CLANG
ON
)
# Enforce minimum version.
if
(
CMAKE_CXX_COMPILER_VERSION
VERSION_LESS
"3.9.0"
)
message
(
FATAL_ERROR
"Insufficient LLVM version"
)
endif
()
else
()
set
(
ROSA_COMPILER_IS_CLANG
OFF
)
endif
()
if
(
CMAKE_COMPILER_IS_GNUCXX
)
set
(
ROSA_COMPILER_IS_GCC_COMPATIBLE
ON
)
elseif
(
MSVC
)
set
(
ROSA_COMPILER_IS_GCC_COMPATIBLE
OFF
)
elseif
(
ROSA_COMPILER_IS_CLANG
)
set
(
ROSA_COMPILER_IS_GCC_COMPATIBLE
ON
)
else
()
message
(
FATAL_ERROR
"Unexpected C++ compiler!"
)
endif
()
function
(
append
value
)
foreach
(
variable
${
ARGN
}
)
set
(
${
variable
}
"${${variable}} ${value}"
PARENT_SCOPE
)
endforeach
(
variable
)
endfunction
()
function
(
append_if
condition
value
)
if
(
${
condition
}
)
foreach
(
variable
${
ARGN
}
)
set
(
${
variable
}
"${${variable}} ${value}"
PARENT_SCOPE
)
endforeach
(
variable
)
endif
()
endfunction
()
# NDEBUG on non-Debug builds
append
(
"-DNDEBUG"
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_C_FLAGS_MINSIZEREL
)
# Assertions are always enabled on Debug builds, this is interesting for
# non-Debug builds.
if
(
NOT
"${uppercase_CMAKE_BUILD_TYPE}"
STREQUAL
"DEBUG"
AND
${
ROSA_ENABLE_ASSERTIONS
}
)
# MSVC doesn't like _DEBUG on release builds. See PR 4379.
if
(
NOT
MSVC
)
add_definitions
(
-D_DEBUG
)
set
(
ENABLE_ASSERTIONS
"1"
)
else
()
set
(
ENABLE_ASSERTIONS
"0"
)
endif
()
# On non-Debug builds we NDEBUG, but in this case we need to undefine it:
add_definitions
(
-UNDEBUG
)
# Also remove /D NDEBUG to avoid MSVC warnings about conflicting defines.
foreach
(
flags_var_to_scrub
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_C_FLAGS_MINSIZEREL
)
string
(
REGEX
REPLACE
"(^| )[/-]D *NDEBUG($| )"
" "
"${flags_var_to_scrub}"
"${${flags_var_to_scrub}}"
)
endforeach
()
endif
()
set
(
ROSA_ENABLE_ASSERTIONS_INT
-1
)
if
(
"${uppercase_CMAKE_BUILD_TYPE}"
STREQUAL
"DEBUG"
OR
${
ROSA_ENABLE_ASSERTIONS
}
)
set
(
ROSA_ENABLE_ASSERTIONS_INT
1
)
endif
()
if
(
ROSA_COMPILER_IS_GCC_COMPATIBLE
)
append
(
"-Wall -Wextra -Wdocumentation -Werror"
CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
)
append_if
(
ROSA_ENABLE_PEDANTIC
"-pedantic -Wno-long-long"
CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
)
append
(
"-fno-rtti -fno-exceptions"
CMAKE_CXX_FLAGS
)
append
(
"-Wno-c++1z-compat"
CMAKE_CXX_FLAGS
)
check_cxx_compiler_flag
(
"-std=c++17"
CXX_SUPPORTS_CXX17
)
if
(
CXX_SUPPORTS_CXX17
)
append
(
"-std=c++17"
CMAKE_CXX_FLAGS
)
else
()
message
(
FATAL_ERROR
"RoSA requires C++17 support but the '-std=c++17' flag isn't supported."
)
endif
()
check_c_compiler_flag
(
"-std=c11"
C_SUPPORTS_C11
)
if
(
C_SUPPORTS_C11
)
append
(
"-std=c11"
CMAKE_C_FLAGS
)
else
()
message
(
FATAL_ERROR
"RoSA requires C11 support but the '-std=c11' flag isn't supported."
)
endif
()
elseif
(
MSVC
)
if
(
ROSA_COMPILER_IS_CLANG
)
# Remove/adjsut incorrect flags that might be generated automatically.
foreach
(
flags_var_to_scrub
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_C_FLAGS_MINSIZEREL
)
string
(
REGEX
REPLACE
"(^| )-Wall($| )"
" "
"${flags_var_to_scrub}"
"${${flags_var_to_scrub}}"
)
string
(
REGEX
REPLACE
"(^| )-frtti($| )"
" "
"${flags_var_to_scrub}"
"${${flags_var_to_scrub}}"
)
string
(
REGEX
REPLACE
"(^| )-fexceptions($| )"
" "
"${flags_var_to_scrub}"
"${${flags_var_to_scrub}}"
)
string
(
REGEX
REPLACE
"(^| )-fno-inline($| )"
" -Ob0 "
"${flags_var_to_scrub}"
"${${flags_var_to_scrub}}"
)
string
(
REGEX
REPLACE
"(^| )-gline-tables-only($| )"
" "
"${flags_var_to_scrub}"
"${${flags_var_to_scrub}}"
)
message
(
"${flags_var_to_scrub}: ${${flags_var_to_scrub}}"
)
endforeach
()
endif
()
# Flags matching GCC-compatible "-Wall -Wextra -Werror".
# NOTE: Do not use -Wall for MSVC because it generates silly warning (e.g.,
# warnings about things in external libraries), use -W4 instead.
append
(
"/W4 /WX"
CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
)
if
(
ROSA_COMPILER_IS_CLANG
)
# GCC-compatible flags without corresponding MSVC options.
append
(
"-Wdocumentation"
CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
)
# The flag "-pedantic" is not in the MSVC flavour.
append_if
(
ROSA_ENABLE_PEDANTIC
"-Wno-long-long"
CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
)
endif
()
# Flags matching GCC-compatible "-fno-rtti".
append
(
"/GR-"
CMAKE_CXX_FLAGS
)
# NOTE: We cannot disable unwind semantics (i.e., -fno-exceptions) for Windows
# libraries...
append
(
"/EHsc"
CMAKE_CXX_FLAGS
)
if
(
ROSA_COMPILER_IS_CLANG
)
append
(
"-Wno-c++1z-compat"
CMAKE_CXX_FLAGS
)
# MSVC puts there some garbage which needs to be ignored...
append
(
"-Qunused-arguments"
CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
)
endif
()
if
(
ROSA_COMPILER_IS_CLANG
)
check_cxx_compiler_flag
(
"-Xclang -std=c++17"
CXX_SUPPORTS_CXX17
)
if
(
CXX_SUPPORTS_CXX17
)
append
(
"-Xclang -std=c++17"
CMAKE_CXX_FLAGS
)
else
()
message
(
FATAL_ERROR
"RoSA requires C++17 support but the '-std=c++17' flag isn't supported."
)
endif
()
check_c_compiler_flag
(
"-Xclang -std=c11"
C_SUPPORTS_C11
)
if
(
C_SUPPORTS_C11
)
append
(
"-Xclang -std=c11"
CMAKE_C_FLAGS
)
else
()
message
(
FATAL_ERROR
"RoSA requires C11 support but the '-std=c11' flag isn't supported."
)
endif
()
else
()
check_cxx_compiler_flag
(
"/std:c++17 /permissive-"
CXX_SUPPORTS_CXX17
)
if
(
CXX_SUPPORTS_CXX17
)
append
(
"/std:c++17 /permissive-"
CMAKE_CXX_FLAGS
)
else
()
message
(
FATAL_ERROR
"RoSA requires C++17 support but the '/std:c++17 /permissive-' flags aren't supported."
)
endif
()
message
(
WARNING
"RoSA is supposed to use C11 code in C files, which MSVC might not fully support."
)
# Make MSVC ignore warning C4514 about unreferenced inline functions.
append
(
"/nowarn:4514"
)
# Make MSVC ignore warning LNK4221 in libraries. The warning is caused by
# empty object files that correspond to the empty .cpp files, which we have
# for generating compile database entries for all header files.
append
(
"/IGNORE:4221"
CMAKE_STATIC_LINKER_FLAGS
)
endif
()
endif
()
if
(
ROSA_ENABLE_CLANG_TIDY
)
# Set clang-tidy arguments, use the same for both C and CXX.
set
(
CMAKE_C_CLANG_TIDY
"${CLANGTIDY_EXECUTABLE};-header-filter=.*"
)
set
(
CMAKE_CXX_CLANG_TIDY
${
CMAKE_C_CLANG_TIDY
}
)
# Apply suggested fixes if requested.
append_if
(
ROSA_CLANG_TIDY_FIX
",-fix"
CMAKE_C_CLANG_TIDY
CMAKE_CXX_CLANG_TIDY
)
endif
(
ROSA_ENABLE_CLANG_TIDY
)
if
(
ROSA_INCLUDE_APPS
STREQUAL
""
)
message
(
STATUS
"Include all apps by default."
)
SUBDIRLIST
(
ROSA_INCLUDE_APPS
${
ROSA_MAIN_SRC_DIR
}
/apps
)
else
()
message
(
STATUS
"Include apps: ${ROSA_INCLUDE_APPS}."
)
endif
()
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Mar 1, 6:45 PM (1 d, 2 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
286759
Default Alt Text
HandleROSAOptions.cmake (7 KB)
Attached To
Mode
R20 SoC_Rosa_repo
Attached
Detach File
Event Timeline
Log In to Comment