Fcm_make: cannot access compiler libraries

Dear Cylc Discourse.

Thanks very much for all previous help migrating Cylc7 → Cylc8. I feel I am almost there, but have encountered an odd conflict between GCC and Intel. Hoping someone can help!

Basically, I have got Cylc8 installed in a venv I believe correctly (on Polar, an HPC at UKCEH in the UK). Polar has only GCC compilers installed at the moment, not Intel, but I think this should be possible to use for JULES because JULES can work with both.

Below is my recent support request to IT at UKCEH. I can run JULES to completion on command line and using a batch script, but when I try to run it through Cylc using cylc vip, I find that Cylc8 tries to access an Intel module called oneapi/compilers/24.2.0. It doesn’t find this on Polar.

Is there any way to make it so that Cylc8 uses an equivalent GCC module (if there is one)? Or is it the case that Cylc8 will only work with Intel?

Thanks very much

Toby M

========================================(Below is my email train with UKCEH IT the other day):

Hi Toby,

The problem is that Cylc (or something else) is trying to load the Intel OneAPI module and right now Polar only has GCC compilers installed. I.E.

module --ignore_cache load “oneapi/compilers/24.2.0”

Can you tell it to use GCC? If not I’m afraid this will not work until I get spare time to install the Intel toolchain.

Kind Regards,
xxxxxxx
IT Support Team

You can access this ticket via the customer portal at: xxxxxx

Conversation history:
Hi IT,

Could I check an error message from Polar with you please?

I have found (with Andy’s and Madhvi’s help) that I can compile and run JULES on Polar with the correct NetCDF libraries on the command line. That’s a big win!

The next step is to run JULES through the Cylc8 workload scheduler program. I’m trying that today. Unfortunately, I get a missing module error below.

Could I possibly ask someone to have a look at this?

Very many thanks!

Toby

###############################################################
#Basically, I did the following today:
module use /gpfs01/modules/mk2/all
module load gompi/2023b
module load Python/3.11.5-GCCcore-13.2.0
PYTHONPATH=“PYTHONPATH=$(echo $PYTHONPATH | cut -d: -f1)”
export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
module load Perl-bundle-CPAN/5.38.0-GCCcore-13.2.0
module load netCDF-Fortran/4.6.1-gompi-2023b

#and I have these environment variables set up:
(MetEtc) [tobmar@wlsc-polarln01 cylc-src]$ echo $WFLW
/home/tobmar/cylc-src/u-do301
(MetEtc) [tobmar@wlsc-polarln01 cylc-src]$ echo $CSUITE
/home/tobmar/cylc-run/u-do301
(MetEtc) [tobmar@wlsc-polarln01 cylc-src]$ echo $LOGSF
/home/tobmar/cylc-run/u-do301/runN/log/job/1/fcm_make/NN/
(MetEtc) [tobmar@wlsc-polarln01 cylc-src]$

#and then I run JULES through Cylc8:
(MetEtc) [tobmar@wlsc-polarln01 cylc-src]$ cylc vip $WFLW
$ cylc validate /home/tobmar/cylc-src/u-do301
Valid for cylc-8.4.2
$ cylc install /home/tobmar/cylc-src/u-do301
INSTALLED u-do301/run3 from /gpfs01/home/tobmar/cylc-src/u-do301
NOTE: 1 run of “u-do301” is already active:
:play_button: u-do301/run2 wlsc-polarln01:43095 2744979
You can stop it with:
cylc stop u-do301/run2
See “cylc stop --help” for options.
$ cylc play u-do301/run3

:black_small_square: ■ Cylc Workflow Engine 8.4.2
██ Copyright (C) 2008-2025 NIWA
▝▘ & British Crown (Met Office) & Contributors

INFO - Extracting job.sh to /gpfs01/home/tobmar/cylc-run/u-do301/run3/.service/etc/job.sh
u-do301/run3: wlsc-polarln01 PID=2756139
(MetEtc) [tobmar@wlsc-polarln01 cylc-src]$ LOGSF=$CSUITE/runN/log/job/1/fcm_make/NN/

#Looking at the error file, I find that the model has failed to compile:
(MetEtc) [tobmar@wlsc-polarln01 cylc-src]$ mousepad $LOGSF/job.err &

"flatpak: /gpfs01/apps/mk2/util-linux/2.39-GCCcore-13.2.0/lib/libmount.so.1: version MOUNT_2_40' not found (required by /lib64/libgio-2.0.so.0) flatpak: /gpfs01/apps/mk2/util-linux/2.39-GCCcore-13.2.0/lib/libmount.so.1: version MOUNT_2_40’ not found (required by /lib64/libgio-2.0.so.0)
Lmod has detected the following error: The following module(s) are unknown:
“oneapi/compilers/24.2.0”

Please check the spelling or version number. Also try “module spider …”
It is also possible your cache file is out-of-date; it may help to try:
$ module --ignore_cache load “oneapi/compilers/24.2.0”

Also make sure that all modulefiles written in TCL start with the string
#%Module

2025-05-15T09:59:22Z CRITICAL - failed/ERR"

#From a previous query (Support Ticket 135533), I know to ignore the ‘flatpak’ bit at the top: the missing module seems to be the problem.
#This is doubly strange for me because the model does compile successfully outside Cylc, as I can demonstrate by immediately trying that (in the same session):
(MetEtc) [tobmar@wlsc-polarln01 cylc-src]$ cd $JULES_ROOT;fcm make -j 2 -f etc/fcm-make/make.cfg --new; echo -e “\a”
[init] make # 2025-05-15T10:02:38Z
[info] FCM 2021.05.0 (/gpfs01/home/tobmar/.local/fcm)
[init] make config-parse # 2025-05-15T10:02:38Z
[info] config-file=/gpfs01/home/tobmar/MODELS/vn7.7_cmfr/etc/fcm-make/make.cfg
[info] config-file= - /gpfs01/home/tobmar/MODELS/vn7.7_cmfr/etc/fcm-make/platform/ceh.cfg
[info] config-file= - - /gpfs01/home/tobmar/MODELS/vn7.7_cmfr/etc/fcm-make/platform/envars.cfg
[info] config-file= - - /gpfs01/home/tobmar/MODELS/vn7.7_cmfr/etc/fcm-make/platform/load_settings.cfg
[info] config-file= - - - /gpfs01/home/tobmar/MODELS/vn7.7_cmfr/etc/fcm-make/remote/local.cfg
[info] config-file= - - - /gpfs01/home/tobmar/MODELS/vn7.7_cmfr/etc/fcm-make/compiler/gfortran_10_plus.cfg
[info] config-file= - - - /gpfs01/home/tobmar/MODELS/vn7.7_cmfr/etc/fcm-make/build/normal.cfg
[info] config-file= - - - /gpfs01/home/tobmar/MODELS/vn7.7_cmfr/etc/fcm-make/omp/noomp.cfg
[info] config-file= - - - /gpfs01/home/tobmar/MODELS/vn7.7_cmfr/etc/fcm-make/ncdf/netcdf.cfg
[info] config-file= - - - /gpfs01/home/tobmar/MODELS/vn7.7_cmfr/etc/fcm-make/coupler/nooasis.cfg
[info] config-file= - - - /gpfs01/home/tobmar/MODELS/vn7.7_cmfr/etc/fcm-make/mpi/nompi.cfg
[done] make config-parse # 0.9s
[init] make dest-init # 2025-05-15T10:02:39Z
[info] dest=tobmar@wlsc-polarln01:/gpfs01/home/tobmar/MODELS/vn7.7_cmfr
[info] mode=new
[done] make dest-init # 0.8s
[init] make extract # 2025-05-15T10:02:40Z
[info] location jules: 0: /gpfs01/home/tobmar/MODELS/vn7.7_cmfr
[info] dest: 626 [A added]
[info] source: 626 [U from base]
[done] make extract # 4.8s
[init] make preprocess # 2025-05-15T10:02:44Z
[info] sources: total=626, analysed=622, elapsed-time=0.3s, total-time=0.2s
[info] target-tree-analysis: elapsed-time=0.0s
[info] install targets: modified=116, unchanged=0, failed=0, total-time=0.1s
[info] process targets: modified=506, unchanged=0, failed=0, total-time=28.6s
[info] TOTAL targets: modified=622, unchanged=0, failed=0, elapsed-time=14.7s
[done] make preprocess # 15.0s
[init] make build # 2025-05-15T10:02:59Z
[info] sources: total=626, analysed=626, elapsed-time=1.5s, total-time=2.5s
[info] target-tree-analysis: elapsed-time=0.4s
[info] compile targets: modified=504, unchanged=0, failed=0, total-time=71.5s
[info] compile+ targets: modified=473, unchanged=0, failed=0, total-time=0.1s
[info] install targets: modified=1, unchanged=0, failed=0, total-time=0.0s
[info] link targets: modified=1, unchanged=0, failed=0, total-time=0.9s
[info] TOTAL targets: modified=979, unchanged=0, failed=0, elapsed-time=38.8s
[done] make build # 40.3s
[done] make # 61.9s

(MetEtc) [tobmar@wlsc-polarln01 vn7.7_cmfr]$

Hi @soi521

The good news is, Cylc imposes no requirements on software that you run inside tasks, for gcc libraries or anything else.

The bad news is, I suppose, that means we probably can’t help you much.

Generically, if this problem does not occur when you run JULES standalone, but it does when you run it as a Cylc 8 task, then something must be different in your standalone environment vs the task job environment, that sets or affects compiler choice for whatever your build system is.

Cylc certainly does not automatically set any environment variables, environment modules, or whatever, that have anything to do with compilers or build systems.

Some things that might help:

  • be aware of location and therefore environment differences between standalone and Cylc-submitted jobs (e.g. Cylc submits jobs where you tell it to, but maybe that’s different from standalone).
  • use cylc config to print the environment and script items of your JULES task, to see if the workflow configuration is providing any relevant environment variables or scripting (or examine the generated job script, to see the same)
    • (if there are any, that’s down to the user-defined workflow configuration, not Cylc itself)
  • check your global config platform definitions for settings that could affect task job environments, e.g.:
  • note you can manipulate the environment however you like in your task scripting, such as loading the right compiler modules (if your site has those) before running JULES
1 Like

Cylc does not use or require any compilers to be present on the system. The error above appears to be from an fcm_make task (a Rose thing) which does use a compiler.

We often need to add a pre script that loads / unloads certain modules in order to provide the task with the environment it requires, e.g:

[runtime]
    [[fcm_make]]
        pre-script = """
            module purge
            module load gcc
        """
        script = rose task-run