我有一个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中加载模块?有什么建议吗?
运行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)