Проблема в том, что каждая строка вашего рецепта запускается в отдельной оболочке. Таким образом, унаследовав свое окружение от родительской оболочки make
, ваша строка
module unload conflicting/module/1.2.3
правильно выгружает указанный модуль из оболочки, в которой он работает, но это влияет только на эту оболочку. Команда module load
также наследует свою среду от родительской оболочки, и, поскольку предыдущая команда в рецепте не повлияла на нее, она по-прежнему содержит конфликтующий модуль.
Есть как минимум два возможных решения:
Убрать манипуляции с модулем окружения из make-файла. Обычно ответственность за настройку среды make
для выполнения сборки возлагается на пользователя. В частности, манипуляции с модулями среды очень специфичны для системы c - в некоторых системах даже нет команды module
, а имена модулей и список доступных модулей не обязательно согласованы - и я не думаю который принадлежит make-файлу.
Но если вы настаиваете на манипуляциях с модулями, тогда преобразуйте свой многострочный рецепт в однострочный (-логический) рецепт:
SHELL:=/bin/bash
all:
module unload conflicting/module/1.2.3; \
module load correct/module/1.2.3; \
ifort myStuff
Обратные косые черты в конце строки приводят к тому, что make
объединяет несколько физических строк в одну логическую строку, что затем требует точки с запятой, чтобы разбить эту строку на несколько отдельных команд.