Как выполнить некоторые команды перед всем остальным?

#makefile #gnu-make

#makefile #gnu-make

Вопрос:

Я пишу makefile, который загрузит и соберет все программы, которые мне нужны, в кластере HPC. Прежде чем делать что-либо еще, я хочу, чтобы это запустило это:

 module add openmpi/1.8.4-gcc
module add slurm
  

Эти 2 команды изменяют некоторые переменные среды, такие как MPICC и PATH , чтобы я мог компилировать mpi-программы и планировать их запуск. Прямо сейчас они у меня в руках .bashrc . Как мне переместить их оттуда в мой makefile?

Ответ №1:

Если вы запустите их перед запуском make , это сработает. Если вы хотите, чтобы эти строки отображались в Makefile , вы можете использовать .ONESHELL:

В противном случае make будет генерироваться по одному процессу оболочки на строку, что сделает module load строки бесполезными.

 $ cat Makefile
CC=g  
SHELL=/bin/bash

.ONESHELL:
all:
    module load R
    R --version
  

Пока модуль не загружен

 $ R
-bash: R: command not found
  

запуск make будет успешным:

 $ make
module load R
R --version
R version 3.2.1 (2015-06-18) -- "World-Famous Astronaut"
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-unknown-linux-gnu (64-bit)
[...]
  

Но для этого потребуется, чтобы каждое правило включало module load команды.