Makefile 不会卸载冲突模块

Makefile won't unload conficting module

我有一个 Makefile 我在 Linux 上通过 Eclipse 运行。它具有以下形式:

SHELL:=/bin/bash
all:
     module unload conflicting/module/1.2.3
     module load correct/module/1.2.3
     ifort myStuff

当我告诉 Eclipse “全部构建”时,出现以下错误:

 correct.module.123(23):ERROR:150: Module 'correct/module/1.2.3' conflicts with the currently loaded module(s) 'comflicting/module/1.2.3'

我知道模块冲突,所以我卸载了第一个...

问题是您的食谱的每一行都在单独的 shell 中运行。因此,从 make 的父 shell 继承了它的环境,你的

    module unload conflicting/module/1.2.3

行从 运行 所在的 shell 正确地卸载了指定的模块,但这只影响 shell。 module load 命令也从父 shell 继承了它的环境,并且由于它不受配方中上一个命令的影响,它仍然包含冲突模块。

至少有两种可能的解决方案:

  1. 从 makefile 中删除环境模块操作。通常认为用户有责任为要执行的构建适当地设置 make 的环境。特别是,环境模块操作非常 system-specific -- 有些系统甚至没有 module 命令,模块名称和可用模块列表不一定一致 -- 我不认为属于生成文件。

  2. 但是,如果您坚持进行模块操作,那么请将您的多行配方转换为单行(逻辑)配方:

    SHELL:=/bin/bash
    all:
        module unload conflicting/module/1.2.3; \
          module load correct/module/1.2.3; \
          ifort myStuff
    

    end-of-line 反斜杠导致 make 将多个物理行连接成一个逻辑行,然后需要分号将该行分成多个单独的命令。