bash - 尝试在 makefile 中加载模块环境时出错

标签 bash 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

但是当我运行 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/

相关文章:

bash - 没有子文件夹的文件夹数量

c++ - 如何在配置中禁用 "compiler does not halt on function prototype mismatch"错误?

c# - Arquivo 制作意大利面的入口文件

android - Mac 非法指令 : 4

c++ - 一个源代码需要在多台机器上进行不同的编译

linux - 如何使用 bash 脚本将一行中的一些重复模式分成多行?

linux - 检查数组元素是否在文件中

mysql - 使用 bash 脚本运行带重音符号 (`) 的 MySQL 命令

Linux AWK - 拆分文件时自定义文件名

makefile - 从 makefile 生成 VHDL 条件