diff --git a/lib/spack/spack/compilers/apple_clang.py b/lib/spack/spack/compilers/apple_clang.py index e4bef2c4bb..8a39b6427a 100644 --- a/lib/spack/spack/compilers/apple_clang.py +++ b/lib/spack/spack/compilers/apple_clang.py @@ -36,36 +36,89 @@ def extract_version_from_output(cls, output): ver = match.group(match.lastindex) return ver + # C++ flags based on CMake Modules/Compiler/AppleClang-CXX.cmake + @property def cxx11_flag(self): - # Adapted from CMake's AppleClang-CXX rules # Spack's AppleClang detection only valid from Xcode >= 4.6 - if self.real_version < spack.version.ver("4.0.0"): + if self.real_version < spack.version.ver("4.0"): raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++11 standard", "cxx11_flag", "Xcode < 4.0.0" + self, "the C++11 standard", "cxx11_flag", "Xcode < 4.0" ) return "-std=c++11" @property def cxx14_flag(self): - # Adapted from CMake's rules for AppleClang - if self.real_version < spack.version.ver("5.1.0"): + if self.real_version < spack.version.ver("5.1"): raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++14 standard", "cxx14_flag", "Xcode < 5.1.0" + self, "the C++14 standard", "cxx14_flag", "Xcode < 5.1" ) - elif self.real_version < spack.version.ver("6.1.0"): + elif self.real_version < spack.version.ver("6.1"): return "-std=c++1y" return "-std=c++14" @property def cxx17_flag(self): - # Adapted from CMake's rules for AppleClang - if self.real_version < spack.version.ver("6.1.0"): + if self.real_version < spack.version.ver("6.1"): raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++17 standard", "cxx17_flag", "Xcode < 6.1.0" + self, "the C++17 standard", "cxx17_flag", "Xcode < 6.1" ) - return "-std=c++1z" + elif self.real_version < spack.version.ver("10.0"): + return "-std=c++1z" + return "-std=c++17" + + @property + def cxx20_flag(self): + if self.real_version < spack.version.ver("10.0"): + raise spack.compiler.UnsupportedCompilerFlag( + self, "the C++20 standard", "cxx20_flag", "Xcode < 10.0" + ) + elif self.real_version < spack.version.ver("13.0"): + return "-std=c++2a" + return "-std=c++20" + + @property + def cxx23_flag(self): + if self.real_version < spack.version.ver("13.0"): + raise spack.compiler.UnsupportedCompilerFlag( + self, "the C++23 standard", "cxx23_flag", "Xcode < 13.0" + ) + return "-std=c++2b" + + # C flags based on CMake Modules/Compiler/AppleClang-C.cmake + + @property + def c99_flag(self): + if self.real_version < spack.version.ver("4.0"): + raise spack.compiler.UnsupportedCompilerFlag( + self, "the C99 standard", "c99_flag", "< 4.0" + ) + return "-std=c99" + + @property + def c11_flag(self): + if self.real_version < spack.version.ver("4.0"): + raise spack.compiler.UnsupportedCompilerFlag( + self, "the C11 standard", "c11_flag", "< 4.0" + ) + return "-std=c11" + + @property + def c17_flag(self): + if self.real_version < spack.version.ver("11.0"): + raise spack.compiler.UnsupportedCompilerFlag( + self, "the C17 standard", "c17_flag", "< 11.0" + ) + return "-std=c17" + + @property + def c23_flag(self): + if self.real_version < spack.version.ver("11.0.3"): + raise spack.compiler.UnsupportedCompilerFlag( + self, "the C23 standard", "c23_flag", "< 11.0.3" + ) + return "-std=c2x" def setup_custom_environment(self, pkg, env): """Set the DEVELOPER_DIR environment for the Xcode toolchain. diff --git a/lib/spack/spack/compilers/clang.py b/lib/spack/spack/compilers/clang.py index f9d5482297..53535256ae 100644 --- a/lib/spack/spack/compilers/clang.py +++ b/lib/spack/spack/compilers/clang.py @@ -128,10 +128,23 @@ def c99_flag(self): @property def c11_flag(self): - if self.real_version < ver("6.1.0"): - raise UnsupportedCompilerFlag(self, "the C11 standard", "c11_flag", "< 6.1.0") - else: - return "-std=c11" + if self.real_version < ver("3.0"): + raise UnsupportedCompilerFlag(self, "the C11 standard", "c11_flag", "< 3.0") + if self.real_version < ver("3.1"): + return "-std=c1x" + return "-std=c11" + + @property + def c17_flag(self): + if self.real_version < ver("6.0"): + raise UnsupportedCompilerFlag(self, "the C17 standard", "c17_flag", "< 6.0") + return "-std=c17" + + @property + def c23_flag(self): + if self.real_version < ver("9.0"): + raise UnsupportedCompilerFlag(self, "the C23 standard", "c23_flag", "< 9.0") + return "-std=c2x" @property def cc_pic_flag(self): diff --git a/lib/spack/spack/test/compilers/basics.py b/lib/spack/spack/test/compilers/basics.py index 0c5660efca..edd2f3acc9 100644 --- a/lib/spack/spack/test/compilers/basics.py +++ b/lib/spack/spack/test/compilers/basics.py @@ -389,7 +389,7 @@ def test_apple_clang_flags(): unsupported_flag_test("cxx17_flag", "apple-clang@6.0.0") supported_flag_test("cxx17_flag", "-std=c++1z", "apple-clang@6.1.0") supported_flag_test("c99_flag", "-std=c99", "apple-clang@6.1.0") - unsupported_flag_test("c11_flag", "apple-clang@6.0.0") + unsupported_flag_test("c11_flag", "apple-clang@3.0.0") supported_flag_test("c11_flag", "-std=c11", "apple-clang@6.1.0") supported_flag_test("cc_pic_flag", "-fPIC", "apple-clang@2.0.0") supported_flag_test("cxx_pic_flag", "-fPIC", "apple-clang@2.0.0") @@ -409,7 +409,7 @@ def test_clang_flags(): supported_flag_test("cxx17_flag", "-std=c++1z", "clang@3.5") supported_flag_test("cxx17_flag", "-std=c++17", "clang@5.0") supported_flag_test("c99_flag", "-std=c99", "clang@3.3") - unsupported_flag_test("c11_flag", "clang@6.0.0") + unsupported_flag_test("c11_flag", "clang@2.0") supported_flag_test("c11_flag", "-std=c11", "clang@6.1.0") supported_flag_test("cc_pic_flag", "-fPIC", "clang@3.3") supported_flag_test("cxx_pic_flag", "-fPIC", "clang@3.3")