project('highs', 'cpp', 'c', version : '1.8.0', meson_version: '>= 1.1.0', default_options : ['warning_level=1', 'cpp_std=c++17', 'wrap_mode=forcefallback', 'highsint64=false']) # Add C++ compiler options _args = [] # Extra arguments _deps = [] # Dependencies _incdirs = [] # All the includes cc = meson.get_compiler('c') cppc = meson.get_compiler('cpp') # Platform detection host_system = host_machine.system() is_windows = host_system == 'windows' is_mingw = is_windows and cc.get_id() == 'gcc' # Conditional arguments _args += cppc.get_supported_arguments([ '-Wno-return-type', '-Wno-switch', '-Wno-comment', '-Wno-unused-variable', '-Wno-unused-but-set-variable', '-Wno-unused-const-variable', '-Wno-unused-function', '-Wno-unused-label', ]) if cppc.get_id() == 'msvc' add_project_arguments( '/wd4018', # Disable warning: 'expression' : signed/unsigned mismatch '/wd4061', # Disable warning: enumerator 'identifier' in switch of enum 'enumeration' is not explicitly handled by a case label '/wd4100', # Disable warning: 'identifier' : unreferenced formal parameter '/wd4101', # Disable warning: 'identifier' : unreferenced local variable '/wd4127', # Disable warning: conditional expression is constant '/wd4189', # Disable warning: 'identifier' : local variable is initialized but not referenced '/wd4244', # Disable warning: 'conversion' conversion from 'type1' to 'type2', possible loss of data '/wd4245', # Disable warning: 'conversion' conversion from 'type1' to 'type2', signed/unsigned mismatch '/wd4267', # Disable warning: 'conversion' conversion from 'size_t' to 'type', possible loss of data '/wd4324', # Disable warning: 'structure' structure was padded due to alignment specifier '/wd4365', # Disable warning: 'action' : conversion from 'type_1' to 'type_2', signed/unsigned mismatch '/wd4389', # Disable warning: 'modifier' : signed/unsigned mismatch '/wd4456', # Disable warning: declaration of 'identifier' hides previous local declaration '/wd4457', # Disable warning: declaration of 'identifier' hides function parameter '/wd4458', # Disable warning: declaration of 'identifier' hides class member '/wd4459', # Disable warning: declaration of 'identifier' hides global declaration '/wd4514', # Disable warning: 'function' : unreferenced inline function has been removed '/wd4701', # Disable warning: potentially uninitialized local variable 'name' used '/wd4820', # Disable warning: 'bytes' bytes padding added after construct 'member_name' language: 'cpp', ) _args += '-D_CRT_SECURE_NO_WARNINGS' endif cpu_family = host_machine.cpu_family() if cpu_family in ['x86_64', 'i686'] and not is_windows add_project_arguments(cppc.get_supported_arguments('-mpopcnt'), language: 'cpp') endif if cpu_family in ['ppc64', 'powerpc64'] and not meson.is_cross_build() add_project_arguments(cppc.get_supported_arguments('-mpopcntd'), language: 'cpp') endif if is_mingw # For mingw-w64, don't use LTO add_project_arguments('-fno-use-linker-plugin', language: ['c', 'cpp']) endif # --------------------- Dependencies threads_dep = dependency('threads', required: false) _deps += threads_dep # Determine whether it is necessary to link libatomic. This could be the case # e.g. on 32-bit platforms when atomic operations are used on 64-bit types. # The check is copied from SciPy which in turn came from # Mesa . null_dep = dependency('', required : false) atomic_dep = null_dep code_non_lockfree = ''' #include int main() { struct { uint64_t *v; } x; return (int)__atomic_load_n(x.v, __ATOMIC_ACQUIRE) & (int)__atomic_add_fetch(x.v, (uint64_t)1, __ATOMIC_ACQ_REL); } ''' if cc.get_id() != 'msvc' if not cc.links( code_non_lockfree, name : 'Check atomic builtins without -latomic' ) atomic_dep = cc.find_library('atomic', required: false) if atomic_dep.found() # From SciPy # We're not sure that with `-latomic` things will work for all compilers, # so verify and only keep libatomic as a dependency if this works. if not cc.links( code_non_lockfree, dependencies: atomic_dep, name : 'Check atomic builtins with -latomic' ) atomic_dep = null_dep endif endif endif endif _deps += atomic_dep # Optional zlib_dep = dependency('zlib', required: get_option('use_zlib')) if zlib_dep.found() _deps += zlib_dep _incdirs += include_directories(['extern/zstr']) endif # Include Sources _incdirs += include_directories([ 'extern/', 'extern/pdqsort/', 'extern/filereaderlp/', ]) # Optional arguments if get_option('fast_build') add_project_arguments(cc.get_supported_arguments('-fno-omit-frame-pointer'), language : ['c', 'cpp']) endif if get_option('debug_sol') _args += ['-DHIGHS_DEBUGSOL'] endif if cppc.get_id() == 'msvc' # Don't depend on VCRUNTIME140_1.dll # https://cibuildwheel.readthedocs.io/en/stable/faq/#windows-importerror-dll-load-failed-the-specific-module-could-not-be-found add_project_arguments('/d2FH4-', language : ['cpp', 'c']) if get_option('with_stdcall') add_project_arguments(cppc.get_supported_arguments('/Gz'), language : ['cpp', 'c']) endif endif # --------------------- Library subdir('src') # defines highslib # --------------------- Tests if get_option('with_tests') subdir('check') _deps += dependency('catch2', required: true) endif # --------------------- Bindings # now in src/