From 7242c765f3f6a370878d19cdef5767ea7d123ef2 Mon Sep 17 00:00:00 2001 From: Emily Boudreaux Date: Wed, 3 Dec 2025 11:38:08 -0500 Subject: [PATCH] build(wasm): major progress on gridfire compiling to wasm --- build-check/CC/meson.build | 0 build-check/CPPC/meson.build | 33 +++++ build-check/FC/meson.build | 15 +++ build-check/meson.build | 15 +++ build-config/fourdst/meson.build | 22 +-- build-config/meson.build | 7 +- build-config/pybind/meson.build | 2 +- build-config/sundials/cvode/meson.build | 11 +- build-config/xxHash/meson.build | 2 +- build-extra/log-level/meson.build | 32 +++++ build-extra/pkg-config/meson.build | 19 +++ build-python/meson.build | 169 ++++++++++++------------ cross/wasm.ini | 23 ++++ meson.build | 142 ++------------------ meson_options.txt | 18 +-- src/extern/meson.build | 2 +- src/meson.build | 19 ++- subprojects/fourdst.wrap | 2 +- tests/extern/meson.build | 6 +- tests/meson.build | 6 +- 20 files changed, 295 insertions(+), 250 deletions(-) create mode 100644 build-check/CC/meson.build create mode 100644 build-check/CPPC/meson.build create mode 100644 build-check/FC/meson.build create mode 100644 build-check/meson.build create mode 100644 build-extra/log-level/meson.build create mode 100644 build-extra/pkg-config/meson.build create mode 100644 cross/wasm.ini diff --git a/build-check/CC/meson.build b/build-check/CC/meson.build new file mode 100644 index 00000000..e69de29b diff --git a/build-check/CPPC/meson.build b/build-check/CPPC/meson.build new file mode 100644 index 00000000..12a33c54 --- /dev/null +++ b/build-check/CPPC/meson.build @@ -0,0 +1,33 @@ +cppc = meson.get_compiler('cpp') + +if cppc.get_id() == 'clang' + message('disabling bitwise-instead-of-logical warnings for clang') + add_project_arguments('-Wno-bitwise-instead-of-logical', language: 'cpp') +endif + +if cppc.get_id() == 'gcc' + message('disabling psabi warnings for gcc') + add_project_arguments('-Wno-psabi', language: 'cpp') + + if (cppc.version().version_compare('<14.0')) + error('g++ version must be at least 14.0, found ' + cppc.version()) + endif +endif + +if not cppc.has_header('print') + error('C++ standard library header not found. Please ensure your compiler and standard library supports C++23. We have already validated your compiler version so this is likely an issue with your standard library installation.') +endif +if not cppc.has_header('format') + error('C++ standard library header not found. Please ensure your compiler and standard library supports C++23. We have already validated your compiler version so this is likely an issue with your standard library installation.') +endif + +# For Eigen +add_project_arguments('-Wno-deprecated-declarations', language: 'cpp') + +if get_option('build_python') + message('enabling hidden visibility for C++ symbols when building Python extension. This reduces the size of the resulting shared library.') + add_project_arguments('-fvisibility=hidden', language: 'cpp') +else + message('enabling default visibility for C++ symbols') + add_project_arguments('-fvisibility=default', language: 'cpp') +endif diff --git a/build-check/FC/meson.build b/build-check/FC/meson.build new file mode 100644 index 00000000..5d1cc40e --- /dev/null +++ b/build-check/FC/meson.build @@ -0,0 +1,15 @@ +if get_option('build_fortran') + add_languages('fortran', native: true) + message('Found FORTRAN compiler: ' + meson.get_compiler('fortran').get_id()) + message('Fortran standard set to: ' + get_option('fortran_std')) + message('Building fortran module (gridfire_mod.mod)') + fc = meson.get_compiler('fortran') + if not get_option('unsafe_fortran') + if fc.get_id() != 'gcc' + error('The only supported fortran compiler for GridFire is gfortran (version >= 14.0), found ' + fc + '. GridFire has not been tested with any other compilers. You can disable this check with the -Dunsafe-fortran=true flag to try other compilers') + endif + endif + if (fc.version().version_compare('<14.0')) + error('gfortran version must be at least 14.0, found ' + fc.version()) + endif +endif diff --git a/build-check/meson.build b/build-check/meson.build new file mode 100644 index 00000000..9ace8c4e --- /dev/null +++ b/build-check/meson.build @@ -0,0 +1,15 @@ +message('Found CXX compiler: ' + meson.get_compiler('cpp').get_id()) +message('C++ standard set to: ' + get_option('cpp_std')) + +cc = meson.get_compiler('c') + +ignore_unused_args = '-Wno-unused-command-line-argument' + +add_global_arguments(ignore_unused_args, language: 'cpp') +add_global_arguments(ignore_unused_args, language: 'c') + + +subdir('CPPC') +subdir('FC') + + diff --git a/build-config/fourdst/meson.build b/build-config/fourdst/meson.build index c6696210..98a2c9a5 100644 --- a/build-config/fourdst/meson.build +++ b/build-config/fourdst/meson.build @@ -1,17 +1,21 @@ # bring in all of the fourdst utility repositories fourdst_build_lib_all = true -if get_option('unity-safe') +if not get_option('plugin_support') fourdst_build_lib_all=false + message('Disabling fourdst plugin support as per user request.') endif fourdst_sp = subproject('fourdst', default_options: - ['build-tests=' + get_option('build-tests').to_string(), - 'build-python=' + get_option('build-python').to_string(), - 'build-lib-all=' + fourdst_build_lib_all.to_string(), - 'pkg-config=' + get_option('pkg-config').to_string(), - 'build-lib-log=true' + ['build_tests=' + get_option('build_tests').to_string(), + 'build_python=' + get_option('build_python').to_string(), + 'build_lib_all=' + fourdst_build_lib_all.to_string(), + 'build_lib_comp=true', + 'build_lib_config=true', + 'build_lib_log=true', + 'build_lib_const=true', + 'pkg_config=' + get_option('pkg_config').to_string(), ] ) @@ -19,7 +23,8 @@ composition_dep = fourdst_sp.get_variable('composition_dep') log_dep = fourdst_sp.get_variable('log_dep') const_dep = fourdst_sp.get_variable('const_dep') config_dep = fourdst_sp.get_variable('config_dep') -if not get_option('unity-safe') +if get_option('plugin_support') + warning('Including plugin library from fourdst. Note this will bring in minizip-ng and openssl, which can cause build issues with cross compilation due to their complexity.') plugin_dep = fourdst_sp.get_variable('plugin_dep') endif @@ -28,6 +33,7 @@ libconst = fourdst_sp.get_variable('libconst') libconfig = fourdst_sp.get_variable('libconfig') liblogging = fourdst_sp.get_variable('liblogging') -if not get_option('unity-safe') +if get_option('plugin_support') + warning('Including plugin library from fourdst. Note this will bring in minizip-ng and openssl, which can cause build issues with cross compilation due to their complexity.') libplugin = fourdst_sp.get_variable('libplugin') endif diff --git a/build-config/meson.build b/build-config/meson.build index bbc36e13..a433637d 100644 --- a/build-config/meson.build +++ b/build-config/meson.build @@ -1,7 +1,9 @@ cmake = import('cmake') - -subdir('python') +if get_option('build_python') + subdir('python') + subdir('pybind') +endif subdir('fourdst') subdir('sundials') @@ -11,6 +13,5 @@ subdir('eigen') subdir('json') -subdir('pybind') subdir('CLI11') diff --git a/build-config/pybind/meson.build b/build-config/pybind/meson.build index 49297116..5b46096c 100644 --- a/build-config/pybind/meson.build +++ b/build-config/pybind/meson.build @@ -1,3 +1,3 @@ pybind11_proj = subproject('pybind11') pybind11_dep = pybind11_proj.get_variable('pybind11_dep') -python3_dep = dependency('python3') \ No newline at end of file +python3_dep = dependency('python3') diff --git a/build-config/sundials/cvode/meson.build b/build-config/sundials/cvode/meson.build index 1d976b94..4b19f6ad 100644 --- a/build-config/sundials/cvode/meson.build +++ b/build-config/sundials/cvode/meson.build @@ -6,7 +6,7 @@ cvode_cmake_options.add_cmake_defines({ 'CMAKE_C_FLAGS' : '-Wno-deprecated-declarations', 'BUILD_SHARED_LIBS' : 'OFF', 'BUILD_STATIC_LIBS' : 'ON', - 'EXAMPLES_ENABLE_C': 'OFF', + 'EXAMPLES_ENABLE_C' : 'OFF', 'CMAKE_POSITION_INDEPENDENT_CODE': true }) @@ -16,6 +16,15 @@ cvode_cmake_options.add_cmake_defines({ 'CMAKE_INSTALL_INCLUDEDIR': get_option('includedir') }) +if meson.is_cross_build() and host_machine.system() == 'emscripten' + cvode_cmake_options.add_cmake_defines({ + 'CMAKE_C_FLAGS': '-s MEMORY64=1 -s ALLOW_MEMORY_GROWTH=1', + 'CMAKE_CXX_FLAGS': '-s MEMORY64=1 -s ALLOW_MEMORY_GROWTH=1', + 'CMAKE_SHARED_LINKER_FLAGS': '-s MEMORY64=1 -s ALLOW_MEMORY_GROWTH=1', + 'CMAKE_EXE_LINKER_FLAGS': '-s MEMORY64=1 -s ALLOW_MEMORY_GROWTH=1' + }) +endif + cvode_sp = cmake.subproject( 'cvode', options: cvode_cmake_options, diff --git a/build-config/xxHash/meson.build b/build-config/xxHash/meson.build index a8551b51..3f98172c 100644 --- a/build-config/xxHash/meson.build +++ b/build-config/xxHash/meson.build @@ -1,4 +1,4 @@ xxhash_dep = declare_dependency( include_directories: include_directories('include') -) \ No newline at end of file +) diff --git a/build-extra/log-level/meson.build b/build-extra/log-level/meson.build new file mode 100644 index 00000000..18169529 --- /dev/null +++ b/build-extra/log-level/meson.build @@ -0,0 +1,32 @@ +llevel = get_option('log_level') + +logbase='QUILL_COMPILE_ACTIVE_LOG_LEVEL_' + +if (llevel == 'traceL3') + message('Setting log level to TRACE_L3') + log_argument = logbase + 'TRACE_L3' +elif (llevel == 'traceL2') + message('Setting log level to TRACE_L2') + log_argument = logbase + 'TRACE_L2' +elif (llevel == 'traceL1') + message('Setting log level to TRACE_L1') + log_argument = logbase + 'TRACE_L1' +elif (llevel == 'debug') + message('Setting log level to DEBUG') + log_argument = logbase + 'DEBUG' +elif (llevel == 'info') + message('Setting log level to INFO') + log_argument = logbase + 'INFO' +elif (llevel == 'warning') + message('Setting log level to WARNING') + log_argument = logbase + 'WARNING' +elif (llevel == 'error') + message('Setting log level to ERROR') + log_argument = logbase + 'ERROR' +elif (llevel == 'critical') + message('Setting log level to CRITICAL') + log_argument = logbase + 'CRITICAL' +endif + +log_argument = '-DQUILL_COMPILE_ACTIVE_LOG_LEVEL=' + log_argument +add_project_arguments(log_argument, language: 'cpp') diff --git a/build-extra/pkg-config/meson.build b/build-extra/pkg-config/meson.build new file mode 100644 index 00000000..56f2f016 --- /dev/null +++ b/build-extra/pkg-config/meson.build @@ -0,0 +1,19 @@ +if get_option('pkg_config') + message('Generating pkg-config file for GridFire...') + pkg = import('pkgconfig') + pkg.generate( + name: 'gridfire', + description: 'GridFire nuclear reaction network solver', + version: meson.project_version(), + libraries: [ + libgridfire, + libcomposition, + libconfig, + libconst, + liblogging + ], + subdirs: ['gridfire'], + filebase: 'gridfire', + install_dir: join_paths(get_option('libdir'), 'pkgconfig') + ) +endif diff --git a/build-python/meson.build b/build-python/meson.build index 88d67746..87234f3b 100644 --- a/build-python/meson.build +++ b/build-python/meson.build @@ -1,90 +1,95 @@ +if get_option('build_python') + message('Building Python bindings...') -gridfire_py_deps = [ - py_dep, - pybind11_dep, - const_dep, - config_dep, - composition_dep, - gridfire_dep -] + gridfire_py_deps = [ + py_dep, + pybind11_dep, + const_dep, + config_dep, + composition_dep, + gridfire_dep + ] -py_sources = [ - meson.project_source_root() + '/src/python/bindings.cpp', - meson.project_source_root() + '/src/python/types/bindings.cpp', - meson.project_source_root() + '/src/python/partition/bindings.cpp', - meson.project_source_root() + '/src/python/partition/trampoline/py_partition.cpp', - meson.project_source_root() + '/src/python/reaction/bindings.cpp', - meson.project_source_root() + '/src/python/screening/bindings.cpp', - meson.project_source_root() + '/src/python/screening/trampoline/py_screening.cpp', - meson.project_source_root() + '/src/python/io/bindings.cpp', - meson.project_source_root() + '/src/python/io/trampoline/py_io.cpp', - meson.project_source_root() + '/src/python/exceptions/bindings.cpp', - meson.project_source_root() + '/src/python/engine/bindings.cpp', - meson.project_source_root() + '/src/python/engine/trampoline/py_engine.cpp', - meson.project_source_root() + '/src/python/solver/bindings.cpp', - meson.project_source_root() + '/src/python/solver/trampoline/py_solver.cpp', - meson.project_source_root() + '/src/python/policy/bindings.cpp', - meson.project_source_root() + '/src/python/policy/trampoline/py_policy.cpp', - meson.project_source_root() + '/src/python/utils/bindings.cpp', - ] + py_sources = [ + meson.project_source_root() + '/src/python/bindings.cpp', + meson.project_source_root() + '/src/python/types/bindings.cpp', + meson.project_source_root() + '/src/python/partition/bindings.cpp', + meson.project_source_root() + '/src/python/partition/trampoline/py_partition.cpp', + meson.project_source_root() + '/src/python/reaction/bindings.cpp', + meson.project_source_root() + '/src/python/screening/bindings.cpp', + meson.project_source_root() + '/src/python/screening/trampoline/py_screening.cpp', + meson.project_source_root() + '/src/python/io/bindings.cpp', + meson.project_source_root() + '/src/python/io/trampoline/py_io.cpp', + meson.project_source_root() + '/src/python/exceptions/bindings.cpp', + meson.project_source_root() + '/src/python/engine/bindings.cpp', + meson.project_source_root() + '/src/python/engine/trampoline/py_engine.cpp', + meson.project_source_root() + '/src/python/solver/bindings.cpp', + meson.project_source_root() + '/src/python/solver/trampoline/py_solver.cpp', + meson.project_source_root() + '/src/python/policy/bindings.cpp', + meson.project_source_root() + '/src/python/policy/trampoline/py_policy.cpp', + meson.project_source_root() + '/src/python/utils/bindings.cpp', + ] -if meson.is_cross_build() and host_machine.system() == 'darwin' - py_mod = shared_module( - '_gridfire', - sources: py_sources, - dependencies: gridfire_py_deps, - name_prefix: '', - name_suffix: 'so', - install: true, - install_dir: py_installation.get_install_dir() + '/gridfire' - ) -else - py_mod = py_installation.extension_module( - '_gridfire', # Name of the generated .so/.pyd file (without extension) + if meson.is_cross_build() and host_machine.system() == 'darwin' + py_mod = shared_module( + '_gridfire', sources: py_sources, - dependencies : gridfire_py_deps, - install : true, + dependencies: gridfire_py_deps, + name_prefix: '', + name_suffix: 'so', + install: true, + install_dir: py_installation.get_install_dir() + '/gridfire' + ) + else + py_mod = py_installation.extension_module( + '_gridfire', # Name of the generated .so/.pyd file (without extension) + sources: py_sources, + dependencies : gridfire_py_deps, + install : true, + subdir: 'gridfire', + ) + endif + + + py_installation.install_sources( + files( + meson.project_source_root() + '/src/python/gridfire/__init__.py', + meson.project_source_root() + '/stubs/gridfire/_gridfire/__init__.pyi', + meson.project_source_root() + '/stubs/gridfire/_gridfire/exceptions.pyi', + meson.project_source_root() + '/stubs/gridfire/_gridfire/partition.pyi', + meson.project_source_root() + '/stubs/gridfire/_gridfire/reaction.pyi', + meson.project_source_root() + '/stubs/gridfire/_gridfire/screening.pyi', + meson.project_source_root() + '/stubs/gridfire/_gridfire/io.pyi', + meson.project_source_root() + '/stubs/gridfire/_gridfire/solver.pyi', + meson.project_source_root() + '/stubs/gridfire/_gridfire/policy.pyi', + meson.project_source_root() + '/stubs/gridfire/_gridfire/type.pyi' + ), subdir: 'gridfire', ) + + py_installation.install_sources( + files( + meson.project_source_root() + '/stubs/gridfire/_gridfire/engine/__init__.pyi', + meson.project_source_root() + '/stubs/gridfire/_gridfire/engine/diagnostics.pyi', + ), + subdir: 'gridfire/engine', + ) + + py_installation.install_sources( + files( + meson.project_source_root() + '/stubs/gridfire/_gridfire/utils/__init__.pyi', + ), + subdir: 'gridfire/utils', + ) + + py_installation.install_sources( + files( + meson.project_source_root() + '/stubs/gridfire/_gridfire/utils/hashing/__init__.pyi', + meson.project_source_root() + '/stubs/gridfire/_gridfire/utils/hashing/reaction.pyi', + ), + subdir: 'gridfire/utils/hashing', + ) +else + message('Python bindings disabled') endif - - -py_installation.install_sources( - files( - meson.project_source_root() + '/src/python/gridfire/__init__.py', - meson.project_source_root() + '/stubs/gridfire/_gridfire/__init__.pyi', - meson.project_source_root() + '/stubs/gridfire/_gridfire/exceptions.pyi', - meson.project_source_root() + '/stubs/gridfire/_gridfire/partition.pyi', - meson.project_source_root() + '/stubs/gridfire/_gridfire/reaction.pyi', - meson.project_source_root() + '/stubs/gridfire/_gridfire/screening.pyi', - meson.project_source_root() + '/stubs/gridfire/_gridfire/io.pyi', - meson.project_source_root() + '/stubs/gridfire/_gridfire/solver.pyi', - meson.project_source_root() + '/stubs/gridfire/_gridfire/policy.pyi', - meson.project_source_root() + '/stubs/gridfire/_gridfire/type.pyi' - ), - subdir: 'gridfire', -) - -py_installation.install_sources( - files( - meson.project_source_root() + '/stubs/gridfire/_gridfire/engine/__init__.pyi', - meson.project_source_root() + '/stubs/gridfire/_gridfire/engine/diagnostics.pyi', - ), - subdir: 'gridfire/engine', -) - -py_installation.install_sources( - files( - meson.project_source_root() + '/stubs/gridfire/_gridfire/utils/__init__.pyi', - ), - subdir: 'gridfire/utils', -) - -py_installation.install_sources( - files( - meson.project_source_root() + '/stubs/gridfire/_gridfire/utils/hashing/__init__.pyi', - meson.project_source_root() + '/stubs/gridfire/_gridfire/utils/hashing/reaction.pyi', - ), - subdir: 'gridfire/utils/hashing', -) diff --git a/cross/wasm.ini b/cross/wasm.ini new file mode 100644 index 00000000..49fa18a5 --- /dev/null +++ b/cross/wasm.ini @@ -0,0 +1,23 @@ +[binaries] +c = 'emcc' +cpp = 'em++' +ar = 'emar' +strip = 'emstrip' + +exec_wrapper = 'node' + +[built-in options] +c_args = ['-Dpkg_config=false', '-Dbuild_tests=false', '-Dbuild_examples=true', '-Dbuild_fortran=falase', '-Dplugin_support=false', '-s', 'MEMORY64=1', '-pthread', '-DQUILL_NO_THREAD_NAME_SUPPORT', '-DQUILL_IMMEDIATE_FLUSH'] +cpp_args = ['-Dpkg_config=false', '-Dbuild_tests=false', '-Dbuild_examples=true', '-Dbuild_fortran=falase', '-Dplugin_support=false', '-s', 'MEMORY64=1', '-pthread', '-DQUILL_NO_THREAD_NAME_SUPPORT', '-DQUILL_IMMEDIATE_FLUSH'] +c_link_args = ['-s', 'WASM=1', '-s', 'ALLOW_MEMORY_GROWTH=1', '-s', 'MEMORY64=1', '-fwasm-exceptions', '-pthread', '-s', 'EXPORTED_RUNTIME_METHODS=["FS", "callMain"]', '-s', 'STACK_SIZE=10485760'] +cpp_link_args = ['-s', 'WASM=1', '-s', 'ALLOW_MEMORY_GROWTH=1', '-s', 'MEMORY64=1', '-fwasm-exceptions', '-pthread', '-s', 'EXPORTED_RUNTIME_METHODS=["FS", "callMain"]', '-s', 'STACK_SIZE=10485760'] + +[host_machine] +system = 'emscripten' +cpu_family = 'wasm64' +cpu = 'wasm64' +endian = 'little' + +[properties] +cmake_toolchain_file = '/home/tboudreaux/Programming/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake' + diff --git a/meson.build b/meson.build index 37ccfa3b..59b34f7d 100644 --- a/meson.build +++ b/meson.build @@ -20,141 +20,25 @@ # *********************************************************************** # project('GridFire', ['c', 'cpp'], version: 'v0.7.4_rc2', default_options: ['cpp_std=c++23'], meson_version: '>=1.5.0') -if get_option('build-python') - add_project_arguments('-fvisibility=hidden', language: 'cpp') -else - add_project_arguments('-fvisibility=default', language: 'cpp') -endif +# Start by running the code which validates the build environment +subdir('build-check') -message('Found CXX compiler: ' + meson.get_compiler('cpp').get_id()) -message('C++ standard set to: ' + get_option('cpp_std')) - -cppc = meson.get_compiler('cpp') -cc = meson.get_compiler('c') - - -if cppc.get_id() == 'clang' - message('disabling bitwise-instead-of-logical warnings for clang') - add_project_arguments('-Wno-bitwise-instead-of-logical', language: 'cpp') -endif - -if cppc.get_id() == 'gcc' - message('disabling psabi warnings for gcc') - add_project_arguments('-Wno-psabi', language: 'cpp') - - if (cppc.version().version_compare('<14.0')) - error('g++ version must be at least 14.0, found ' + cppc.version()) - endif -endif - -build_fortran = get_option('build-fortran') -if (build_fortran) - add_languages('fortran', native: true) - message('Found FORTRAN compiler: ' + meson.get_compiler('fortran').get_id()) - message('Fortran standard set to: ' + get_option('fortran_std')) - message('Building fortran module (gridfire_mod.mod)') - fc = meson.get_compiler('fortran') - if not get_option('unsafe-fortran') - if fc.get_id() != 'gcc' - error('The only supported fortran compiler for GridFire is gfortran (version >= 14.0), found ' + fc + '. GridFire has not been tested with any other compilers. You can disable this check with the -Dunsafe-fortran=true flag to try other compilers') - endif - endif - if (fc.version().version_compare('<14.0')) - error('gfortran version must be at least 14.0, found ' + fc.version()) - endif -endif - - -if not cppc.has_header('print') - error('C++ standard library header not found. Please ensure your compiler and standard library supports C++23. We have already validated your compiler version so this is likely an issue with your standard library installation.') -endif -if not cppc.has_header('format') - error('C++ standard library header not found. Please ensure your compiler and standard library supports C++23. We have already validated your compiler version so this is likely an issue with your standard library installation.') -endif - - -ignore_unused_args = '-Wno-unused-command-line-argument' - -add_global_arguments(ignore_unused_args, language: 'cpp') -add_global_arguments(ignore_unused_args, language: 'c') - - - -# For Eigen -add_project_arguments('-Wno-deprecated-declarations', language: 'cpp') - -llevel = get_option('log-level') - -logbase='QUILL_COMPILE_ACTIVE_LOG_LEVEL_' - -if (llevel == 'traceL3') - message('Setting log level to TRACE_L3') - log_argument = logbase + 'TRACE_L3' -elif (llevel == 'traceL2') - message('Setting log level to TRACE_L2') - log_argument = logbase + 'TRACE_L2' -elif (llevel == 'traceL1') - message('Setting log level to TRACE_L1') - log_argument = logbase + 'TRACE_L1' -elif (llevel == 'debug') - message('Setting log level to DEBUG') - log_argument = logbase + 'DEBUG' -elif (llevel == 'info') - message('Setting log level to INFO') - log_argument = logbase + 'INFO' -elif (llevel == 'warning') - message('Setting log level to WARNING') - log_argument = logbase + 'WARNING' -elif (llevel == 'error') - message('Setting log level to ERROR') - log_argument = logbase + 'ERROR' -elif (llevel == 'critical') - message('Setting log level to CRITICAL') - log_argument = logbase + 'CRITICAL' -endif - -log_argument = '-DQUILL_COMPILE_ACTIVE_LOG_LEVEL=' + log_argument -add_project_arguments(log_argument, language: 'cpp') - -cpp = meson.get_compiler('cpp') +# Configure the logging level +subdir('build-extra/log-level') +# Then build the external dependencies subdir('build-config') +# Build the main source code subdir('src') -if get_option('build-python') - message('Configuring Python bindings...') - subdir('build-python') -else - message('Skipping Python bindings...') -endif +# Build the Python bindings +subdir('build-python') -if get_option('build-tests') - message('Setting up tests for GridFire...') - subdir('tests') -else - message('Skipping tests for GridFire...') -endif - - -if get_option('pkg-config') - message('Generating pkg-config file for GridFire...') - pkg = import('pkgconfig') - pkg.generate( - name: 'gridfire', - description: 'GridFire nuclear reaction network solver', - version: meson.project_version(), - libraries: [ - libgridfire, - libcomposition, - libconfig, - libconst, - liblogging - ], - subdirs: ['gridfire'], - filebase: 'gridfire', - install_dir: join_paths(get_option('libdir'), 'pkgconfig') - ) -endif +# Buil the test suite +subdir('tests') + +# Build the pkg-config file +subdir('build-extra/pkg-config') diff --git a/meson_options.txt b/meson_options.txt index 77cff5db..f22e89ed 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,8 +1,10 @@ -option('log-level', type: 'combo', choices: ['traceL3', 'traceL2', 'traceL1', 'debug', 'info', 'warning', 'error', 'critial'], value: 'info', description: 'Set the log level for the GridFire library') -option('pkg-config', type: 'boolean', value: true, description: 'generate pkg-config file for GridFire (gridfire.pc)') -option('build-python', type: 'boolean', value: false, description: 'build the python bindings so you can use GridFire from python') -option('build-tests', type: 'boolean', value: true, description: 'build the test suite') -option('build-fortran', type: 'boolean', value: false, description: 'build fortran module support') -option('unsafe-fortran', type: 'boolean', value: false, description: 'Allow untested fortran compilers (compilers other than gfortran)') -option('unity-safe', type: 'boolean', value: false, description: 'Enable safe unity builds for better compatibility across different compilers and platforms') -option('python-target-version', type: 'string', value: '3.13', description: 'Target version for python compilation, only used for cross compilation') +option('log_level', type: 'combo', choices: ['traceL3', 'traceL2', 'traceL1', 'debug', 'info', 'warning', 'error', 'critial'], value: 'info', description: 'Set the log level for the GridFire library') +option('pkg_config', type: 'boolean', value: true, description: 'generate pkg-config file for GridFire (gridfire.pc)') +option('build_python', type: 'boolean', value: false, description: 'build the python bindings so you can use GridFire from python') +option('build_tests', type: 'boolean', value: true, description: 'build the test suite') +option('build_examples', type: 'boolean', value: true, description: 'build example code') +option('build_fortran', type: 'boolean', value: false, description: 'build fortran module support') +option('unsafe_fortran', type: 'boolean', value: false, description: 'Allow untested fortran compilers (compilers other than gfortran)') +option('plugin_support', type: 'boolean', value: false, description: 'Enable support for libplugin plugins') +option('python_target_version', type: 'string', value: '3.13', description: 'Target version for python compilation, only used for cross compilation') +option('build_c_api', type: 'boolean', value: true, description: 'compile the C API') diff --git a/src/extern/meson.build b/src/extern/meson.build index d9900ff1..70a4f68b 100644 --- a/src/extern/meson.build +++ b/src/extern/meson.build @@ -23,7 +23,7 @@ gridfire_extern_dep = declare_dependency( install_subdir('include/gridfire', install_dir: get_option('includedir')) -if get_option('build-fortran') +if get_option('build_fortran') message('Configuring Fortran bindings...') subdir('fortran') endif diff --git a/src/meson.build b/src/meson.build index ed52f2dc..3f08190e 100644 --- a/src/meson.build +++ b/src/meson.build @@ -42,7 +42,7 @@ gridfire_build_dependencies = [ json_dep, ] -if not get_option('unity-safe') +if get_option('plugin_support') gridfire_build_dependencies += [plugin_dep] endif @@ -63,12 +63,11 @@ gridfire_dep = declare_dependency( install_subdir('include/gridfire', install_dir: get_option('includedir')) -message('Configuring C API...') -subdir('extern') -# -#if get_option('build-python') -# message('Configuring Python bindings...') -# subdir('python') -#else -# message('Skipping Python bindings...') -#endif + +if not get_option('build_c_api') and get_option('build_fortran') + error('Cannot build fortran without C API. Set -Dbuild-c-api=true and -Dbuild-fortran=true') +endif +if get_option('build_c_api') + message('Configuring C API...') + subdir('extern') +endif diff --git a/subprojects/fourdst.wrap b/subprojects/fourdst.wrap index 140d8639..3466edab 100644 --- a/subprojects/fourdst.wrap +++ b/subprojects/fourdst.wrap @@ -1,4 +1,4 @@ [wrap-git] url = https://github.com/4D-STAR/fourdst -revision = v0.9.11 +revision = v0.9.13 depth = 1 diff --git a/tests/extern/meson.build b/tests/extern/meson.build index 9ec12a00..ebc1edde 100644 --- a/tests/extern/meson.build +++ b/tests/extern/meson.build @@ -1,5 +1,7 @@ -subdir('C') +if get_option('build_c_api') + subdir('C') +endif -if get_option('build-fortran') +if get_option('build_fortran') subdir('fortran') endif diff --git a/tests/meson.build b/tests/meson.build index a2b8027c..5f17b7ab 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -1,7 +1,7 @@ # Google Test dependency -gtest_dep = dependency('gtest', main: true, required : true) -gtest_main = dependency('gtest_main', required: true) -gtest_nomain_dep = dependency('gtest', main: false, required : true) +#gtest_dep = dependency('gtest', main: true, required : true) +#gtest_main = dependency('gtest_main', required: true) +#gtest_nomain_dep = dependency('gtest', main: false, required : true) # Subdirectories for unit and integration tests subdir('graphnet_sandbox')