99(libsemigroups.rtfd.io).
1010"""
1111
12+ import distutils .errors # pylint: disable=deprecated-module
1213import glob
1314import os
1415import platform
1516import sys
17+ from pathlib import Path
18+ from typing import Any
1619
1720import pkgconfig
1821from pybind11 .setup_helpers import (
2124 build_ext ,
2225 has_flag ,
2326 naive_recompile ,
27+ tmp_chdir ,
2428)
2529from setuptools import setup
2630
@@ -59,30 +63,58 @@ def get_arch():
5963 return arch
6064
6165
66+ def get_macro_value (compiler : Any , macro : str , include_directories : list [str ]) -> bool :
67+ """Check the value of a libsemigroups C++ preprocessor macro"""
68+
69+ with tmp_chdir ():
70+ fname = Path ("macro-check.cpp" )
71+ file_text = f"""
72+ #include <libsemigroups/config.hpp>
73+ int main () {{
74+ static_assert({ macro } );
75+ return 0;
76+ }}
77+ """
78+ fname .write_text (file_text , encoding = "utf-8" )
79+
80+ try :
81+ compiler .compile ([str (fname )], include_dirs = include_directories )
82+ except distutils .errors .CompileError :
83+ return False
84+ return True
85+
86+
6287class LibsemigroupsBuildExt (build_ext ):
6388 # pylint: disable=too-few-public-methods
6489 """Class conditionally add compile flags"""
6590
6691 def build_extensions (self ):
6792 """Adds compile flags before calling build_extensions in build_ext"""
6893 compiler = self .compiler
69-
70- if has_flag (compiler , "-mavx" ):
71- print ("Compiler supports '-mavx' flag, adding it to 'extra_compile_args'" )
72- for ext in self .extensions :
73- ext .extra_compile_args += ["-mavx" ]
74- else :
75- print ("Compiler does not support '-mavx' flag, not adding it to 'extra_compile_args'" )
76- if get_arch () == "arm" and (
77- any (x .startswith ("gcc" ) for x in compiler .compiler )
78- or any (x .startswith ("g++" ) for x in compiler .compiler_cxx )
79- ):
80- print (
81- "Compiler is gcc, and architecture is arm, adding '-fpermissive' to "
82- "'extra_compile_args'"
83- )
84- for ext in self .extensions :
85- ext .extra_compile_args += ["-fpermissive" ]
94+ hpcombi_enabled = get_macro_value (compiler , "LIBSEMIGROUPS_HPCOMBI_ENABLED" , include_dirs )
95+
96+ if hpcombi_enabled :
97+ for flag in ("-flax-vector-conversions" , "-mavx" ):
98+ if has_flag (compiler , flag ):
99+ print (f"Compiler supports '{ flag } ' flag, adding it to 'extra_compile_args'" )
100+ for ext in self .extensions :
101+ ext .extra_compile_args += [flag ]
102+ else :
103+ print (
104+ f"Compiler does not support '{ flag } ' flag, not adding it to "
105+ "'extra_compile_args'"
106+ )
107+
108+ if get_arch () == "arm" and (
109+ any (x .startswith ("gcc" ) for x in compiler .compiler )
110+ or any (x .startswith ("g++" ) for x in compiler .compiler_cxx )
111+ ):
112+ print (
113+ "Compiler is gcc, and architecture is arm, adding '-fpermissive' to "
114+ "'extra_compile_args'"
115+ )
116+ for ext in self .extensions :
117+ ext .extra_compile_args += ["-fpermissive" ]
86118
87119 for ext in self .extensions :
88120 print (f"'extra_compile_args' for '{ ext .name } ' are:" )
@@ -99,7 +131,6 @@ def build_extensions(self):
99131 library_dirs = libsemigroups_info ["library_dirs" ],
100132 language = "c++" ,
101133 libraries = ["semigroups" ],
102- extra_compile_args = ["-flax-vector-conversions" ],
103134 )
104135]
105136
0 commit comments