尝试在Makefile中加载模块环境时出错

use*_*191 3 bash makefile

我有一个makefile,我正在尝试在运行目标之前加载一些模块。这是makefile:

CC=g++        
all:
        . /usr/share/Modules/init/bash
        module load gcc/4.8.1
        module load opencv
        module load python/2.7.5
        $(CC) -std=gnu++11 -lstdc++ -fPIC -shared -o .......
clean:
        rm ../../lib/linux/extract_features.so
Run Code Online (Sandbox Code Playgroud)

但是当我运行make命令时,它给了我这个错误:

/usr/share/Modules/init/bash_completion: line 14: syntax error near unexpected token `('
/usr/share/Modules/init/bash_completion: line 14: ` comm -23  <(_module_avail|sort)  <(tr : '\n' <<<${LOADEDMODULES}|sort)'
/usr/share/Modules/init/bash_completion: line 14: warning: syntax errors in . or eval will cause future versions of the shell to abort as Posix requires
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)

如果我只是. /usr/share/Modules/init/bash在终端中运行,它不会给我任何错误。

如何在makefile中加载模块?有什么建议吗?

Eta*_*ner 5

运行make配方的默认shell /bin/sh不是/bin/bash。您可以通过分配给SHELL变量来覆盖它。(请注意.SHELLFLAGS在make 4.0中的添加。)

此外,配方的每一行都在其自己的Shell会话中运行,因此,像这样的一行module load opencv将在Shell会话中加载该模块,然后立即退出,因此下一行将module load python/2.7.5不会加载该模块。

您需要将所有命令写在一行上,或者通过\在每行的末尾使用来使它们成为连续的一行(并确保在shell行之间使用正确的;/ &/ etc。终止符(如make在运行时将其作为一行运行)。

CC=g++
SHELL:=/bin/bash

all:
        . /usr/share/Modules/init/bash; \
        module load gcc/4.8.1; \
        module load opencv; \
        module load python/2.7.5; \
        $(CC) -std=gnu++11 -lstdc++ -fPIC -shared -o .......

clean:
        rm ../../lib/linux/extract_features.so
Run Code Online (Sandbox Code Playgroud)