我有一个 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
但是当我运行 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
如果我只是运行 。/usr/share/Modules/init/bash
在终端中,它没有给我任何错误。
如何在 makefile 中加载模块?有什么建议吗?
最佳答案
运行 make 配方的默认 shell 是 /bin/sh
而不是 /bin/bash
。您可以通过分配给 SHELL
来覆盖它多变的。 (注意在 make 4.0 中添加了 .SHELLFLAGS
。)
此外,配方的每一行都在其自己的 shell session 中运行,因此像 module load opencv
这样的行将在 shell session 中加载该模块,然后 立即 退出所以下一行 module load python/2.7.5
不会加载它。
您需要将所有命令写在一行中,或者通过在每行末尾使用 \
告诉 make 它们是一个连续的行(并确保具有正确的 ;
/&
/etc. shell 行之间的终止符(因为 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
关于bash - 尝试在 makefile 中加载模块环境时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32217413/