我需要确保某些模块已加载,以继续进行构建过程。我需要一个可以制作一个或多个程序(子模型)的Makefile。
我目前拥有的是:
all : submodel_01 submodel_02 submodel_03
check-modules: load_modules.sh
@if [ -z "${MODULES_LOADED}" ]; then \
echo "Please run"; \
echo "source $<"; \
echo "first."; \
exit 1; \
fi
.PHONY: check-modules
load_modules.sh:
@echo "export MODULES_LOADED=yes" > $@
@echo "module load intel-compiler" >> $@
@echo "module load openmpi" >> $@
submodel_01: check-modules
<command to make submodel_01>
submodel_02: check-modules
<command to make submodel_02>
submodel_03: check-modules
<command to make submodel_03>
这有点用,但不是很优雅。我宁愿让make本身加载模块,然后运行一个加载模块的子make进程。
我想确保保留原始的预期目标。因此,如果我仅运行make
,则它应该创建所有三个子模型,但是如果指定了特定目标,则应该仅创建那个子模型。
谢谢
免责声明:我不是MPI专家,我无法测试。
我相信,要使module load
命令起作用,它必须由父进程执行(在运行Makefile之前),或在需要环境的同一Shell中执行。
鉴于每个单独的操作都在单独的shell中运行,我认为以下操作将不起作用-设置不会传递给第二个命令。 (建议您尝试一下,以防万一。)
submodel_01:
source load_modules.sh
<command that depends on modules>
但是,这应该起作用
submodel_01:
source load_modules.sh ; <commands that depends on modules.sh>