必须在创建目标之前加载模块

问题描述 投票:0回答:1

我需要确保某些模块已加载,以继续进行构建过程。我需要一个可以制作一个或多个程序(子模型)的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,则它应该创建所有三个子模型,但是如果指定了特定目标,则应该仅创建那个子模型。

谢谢

makefile
1个回答
0
投票

免责声明:我不是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>
© www.soinside.com 2019 - 2024. All rights reserved.