44# SPDX-License-Identifier: MIT
55# ==========================================================================
66
7+ # Intel® Query Processing Library (Intel® QPL)
8+
9+ # Build system
10+
711include_guard (GLOBAL )
812
13+ set (QPL_LANGUAGES C CXX)
14+ set (QPL_DEFAULT_C_STANDARD 17)
15+ set (QPL_DEFAULT_CXX_STANDARD 17)
16+
17+ # Sets the language standard of the given language ${language} for the given target ${target_name} to the given version ${version}.
18+ function (qpl_set_language_standard target_name language version )
19+ if (NOT language IN_LIST QPL_LANGUAGES)
20+ message (
21+ FATAL_ERROR
22+ "Intel(R) QPL: Unsupported language '${language} ' specified for target '${target_name} '. Supported languages are: ${QPL_LANGUAGES} ." )
23+ endif ()
24+ if (language STREQUAL "C" )
25+ set (language_prefix "c" )
26+ elseif (language STREQUAL "CXX" )
27+ set (language_prefix "c++" )
28+ endif ()
29+ set (language_standard "${language_prefix}${version} " )
30+ # Set the language standard using `<LANG>_STANDARD` target property if it is supported by CMake (otherwise, use the compile option
31+ # `-std=<standard>`)
32+ set (language_version_is_supported_by_cmake FALSE )
33+ if (language STREQUAL "C" )
34+ # https://cmake.org/cmake/help/latest/prop_tgt/C_STANDARD.html
35+ if (((version GREATER_EQUAL 90 OR version VERSION_LESS 17) AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.1" )
36+ OR (version VERSION_LESS_EQUAL 23 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.21" ))
37+ set (language_version_is_supported_by_cmake TRUE )
38+ endif ()
39+ if (version VERSION_GREATER 23 AND version VERSION_LESS 90)
40+ message (
41+ FATAL_ERROR
42+ "Intel(R) QPL: C standard version '${version} ' is not supported by Intel(R) QPL build system. Please, fix this CMake file to add support for this version."
43+ )
44+ endif ()
45+ elseif (language STREQUAL "CXX" )
46+ # https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html
47+ if (((version GREATER_EQUAL 98 OR version VERSION_LESS 17) AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.1" )
48+ OR (version VERSION_EQUAL 17 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.8" )
49+ OR (version VERSION_EQUAL 20 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.12" )
50+ OR (version VERSION_EQUAL 23 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.20" )
51+ OR (version VERSION_EQUAL 26 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.25" ))
52+ set (language_version_is_supported_by_cmake TRUE )
53+ endif ()
54+ if (version VERSION_GREATER 26 AND version VERSION_LESS 98)
55+ message (
56+ FATAL_ERROR
57+ "Intel(R) QPL: C++ standard version '${version} ' is not supported by Intel(R) QPL build system. Please, fix this CMake file to add support for this version."
58+ )
59+ endif ()
60+ endif ()
61+ if (language_version_is_supported_by_cmake)
62+ set_target_properties (
63+ ${target_name}
64+ PROPERTIES ${language} _STANDARD ${version}
65+ ${language} _EXTENSIONS OFF
66+ ${language} _STANDARD_REQUIRED ON )
67+ else ()
68+ target_compile_options (
69+ ${target_name} PRIVATE $<$<AND :$<COMPILE_LANGUAGE:${language} >,$<${language} _COMPILER_ID:GNU,Clang>>:-std=${language_standard} >
70+ $<$<AND :$<COMPILE_LANGUAGE:${language} >,$<${language} _COMPILER_ID:MSVC >>:/std:${language_standard} >)
71+ endif ()
72+ # Additionally, set the language standard using `<lang>_std_<version>` compile feature if it is supported by CMake
73+ set (language_feature_is_supported_by_cmake FALSE )
74+ if (language STREQUAL "C" )
75+ # https://cmake.org/cmake/help/latest/prop_gbl/CMAKE_C_KNOWN_FEATURES.html
76+ if (((version GREATER_EQUAL 90 OR version VERSION_LESS 17) AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.8" )
77+ OR (version VERSION_LESS_EQUAL 23 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.21" ))
78+ set (language_feature_is_supported_by_cmake TRUE )
79+ endif ()
80+ if (version VERSION_GREATER 23 AND version VERSION_LESS 90)
81+ message (FATAL_ERROR "Intel(R) QPL: C standard version feature 'c_std_${version} ' is not supported by Intel(R) QPL build system. \
82+ Please, fix this CMake file to add support for this version." )
83+ endif ()
84+ elseif (language STREQUAL "CXX" )
85+ # https://cmake.org/cmake/help/latest/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html
86+ if (((version GREATER_EQUAL 98 OR version VERSION_LESS 20) AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.8" )
87+ OR (version VERSION_EQUAL 20 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.12" )
88+ OR (version VERSION_EQUAL 23 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.20" )
89+ OR (version VERSION_EQUAL 26 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.30" ))
90+ set (language_feature_is_supported_by_cmake TRUE )
91+ endif ()
92+ if (version VERSION_GREATER 26 AND version VERSION_LESS 98)
93+ message (FATAL_ERROR "Intel(R) QPL: C++ standard version feature 'cxx_std_${version} ' is not supported by Intel(R) QPL build system. \
94+ Please, fix this CMake file to add support for this version." )
95+ endif ()
96+ endif ()
97+ if (language_feature_is_supported_by_cmake)
98+ set (language_feature "${language} _std_${version} " )
99+ string (TOLOWER "${language_feature} " language_feature)
100+ target_compile_features (${target_name} PRIVATE ${language_feature} )
101+ endif ()
102+ endfunction ()
103+
104+ # Sets C and C++ language standards for the given target ${target_name}.
105+ #
106+ # Defaults are C17 and C++17.
107+ function (qpl_set_language_standards target_name)
108+ cmake_parse_arguments (
109+ "ARGUMENT" # prefix
110+ "" # options
111+ "${QPL_LANGUAGES} " # one-value arguments
112+ "" # multi-value arguments
113+ ${ARGN} )
114+ foreach (language IN LISTS QPL_LANGUAGES)
115+ if (NOT DEFINED ARGUMENT_${language} )
116+ set (ARGUMENT_${language} ${QPL_DEFAULT_${language} _STANDARD})
117+ endif ()
118+ qpl_set_language_standard(${target_name} ${language} ${ARGUMENT_${language} })
119+ endforeach ()
120+ endfunction ()
121+
9122option (QPL_TREAT_WARNINGS_AS_ERRORS "Treat all compiler warnings as errors" ON )
10123
11124# Enables all reasonable warnings for a target with the given name ${target_name}.
12125#
13126# Treats them as errors if $CACHE{QPL_TREAT_WARNINGS_AS_ERRORS} option is set to ON.
14127function (qpl_enable_warnings target_name)
128+ # TODO: enable warnings here, and not in CMakeLists.txt files
129+
130+ # Enable C/C++ standard conformance warnings
131+ if (MSVC )
132+ target_compile_options (${target_name} PRIVATE /permissive- /volatile:iso)
133+ else ()
134+ if ($CACHE{QPL_TREAT_WARNINGS_AS_ERRORS} )
135+ target_compile_options (${target_name} PRIVATE -pedantic-errors)
136+ else ()
137+ target_compile_options (${target_name} PRIVATE -pedantic)
138+ endif ()
139+ endif ()
140+ # Treat warnings as errors
15141 if ($CACHE{QPL_TREAT_WARNINGS_AS_ERRORS} )
16142 if (MSVC )
17143 target_compile_options (${target_name} PRIVATE /WX)
@@ -23,5 +149,6 @@ endfunction ()
23149
24150# Sets common target settings for the target with the given name ${target_name}.
25151function (qpl_set_common_target_settings target_name)
152+ qpl_set_language_standards(${target_name} ${ARGN} )
26153 qpl_enable_warnings(${target_name} )
27154endfunction ()
0 commit comments