首页 > 解决方案 > Makefile 不会卸载冲突模块

问题描述

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

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'

我知道模块冲突,这就是我卸载第一个模块的原因......

标签: eclipsemakefilekernel-module

解决方案


问题是配方的每一行都在一个单独的外壳中运行。因此,从make的父 shell 继承了它的环境,你的

    module unload conflicting/module/1.2.3

line 从运行它的 shell 中正确卸载指定的模块,但这仅影响该 shell。该module load命令还从父 shell 继承其环境,并且由于不受配方中先前命令的影响,因此它仍然包含冲突模块。

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

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

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

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

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


推荐阅读