Makefile не выгружает конфликтующий модуль - PullRequest
1 голос
/ 04 августа 2020

У меня есть Makefile Я использую Eclipse на Linux. Он имеет следующий вид:

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

Когда я говорю Eclipse "Build All", я получаю следующую ошибку:

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

Я знаю конфликт модулей, поэтому я выгружал первый ...

1 Ответ

1 голос
/ 05 августа 2020

Проблема в том, что каждая строка вашего рецепта запускается в отдельной оболочке. Таким образом, унаследовав свое окружение от родительской оболочки make, ваша строка

    module unload conflicting/module/1.2.3

правильно выгружает указанный модуль из оболочки, в которой он работает, но это влияет только на эту оболочку. Команда module load также наследует свою среду от родительской оболочки, и, поскольку предыдущая команда в рецепте не повлияла на нее, она по-прежнему содержит конфликтующий модуль.

Есть как минимум два возможных решения:

  1. Убрать манипуляции с модулем окружения из make-файла. Обычно ответственность за настройку среды make для выполнения сборки возлагается на пользователя. В частности, манипуляции с модулями среды очень специфичны для системы c - в некоторых системах даже нет команды module, а имена модулей и список доступных модулей не обязательно согласованы - и я не думаю который принадлежит make-файлу.

  2. Но если вы настаиваете на манипуляциях с модулями, тогда преобразуйте свой многострочный рецепт в однострочный (-логический) рецепт:

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

    Обратные косые черты в конце строки приводят к тому, что make объединяет несколько физических строк в одну логическую строку, что затем требует точки с запятой, чтобы разбить эту строку на несколько отдельных команд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...