diff --git a/esmvalcore/_config.py b/esmvalcore/_config.py
index 6f44f1673..c8e08381d 100644
--- a/esmvalcore/_config.py
+++ b/esmvalcore/_config.py
@@ -168,7 +168,10 @@ def configure_logging(cfg_file=None, output=None, console_log_level=None):
 def get_project_config(project):
     """Get developer-configuration for project."""
     logger.debug("Retrieving %s configuration", project)
-    return CFG[project]
+    if project in CFG:
+        return CFG[project]
+    else:
+        raise ValueError(f"Project '{project}' not in config-developer.yml")
 
 
 def get_institutes(variable):
diff --git a/esmvalcore/_recipe.py b/esmvalcore/_recipe.py
index 7b5f194f8..c94022b5b 100644
--- a/esmvalcore/_recipe.py
+++ b/esmvalcore/_recipe.py
@@ -386,26 +386,45 @@ def _add_fxvar_keys(fx_var_dict, variable):
 
 
 def _get_correct_fx_file(variable, fx_varname, config_user):
-    """Wrapper to standard file getter to recover the correct fx file."""
+    """Get fx files (searching all possible mips)."""
+    # TODO: allow user to specify certain mip if desired
     var = dict(variable)
-    if var['project'] in ['CMIP5', 'OBS', 'OBS6', 'obs4mips']:
-        fx_var = _add_fxvar_keys({'short_name': fx_varname, 'mip': 'fx'}, var)
-    elif var['project'] == 'CMIP6':
-        if fx_varname == 'sftlf':
-            fx_var = _add_fxvar_keys({'short_name': fx_varname, 'mip': 'fx'},
-                                     var)
-        elif fx_varname == 'sftof':
-            fx_var = _add_fxvar_keys({'short_name': fx_varname, 'mip': 'Ofx'},
-                                     var)
-        # TODO allow availability for multiple mip's for sftgif
-        elif fx_varname == 'sftgif':
-            fx_var = _add_fxvar_keys({'short_name': fx_varname, 'mip': 'fx'},
-                                     var)
+    var_project = variable['project']
+    cmor_table = CMOR_TABLES[var_project]
+
+    # Get all fx-related mips ('fx' always first, original mip last)
+    fx_mips = ['fx']
+    fx_mips.extend(
+        [key for key in cmor_table.tables if 'fx' in key and key != 'fx'])
+    fx_mips.append(variable['mip'])
+
+    # Search all mips for available variables
+    searched_mips = []
+    for fx_mip in fx_mips:
+        fx_variable = cmor_table.get_variable(fx_mip, fx_varname)
+        if fx_variable is not None:
+            searched_mips.append(fx_mip)
+            fx_var = _add_fxvar_keys(
+                {'short_name': fx_varname, 'mip': fx_mip}, var)
+            logger.debug("For CMIP6 fx variable '%s', found table '%s'",
+                         fx_varname, fx_mip)
+            fx_files = _get_input_files(fx_var, config_user)
+
+            # If files found, return them
+            if fx_files:
+                logger.debug("Found CMIP6 fx variables '%s':\n%s",
+                             fx_varname, pformat(fx_files))
+                break
     else:
+        # No files found
+        fx_files = []
+
+    # If fx variable was not found in any table, raise exception
+    if not searched_mips:
         raise RecipeError(
-            f"Project {var['project']} not supported with fx variables")
+            f"Requested fx variable '{fx_varname}' not available in "
+            f"any 'fx'-related CMOR table ({fx_mips}) for '{var_project}'")
 
-    fx_files = _get_input_files(fx_var, config_user)
     # allow for empty lists corrected for by NE masks
     if fx_files:
         fx_files = fx_files[0]
@@ -726,7 +745,7 @@ def _get_single_preprocessor_task(variables,
     order = _extract_preprocessor_order(profile)
     ancestor_products = [p for task in ancestor_tasks for p in task.products]
 
-    if variables[0]['frequency'] == 'fx':
+    if variables[0].get('frequency') == 'fx':
         check.check_for_temporal_preprocs(profile)
         ancestor_products = None
 

Use of areacella and areacello in area_statistics not supported for CMIP6
Using the following preprocessor

```yaml
  spatial_mean_sea:
    mask_landsea:
      mask_out: land
    area_statistics:
      operator: mean
      fx_files: ['areacello']
```

fails at the moment:

```
2020-01-15 13:48:55,511 UTC [22398] ERROR   Program terminated abnormally, see stack trace below for more information
Traceback (most recent call last):
  File "ESMValCore/esmvalcore/_main.py", line 229, in run
    conf = main(args)
  File "ESMValCore/esmvalcore/_main.py", line 157, in main
    process_recipe(recipe_file=recipe, config_user=cfg)
  File "ESMValCore/esmvalcore/_main.py", line 203, in process_recipe
    recipe = read_recipe_file(recipe_file, config_user)
  File "ESMValCore/esmvalcore/_recipe.py", line 73, in read_recipe_file
    recipe_file=filename)
  File "ESMValCore/esmvalcore/_recipe.py", line 909, in __init__
    self.tasks = self.initialize_tasks() if initialize_tasks else None
  File "ESMValCore/esmvalcore/_recipe.py", line 1255, in initialize_tasks
    task_name=task_name,
  File "ESMValCore/esmvalcore/_recipe.py", line 880, in _get_preprocessor_task
    name=task_name,
  File "ESMValCore/esmvalcore/_recipe.py", line 738, in _get_single_preprocessor_task
    config_user=config_user,
  File "ESMValCore/esmvalcore/_recipe.py", line 689, in _get_preprocessor_products
    config_user=config_user)
  File "ESMValCore/esmvalcore/_recipe.py", line 478, in _update_fx_settings
    for fxvar in var['fx_files']}
  File "ESMValCore/esmvalcore/_recipe.py", line 478, in <dictcomp>
    for fxvar in var['fx_files']}
  File "ESMValCore/esmvalcore/_recipe.py", line 408, in _get_correct_fx_file
    fx_files = _get_input_files(fx_var, config_user)
UnboundLocalError: local variable 'fx_var' referenced before assignment
```

because certain fx variables are hardcoded in `_recipe.py` for CMIP6. I will take care of that.
diff --git a/tests/integration/test_recipe.py b/tests/integration/test_recipe.py
index f2dce12c9..682885cb8 100644
--- a/tests/integration/test_recipe.py
+++ b/tests/integration/test_recipe.py
@@ -1420,7 +1420,6 @@ def test_extract_shape_raises(tmp_path, patched_datafinder, config_user,
 
 
 def test_weighting_landsea_fraction(tmp_path, patched_datafinder, config_user):
-
     content = dedent("""
         preprocessors:
           landfrac_weighting:
@@ -1471,7 +1470,6 @@ def test_weighting_landsea_fraction(tmp_path, patched_datafinder, config_user):
 
 def test_weighting_landsea_fraction_no_fx(tmp_path, patched_failing_datafinder,
                                           config_user):
-
     content = dedent("""
         preprocessors:
           landfrac_weighting:
@@ -1524,7 +1522,6 @@ def test_weighting_landsea_fraction_no_fx(tmp_path, patched_failing_datafinder,
 
 def test_weighting_landsea_fraction_exclude(tmp_path, patched_datafinder,
                                             config_user):
-
     content = dedent("""
         preprocessors:
           landfrac_weighting:
@@ -1577,7 +1574,6 @@ def test_weighting_landsea_fraction_exclude(tmp_path, patched_datafinder,
 
 def test_weighting_landsea_fraction_exclude_fail(tmp_path, patched_datafinder,
                                                  config_user):
-
     content = dedent("""
         preprocessors:
           landfrac_weighting:
@@ -1611,7 +1607,6 @@ def test_weighting_landsea_fraction_exclude_fail(tmp_path, patched_datafinder,
 
 
 def test_landmask(tmp_path, patched_datafinder, config_user):
-
     content = dedent("""
         preprocessors:
           landmask:
@@ -1658,13 +1653,12 @@ def test_landmask(tmp_path, patched_datafinder, config_user):
 
 
 def test_landmask_no_fx(tmp_path, patched_failing_datafinder, config_user):
-
     content = dedent("""
         preprocessors:
           landmask:
             mask_landsea:
               mask_out: sea
-              always_use_ne_mask: true
+              always_use_ne_mask: false
 
         diagnostics:
           diagnostic_name:
@@ -1679,6 +1673,8 @@ def test_landmask_no_fx(tmp_path, patched_failing_datafinder, config_user):
                 ensemble: r1i1p1
                 additional_datasets:
                   - {dataset: CanESM2}
+                  - {dataset: CanESM5, project: CMIP6, grid: gn,
+                     ensemble: r1i1p1f1}
                   - {dataset: TEST, project: obs4mips, level: 1, version: 1,
                      tier: 1}
             scripts: null
@@ -1690,14 +1686,363 @@ def test_landmask_no_fx(tmp_path, patched_failing_datafinder, config_user):
     task = recipe.tasks.pop()
     assert task.name == 'diagnostic_name' + TASKSEP + 'gpp'
 
-    # Check weighting
-    assert len(task.products) == 2
+    # Check masking
+    assert len(task.products) == 3
     for product in task.products:
         assert 'mask_landsea' in product.settings
         settings = product.settings['mask_landsea']
         assert len(settings) == 3
         assert settings['mask_out'] == 'sea'
-        assert settings['always_use_ne_mask'] is True
+        assert settings['always_use_ne_mask'] is False
         fx_files = settings['fx_files']
         assert isinstance(fx_files, list)
         assert fx_files == []
+
+
+def test_fx_vars_mip_change_cmip6(tmp_path, patched_datafinder, config_user):
+    content = dedent("""
+        preprocessors:
+          preproc:
+           area_statistics:
+             operator: mean
+             fx_files: [
+               'areacella',
+               'areacello',
+               'clayfrac',
+               'sftlf',
+               'sftgif',
+               'sftof',
+             ]
+           mask_landsea:
+             mask_out: sea
+
+        diagnostics:
+          diagnostic_name:
+            variables:
+              tas:
+                preprocessor: preproc
+                project: CMIP6
+                mip: Amon
+                exp: historical
+                start_year: 2000
+                end_year: 2005
+                ensemble: r1i1p1f1
+                grid: gn
+                additional_datasets:
+                  - {dataset: CanESM5}
+            scripts: null
+        """)
+    recipe = get_recipe(tmp_path, content, config_user)
+
+    # Check generated tasks
+    assert len(recipe.tasks) == 1
+    task = recipe.tasks.pop()
+    assert task.name == 'diagnostic_name' + TASKSEP + 'tas'
+    assert len(task.products) == 1
+    product = task.products.pop()
+
+    # Check area_statistics
+    assert 'area_statistics' in product.settings
+    settings = product.settings['area_statistics']
+    assert len(settings) == 2
+    assert settings['operator'] == 'mean'
+    fx_files = settings['fx_files']
+    assert isinstance(fx_files, dict)
+    assert len(fx_files) == 6
+    assert '_fx_' in fx_files['areacella']
+    assert '_Ofx_' in fx_files['areacello']
+    assert '_Efx_' in fx_files['clayfrac']
+    assert '_fx_' in fx_files['sftlf']
+    assert '_fx_' in fx_files['sftgif']
+    assert '_Ofx_' in fx_files['sftof']
+
+    # Check mask_landsea
+    assert 'mask_landsea' in product.settings
+    settings = product.settings['mask_landsea']
+    assert len(settings) == 2
+    assert settings['mask_out'] == 'sea'
+    fx_files = settings['fx_files']
+    assert isinstance(fx_files, list)
+    assert len(fx_files) == 2
+    for fx_file in fx_files:
+        if 'sftlf' in fx_file:
+            assert '_fx_' in fx_file
+        elif 'sftof' in fx_file:
+            assert '_Ofx_' in fx_file
+        else:
+            assert False
+
+
+def test_fx_vars_volcello_in_ofx_cmip6(tmp_path, patched_datafinder,
+                                       config_user):
+    content = dedent("""
+        preprocessors:
+          preproc:
+           volume_statistics:
+             operator: mean
+             fx_files: ['volcello']
+
+        diagnostics:
+          diagnostic_name:
+            variables:
+              tos:
+                preprocessor: preproc
+                project: CMIP6
+                mip: Omon
+                exp: historical
+                start_year: 2000
+                end_year: 2005
+                ensemble: r1i1p1f1
+                grid: gn
+                additional_datasets:
+                  - {dataset: CanESM5}
+            scripts: null
+        """)
+    recipe = get_recipe(tmp_path, content, config_user)
+
+    # Check generated tasks
+    assert len(recipe.tasks) == 1
+    task = recipe.tasks.pop()
+    assert task.name == 'diagnostic_name' + TASKSEP + 'tos'
+    assert len(task.products) == 1
+    product = task.products.pop()
+
+    # Check volume_statistics
+    assert 'volume_statistics' in product.settings
+    settings = product.settings['volume_statistics']
+    assert len(settings) == 2
+    assert settings['operator'] == 'mean'
+    fx_files = settings['fx_files']
+    assert isinstance(fx_files, dict)
+    assert len(fx_files) == 1
+    assert '_Ofx_' in fx_files['volcello']
+    assert '_Omon_' not in fx_files['volcello']
+
+
+def test_fx_vars_volcello_in_omon_cmip6(tmp_path, patched_failing_datafinder,
+                                        config_user):
+    content = dedent("""
+        preprocessors:
+          preproc:
+           volume_statistics:
+             operator: mean
+             fx_files: ['volcello']
+
+        diagnostics:
+          diagnostic_name:
+            variables:
+              tos:
+                preprocessor: preproc
+                project: CMIP6
+                mip: Omon
+                exp: historical
+                start_year: 2000
+                end_year: 2005
+                ensemble: r1i1p1f1
+                grid: gn
+                additional_datasets:
+                  - {dataset: CanESM5}
+            scripts: null
+        """)
+    recipe = get_recipe(tmp_path, content, config_user)
+
+    # Check generated tasks
+    assert len(recipe.tasks) == 1
+    task = recipe.tasks.pop()
+    assert task.name == 'diagnostic_name' + TASKSEP + 'tos'
+    assert len(task.products) == 1
+    product = task.products.pop()
+
+    # Check volume_statistics
+    assert 'volume_statistics' in product.settings
+    settings = product.settings['volume_statistics']
+    assert len(settings) == 2
+    assert settings['operator'] == 'mean'
+    fx_files = settings['fx_files']
+    assert isinstance(fx_files, dict)
+    assert len(fx_files) == 1
+    assert '_Ofx_' not in fx_files['volcello']
+    assert '_Omon_' in fx_files['volcello']
+
+
+def test_fx_vars_volcello_in_oyr_cmip6(tmp_path, patched_failing_datafinder,
+                                       config_user):
+    content = dedent("""
+        preprocessors:
+          preproc:
+           volume_statistics:
+             operator: mean
+             fx_files: ['volcello']
+
+        diagnostics:
+          diagnostic_name:
+            variables:
+              o2:
+                preprocessor: preproc
+                project: CMIP6
+                mip: Oyr
+                exp: historical
+                start_year: 2000
+                end_year: 2005
+                ensemble: r1i1p1f1
+                grid: gn
+                additional_datasets:
+                  - {dataset: CanESM5}
+            scripts: null
+        """)
+    recipe = get_recipe(tmp_path, content, config_user)
+
+    # Check generated tasks
+    assert len(recipe.tasks) == 1
+    task = recipe.tasks.pop()
+    assert task.name == 'diagnostic_name' + TASKSEP + 'o2'
+    assert len(task.products) == 1
+    product = task.products.pop()
+
+    # Check volume_statistics
+    assert 'volume_statistics' in product.settings
+    settings = product.settings['volume_statistics']
+    assert len(settings) == 2
+    assert settings['operator'] == 'mean'
+    fx_files = settings['fx_files']
+    assert isinstance(fx_files, dict)
+    assert len(fx_files) == 1
+    assert '_Ofx_' not in fx_files['volcello']
+    assert '_Oyr_' in fx_files['volcello']
+
+
+def test_fx_vars_volcello_in_fx_cmip5(tmp_path, patched_datafinder,
+                                      config_user):
+    content = dedent("""
+        preprocessors:
+          preproc:
+           volume_statistics:
+             operator: mean
+             fx_files: ['volcello']
+
+        diagnostics:
+          diagnostic_name:
+            variables:
+              tos:
+                preprocessor: preproc
+                project: CMIP5
+                mip: Omon
+                exp: historical
+                start_year: 2000
+                end_year: 2005
+                ensemble: r1i1p1
+                additional_datasets:
+                  - {dataset: CanESM2}
+            scripts: null
+        """)
+    recipe = get_recipe(tmp_path, content, config_user)
+
+    # Check generated tasks
+    assert len(recipe.tasks) == 1
+    task = recipe.tasks.pop()
+    assert task.name == 'diagnostic_name' + TASKSEP + 'tos'
+    assert len(task.products) == 1
+    product = task.products.pop()
+
+    # Check volume_statistics
+    assert 'volume_statistics' in product.settings
+    settings = product.settings['volume_statistics']
+    assert len(settings) == 2
+    assert settings['operator'] == 'mean'
+    fx_files = settings['fx_files']
+    assert isinstance(fx_files, dict)
+    assert len(fx_files) == 1
+    assert '_fx_' in fx_files['volcello']
+    assert '_Omon_' not in fx_files['volcello']
+
+
+def test_wrong_project(tmp_path, patched_datafinder, config_user):
+    content = dedent("""
+        preprocessors:
+          preproc:
+           volume_statistics:
+             operator: mean
+             fx_files: ['volcello']
+
+        diagnostics:
+          diagnostic_name:
+            variables:
+              tos:
+                preprocessor: preproc
+                project: CMIP7
+                mip: Omon
+                exp: historical
+                start_year: 2000
+                end_year: 2005
+                ensemble: r1i1p1
+                additional_datasets:
+                  - {dataset: CanESM2}
+            scripts: null
+        """)
+    with pytest.raises(ValueError) as wrong_proj:
+        get_recipe(tmp_path, content, config_user)
+        assert wrong_proj == "Project CMIP7 not in config-developer"
+
+
+def test_invalid_fx_var_cmip6(tmp_path, patched_datafinder, config_user):
+    content = dedent("""
+        preprocessors:
+          preproc:
+           area_statistics:
+             operator: mean
+             fx_files: [
+               'areacella',
+               'wrong_fx_variable',
+             ]
+
+        diagnostics:
+          diagnostic_name:
+            variables:
+              tas:
+                preprocessor: preproc
+                project: CMIP6
+                mip: Amon
+                exp: historical
+                start_year: 2000
+                end_year: 2005
+                ensemble: r1i1p1f1
+                grid: gn
+                additional_datasets:
+                  - {dataset: CanESM5}
+            scripts: null
+        """)
+    msg = ("Requested fx variable 'wrong_fx_variable' for CMIP6 not "
+           "available in any 'fx'-related CMOR table")
+    with pytest.raises(RecipeError) as rec_err_exp:
+        get_recipe(tmp_path, content, config_user)
+        assert msg in rec_err_exp
+
+
+def test_fx_var_invalid_project(tmp_path, patched_datafinder, config_user):
+    content = dedent("""
+        preprocessors:
+          preproc:
+           area_statistics:
+             operator: mean
+             fx_files: ['areacella']
+
+        diagnostics:
+          diagnostic_name:
+            variables:
+              tas:
+                preprocessor: preproc
+                project: EMAC
+                mip: Amon
+                exp: historical
+                start_year: 2000
+                end_year: 2005
+                ensemble: r1i1p1f1
+                grid: gn
+                additional_datasets:
+                  - {dataset: CanESM5}
+            scripts: null
+        """)
+    msg = 'Project EMAC not supported with fx variables'
+    with pytest.raises(RecipeError) as rec_err_exp:
+        get_recipe(tmp_path, content, config_user)
+        assert msg in rec_err_exp

environment.yml
pip install -e .[develop]
parse_log_pytest
environment.yml
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
antlr4-python3-runtime @ file:///home/conda/feedstock_root/build_artifacts/antlr-python-runtime_1636143373368/work
astroid==2.15.8
attrs==24.2.0
Babel==2.14.0
build==0.10.0
Cartopy @ file:///home/conda/feedstock_root/build_artifacts/cartopy_1642060950241/work
certifi @ file:///home/conda/feedstock_root/build_artifacts/certifi_1725278078093/work/certifi
cf-units @ file:///home/conda/feedstock_root/build_artifacts/cf-units_1640986232540/work
cftime @ file:///home/conda/feedstock_root/build_artifacts/cftime_1663606412550/work
charset-normalizer==3.4.1
click==8.1.8
click-plugins==1.1.1
cligj==0.7.2
cloudpickle @ file:///home/conda/feedstock_root/build_artifacts/cloudpickle_1674202310934/work
colorama==0.4.6
coverage==7.2.7
cycler @ file:///home/conda/feedstock_root/build_artifacts/cycler_1635519461629/work
Cython @ file:///home/conda/feedstock_root/build_artifacts/cython_1659101942790/work
dask @ file:///home/conda/feedstock_root/build_artifacts/dask-core_1644602974678/work
dill==0.3.7
docutils==0.17.1
dodgy==0.2.1
easytest==0.1.5
ESMPy==8.2.0
-e git+https://github.com/ESMValGroup/ESMValCore.git@a0552bd1a33108156d9453ddf884e21087932150#egg=ESMValCore
exceptiongroup==1.2.2
execnet==2.0.2
fiona==1.9.6
flake8==5.0.4
flake8-polyfill==1.0.2
fonttools @ file:///home/conda/feedstock_root/build_artifacts/fonttools_1666389892786/work
fsspec @ file:///home/conda/feedstock_root/build_artifacts/fsspec_1674184942191/work
gitdb==4.0.12
GitPython==3.1.44
idna==3.10
imagesize==1.4.1
importlib-metadata==4.2.0
iniconfig==2.0.0
isodate==0.6.1
isort==5.11.5
Jinja2 @ file:///home/conda/feedstock_root/build_artifacts/jinja2_1715127149914/work
kiwisolver @ file:///home/conda/feedstock_root/build_artifacts/kiwisolver_1657953088445/work
lazy-object-proxy==1.9.0
llvmlite==0.39.1
locket @ file:///home/conda/feedstock_root/build_artifacts/locket_1650660393415/work
lxml==5.3.1
MarkupSafe @ file:///home/conda/feedstock_root/build_artifacts/markupsafe_1648737551960/work
matplotlib @ file:///home/conda/feedstock_root/build_artifacts/matplotlib-suite_1661439848456/work
mccabe==0.7.0
mock==5.2.0
mpi4py @ file:///home/conda/feedstock_root/build_artifacts/mpi4py_1660326262210/work
munkres==1.1.4
nc-time-axis==1.4.1
netCDF4 @ file:///home/conda/feedstock_root/build_artifacts/netcdf4_1661987221388/work
networkx==2.6.3
nose==1.3.7
numba==0.56.4
numpy @ file:///home/conda/feedstock_root/build_artifacts/numpy_1649806299270/work
olefile @ file:///home/conda/feedstock_root/build_artifacts/olefile_1701735466804/work
packaging @ file:///home/conda/feedstock_root/build_artifacts/packaging_1696202382185/work
partd @ file:///home/conda/feedstock_root/build_artifacts/partd_1695667515973/work
pathspec==0.11.2
pep8-naming==0.10.0
Pillow @ file:///tmp/build/80754af9/pillow_1625655818400/work
platformdirs==4.0.0
pluggy==1.2.0
prospector==1.10.3
prov==2.0.1
psutil==7.0.0
py==1.11.0
pycodestyle==2.9.1
pydocstyle==6.3.0
pydot==2.0.0
pyflakes==2.5.0
Pygments==2.17.2
pylint==2.17.7
pylint-celery==0.3
pylint-django==2.5.3
pylint-flask==0.6
pylint-plugin-utils==0.7
pyparsing @ file:///home/conda/feedstock_root/build_artifacts/pyparsing_1724616129934/work
pyproj @ file:///home/conda/feedstock_root/build_artifacts/pyproj_1636547699801/work
pyproject_hooks==1.2.0
pyroma==4.2
pyshp @ file:///home/conda/feedstock_root/build_artifacts/pyshp_1659002966020/work
pytest==7.4.4
pytest-asyncio==0.21.2
pytest-cov==4.1.0
pytest-env==1.0.1
pytest-flake8==1.1.3
pytest-html==3.2.0
pytest-metadata==3.0.0
pytest-mock==3.11.1
pytest-xdist==3.5.0
python-dateutil @ file:///home/conda/feedstock_root/build_artifacts/python-dateutil_1709299778482/work
pytz==2025.2
PyYAML @ file:///home/conda/feedstock_root/build_artifacts/pyyaml_1648757092905/work
rdflib==6.3.2
requests==2.31.0
requirements-detector==1.2.2
scipy @ file:///home/conda/feedstock_root/build_artifacts/scipy_1637806658031/work
scitools-iris @ file:///home/conda/feedstock_root/build_artifacts/iris_1637936208876/work
semver==3.0.4
setoptconf-tmp==0.3.1
Shapely @ file:///home/conda/feedstock_root/build_artifacts/shapely_1637399855493/work
six @ file:///home/conda/feedstock_root/build_artifacts/six_1620240208055/work
smmap==5.0.2
snowballstemmer==2.2.0
Sphinx==4.3.2
sphinx-rtd-theme==1.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jquery==4.1
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
stratify @ file:///home/conda/feedstock_root/build_artifacts/python-stratify_1620938361732/work
toml==0.10.2
tomli==2.0.1
tomlkit==0.12.5
toolz @ file:///home/conda/feedstock_root/build_artifacts/toolz_1706112571092/work
trove-classifiers==2025.3.19.19
typed-ast==1.5.5
typing_extensions @ file:///home/conda/feedstock_root/build_artifacts/typing_extensions_1688315532570/work
unicodedata2 @ file:///home/conda/feedstock_root/build_artifacts/unicodedata2_1649111917568/work
urllib3==2.0.7
vmprof==0.4.18.1
wrapt==1.16.0
xxhash @ file:///home/conda/feedstock_root/build_artifacts/python-xxhash_1649442453935/work
yamale==4.0.4
yamllint==1.32.0
yapf==0.43.0
zipp==3.15.0

name: ESMValCore
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=conda_forge
  - _openmp_mutex=4.5=2_gnu
  - antlr-python-runtime=4.7.2=py37h89c1867_1003
  - atk-1.0=2.38.0=h04ea711_2
  - binutils_impl_linux-64=2.43=h4bf12b8_4
  - binutils_linux-64=2.43=h4852527_4
  - brotli=1.1.0=hb9d3cd8_2
  - brotli-bin=1.1.0=hb9d3cd8_2
  - bzip2=1.0.8=h4bc722e_7
  - c-ares=1.34.4=hb9d3cd8_0
  - ca-certificates=2025.1.31=hbcca054_0
  - cairo=1.18.0=h3faef2a_0
  - cartopy=0.20.2=py37h9a08e6e_0
  - certifi=2024.8.30=pyhd8ed1ab_0
  - cf-units=3.0.1=py37hb1e94ed_2
  - cftime=1.6.2=py37hc105733_0
  - cloudpickle=2.2.1=pyhd8ed1ab_0
  - curl=8.8.0=he654da7_1
  - cycler=0.11.0=pyhd8ed1ab_0
  - cython=0.29.32=py37hd23a5d3_0
  - dask-core=2022.2.0=pyhd8ed1ab_0
  - esmf=8.2.0=mpi_mpich_h5a1934d_102
  - esmpy=8.2.0=mpi_mpich_py37h7352969_101
  - expat=2.6.4=h5888daf_0
  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0
  - font-ttf-inconsolata=3.000=h77eed37_0
  - font-ttf-source-code-pro=2.038=h77eed37_0
  - font-ttf-ubuntu=0.83=h77eed37_3
  - fontconfig=2.14.2=h14ed4e7_0
  - fonts-conda-ecosystem=1=0
  - fonts-conda-forge=1=0
  - fonttools=4.38.0=py37h540881e_0
  - freetype=2.12.1=h267a509_2
  - fribidi=1.0.10=h36c2ea0_0
  - fsspec=2023.1.0=pyhd8ed1ab_0
  - gcc_impl_linux-64=14.2.0=hdb7739f_2
  - gcc_linux-64=14.2.0=h5910c8f_8
  - gdk-pixbuf=2.42.10=h5eee18b_1
  - geos=3.10.1=h9c3ff4c_1
  - glib=2.80.2=hf974151_0
  - glib-tools=2.80.2=hb6ce0ca_0
  - graphite2=1.3.13=h59595ed_1003
  - graphviz=9.0.0=h78e8752_1
  - gtk2=2.24.33=h280cfa0_4
  - gts=0.7.6=h977cf35_4
  - harfbuzz=8.5.0=hfac3d4d_0
  - hdf4=4.2.15=h9772cbc_5
  - hdf5=1.12.2=mpi_mpich_h5d83325_1
  - icu=73.2=h59595ed_0
  - iris=3.1.0=pyhd8ed1ab_3
  - jinja2=3.1.4=pyhd8ed1ab_0
  - jpeg=9e=h0b41bf4_3
  - kernel-headers_linux-64=3.10.0=he073ed8_18
  - keyutils=1.6.1=h166bdaf_0
  - kiwisolver=1.4.4=py37h7cecad7_0
  - krb5=1.21.3=h659f571_0
  - lcms2=2.14=h6ed2654_0
  - ld_impl_linux-64=2.43=h712a8e2_4
  - lerc=4.0.0=h27087fc_0
  - libaec=1.1.3=h59595ed_0
  - libblas=3.9.0=20_linux64_openblas
  - libbrotlicommon=1.1.0=hb9d3cd8_2
  - libbrotlidec=1.1.0=hb9d3cd8_2
  - libbrotlienc=1.1.0=hb9d3cd8_2
  - libcblas=3.9.0=20_linux64_openblas
  - libcurl=8.8.0=hca28451_1
  - libdeflate=1.14=h166bdaf_0
  - libedit=3.1.20250104=pl5321h7949ede_0
  - libev=4.33=hd590300_2
  - libexpat=2.6.4=h5888daf_0
  - libffi=3.4.6=h2dba641_0
  - libgcc=14.2.0=h767d61c_2
  - libgcc-devel_linux-64=14.2.0=h9c4974d_102
  - libgcc-ng=14.2.0=h69a702a_2
  - libgd=2.3.3=h695aa2c_1
  - libgfortran=14.2.0=h69a702a_2
  - libgfortran-ng=14.2.0=h69a702a_2
  - libgfortran5=14.2.0=hf1ad2bd_2
  - libglib=2.80.2=hf974151_0
  - libgomp=14.2.0=h767d61c_2
  - libiconv=1.18=h4ce23a2_1
  - liblapack=3.9.0=20_linux64_openblas
  - liblzma=5.6.4=hb9d3cd8_0
  - liblzma-devel=5.6.4=hb9d3cd8_0
  - libnetcdf=4.8.1=mpi_mpich_hcd871d9_6
  - libnghttp2=1.58.0=h47da74e_1
  - libnsl=2.0.1=hd590300_0
  - libopenblas=0.3.25=pthreads_h413a1c8_0
  - libpng=1.6.43=h2797004_0
  - librsvg=2.58.0=hadf69e7_1
  - libsanitizer=14.2.0=hed042b8_2
  - libsqlite=3.46.0=hde9e2c9_0
  - libssh2=1.11.0=h0841786_0
  - libstdcxx=14.2.0=h8f9b012_2
  - libstdcxx-ng=14.2.0=h4852527_2
  - libtiff=4.4.0=h82bc61c_5
  - libudunits2=2.2.28=h40f5838_3
  - libunwind=1.7.2=he02047a_0
  - libuuid=2.38.1=h0b41bf4_0
  - libwebp-base=1.5.0=h851e524_0
  - libxcb=1.15=h0b41bf4_0
  - libxml2=2.12.7=hc051c1a_1
  - libzip=1.10.1=h2629f0a_3
  - libzlib=1.2.13=h4ab18f5_6
  - locket=1.0.0=pyhd8ed1ab_0
  - markupsafe=2.1.1=py37h540881e_1
  - matplotlib-base=3.5.3=py37hf395dca_2
  - mpi=1.0=mpich
  - mpi4py=3.1.3=py37h52370cb_2
  - mpich=4.0.3=h846660c_100
  - munkres=1.1.4=pyh9f0ad1d_0
  - ncurses=6.5=h2d0b736_3
  - netcdf-fortran=4.6.0=mpi_mpich_h1e13492_2
  - netcdf4=1.6.0=nompi_py37h7187172_102
  - numpy=1.21.6=py37h976b520_0
  - olefile=0.47=pyhd8ed1ab_0
  - openjpeg=2.5.0=h7d73246_1
  - openssl=3.4.1=h7b32b05_0
  - packaging=23.2=pyhd8ed1ab_0
  - pango=1.54.0=h84a9a3c_0
  - partd=1.4.1=pyhd8ed1ab_0
  - pcre2=10.43=hcad00b1_0
  - pillow=8.3.1=py37h2c7a002_0
  - pip=24.0=pyhd8ed1ab_0
  - pixman=0.44.2=h29eaf8c_0
  - proj=8.2.0=h277dcde_0
  - pthread-stubs=0.4=hb9d3cd8_1002
  - pyparsing=3.1.4=pyhd8ed1ab_0
  - pyproj=3.2.1=py37hb589d83_5
  - pyshp=2.3.1=pyhd8ed1ab_0
  - python=3.7.12=hf930737_100_cpython
  - python-dateutil=2.9.0=pyhd8ed1ab_0
  - python-stratify=0.1.1=py37h6f94858_1004
  - python-xxhash=3.0.0=py37h540881e_1
  - python_abi=3.7=4_cp37m
  - pyyaml=6.0=py37h540881e_4
  - readline=8.2=h8c095d6_2
  - scipy=1.7.3=py37hf2a6cf1_0
  - setuptools=69.0.3=pyhd8ed1ab_0
  - shapely=1.8.0=py37h9b0f7a3_4
  - six=1.16.0=pyh6c4a22f_0
  - sqlite=3.46.0=h6d4b2fc_0
  - sysroot_linux-64=2.17=h0157908_18
  - tk=8.6.13=noxft_h4845f30_101
  - toolz=0.12.1=pyhd8ed1ab_0
  - typing-extensions=4.7.1=hd8ed1ab_0
  - typing_extensions=4.7.1=pyha770c72_0
  - tzdata=2025b=h78e105d_0
  - udunits2=2.2.28=h40f5838_3
  - unicodedata2=14.0.0=py37h540881e_1
  - wheel=0.42.0=pyhd8ed1ab_0
  - xorg-kbproto=1.0.7=hb9d3cd8_1003
  - xorg-libice=1.1.2=hb9d3cd8_0
  - xorg-libsm=1.2.6=he73a12e_0
  - xorg-libx11=1.8.9=h8ee46fc_0
  - xorg-libxau=1.0.12=hb9d3cd8_0
  - xorg-libxdmcp=1.1.5=hb9d3cd8_0
  - xorg-libxext=1.3.4=h0b41bf4_2
  - xorg-libxrender=0.9.11=hd590300_0
  - xorg-renderproto=0.11.1=hb9d3cd8_1003
  - xorg-xextproto=7.3.0=hb9d3cd8_1004
  - xorg-xproto=7.0.31=hb9d3cd8_1008
  - xxhash=0.8.0=h7f98852_3
  - xz=5.6.4=hbcc6ac9_0
  - xz-gpl-tools=5.6.4=hbcc6ac9_0
  - xz-tools=5.6.4=hb9d3cd8_0
  - yaml=0.2.5=h7f98852_2
  - zlib=1.2.13=h4ab18f5_6
  - zstd=1.5.6=ha6fb4c9_0
  - pip:
      - alabaster==0.7.13
      - astroid==2.15.8
      - attrs==24.2.0
      - babel==2.14.0
      - build==0.10.0
      - charset-normalizer==3.4.1
      - click==8.1.8
      - click-plugins==1.1.1
      - cligj==0.7.2
      - colorama==0.4.6
      - coverage==7.2.7
      - dill==0.3.7
      - docutils==0.17.1
      - dodgy==0.2.1
      - easytest==0.1.5
      - exceptiongroup==1.2.2
      - execnet==2.0.2
      - fiona==1.9.6
      - flake8==5.0.4
      - flake8-polyfill==1.0.2
      - gitdb==4.0.12
      - gitpython==3.1.44
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.2.0
      - iniconfig==2.0.0
      - isodate==0.6.1
      - isort==5.11.5
      - lazy-object-proxy==1.9.0
      - llvmlite==0.39.1
      - lxml==5.3.1
      - mccabe==0.7.0
      - mock==5.2.0
      - nc-time-axis==1.4.1
      - networkx==2.6.3
      - nose==1.3.7
      - numba==0.56.4
      - pathspec==0.11.2
      - pep8-naming==0.10.0
      - platformdirs==4.0.0
      - pluggy==1.2.0
      - prospector==1.10.3
      - prov==2.0.1
      - psutil==7.0.0
      - py==1.11.0
      - pycodestyle==2.9.1
      - pydocstyle==6.3.0
      - pydot==2.0.0
      - pyflakes==2.5.0
      - pygments==2.17.2
      - pylint==2.17.7
      - pylint-celery==0.3
      - pylint-django==2.5.3
      - pylint-flask==0.6
      - pylint-plugin-utils==0.7
      - pyproject-hooks==1.2.0
      - pyroma==4.2
      - pytest==7.4.4
      - pytest-asyncio==0.21.2
      - pytest-cov==4.1.0
      - pytest-env==1.0.1
      - pytest-flake8==1.1.3
      - pytest-html==3.2.0
      - pytest-metadata==3.0.0
      - pytest-mock==3.11.1
      - pytest-xdist==3.5.0
      - pytz==2025.2
      - rdflib==6.3.2
      - requests==2.31.0
      - requirements-detector==1.2.2
      - semver==3.0.4
      - setoptconf-tmp==0.3.1
      - smmap==5.0.2
      - snowballstemmer==2.2.0
      - sphinx==4.3.2
      - sphinx-rtd-theme==1.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jquery==4.1
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - toml==0.10.2
      - tomli==2.0.1
      - tomlkit==0.12.5
      - trove-classifiers==2025.3.19.19
      - typed-ast==1.5.5
      - urllib3==2.0.7
      - vmprof==0.4.18.1
      - wrapt==1.16.0
      - yamale==4.0.4
      - yamllint==1.32.0
      - yapf==0.43.0
      - zipp==3.15.0
prefix: /opt/conda/envs/ESMValCore

tests/integration/test_recipe.py::test_wrong_project
tests/integration/test_recipe.py::test_simple_recipe tests/integration/test_recipe.py::test_cmip3_variable_autocomplete tests/integration/test_recipe.py::test_cmip6_variable_autocomplete tests/integration/test_recipe.py::test_custom_preproc_order tests/integration/test_recipe.py::test_derive tests/integration/test_recipe.py::test_derive_not_needed tests/integration/test_recipe.py::test_derive_with_fx_ohc tests/integration/test_recipe.py::test_derive_with_fx_ohc_fail tests/integration/test_recipe.py::test_derive_with_optional_var tests/integration/test_recipe.py::test_derive_with_optional_var_nodata tests/integration/test_recipe.py::test_diagnostic_task_provenance tests/integration/test_recipe.py::test_alias_generation tests/integration/test_recipe.py::test_concatenation tests/integration/test_recipe.py::test_ensemble_expansion tests/integration/test_recipe.py::test_weighting_landsea_fraction tests/integration/test_recipe.py::test_weighting_landsea_fraction_no_fx tests/integration/test_recipe.py::test_weighting_landsea_fraction_exclude tests/integration/test_recipe.py::test_landmask tests/integration/test_recipe.py::test_landmask_no_fx tests/integration/test_recipe.py::test_fx_vars_mip_change_cmip6 tests/integration/test_recipe.py::test_fx_vars_volcello_in_ofx_cmip6 tests/integration/test_recipe.py::test_fx_vars_volcello_in_omon_cmip6 tests/integration/test_recipe.py::test_fx_vars_volcello_in_oyr_cmip6 tests/integration/test_recipe.py::test_invalid_fx_var_cmip6 tests/integration/test_recipe.py::test_fx_var_invalid_project
tests/integration/test_recipe.py::flake-8::FLAKE8 tests/integration/test_recipe.py::test_fx_preproc_error tests/integration/test_recipe.py::test_default_preprocessor tests/integration/test_recipe.py::test_default_fx_preprocessor tests/integration/test_recipe.py::test_empty_variable tests/integration/test_recipe.py::test_cmip5_variable_autocomplete tests/integration/test_recipe.py::test_reference_dataset tests/integration/test_recipe.py::test_extract_shape tests/integration/test_recipe.py::test_extract_shape_raises[crop] tests/integration/test_recipe.py::test_extract_shape_raises[shapefile] tests/integration/test_recipe.py::test_extract_shape_raises[method] tests/integration/test_recipe.py::test_weighting_landsea_fraction_exclude_fail tests/integration/test_recipe.py::test_fx_vars_volcello_in_fx_cmip5
esmvalcore/_config.py esmvalcore/_recipe.py
esmvalcore/_config.py esmvalcore/_recipe.py