【发布时间】:2021-11-13 05:05:52
【问题描述】:
类似于here的问题,但对于我的用例,我想放在makefile中。
#!/bin/bash
# Example:
# make run TEST_CASE="testbench.sv"
# make clean
compile:
vcs $(TEST_CASE) -sverilog;
run: compile
./simv
uvm_compile:
vcs $(TEST_CASE) -sverilog;
clean:
shopt -s extglob;
rm -v !(*.sv|*svh|"makefile");
make clean 中存在问题,结果如下:
ycliao@localhost:[~/workspace/i2c_vip/uvm_practice]: make clean
shopt -s extglob;
rm -v !(*.sv|*svh|"makefile");
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `rm -v !(*.sv|*svh|"makefile");'
make: *** [clean] Error 1
【问题讨论】:
-
在配方的第一行添加一个续行(反斜杠)。确保它是该行的最后一个字符。编写配方时,这两行代码在两个不同的 shell 中执行,
extglob选项仅针对第一个 shell 设置。其他可能性:使用.ONESHELLGNU make 功能或将配方写在一行上。注意:除了clean配方的第一行,其他所有分号都没用。 -
正如您提到要添加的“反斜杠”,我不明白这一点。你能告诉我如何修改当前代码吗?非常感谢。
-
你知道反斜杠是什么吗?它看起来像这样:\.只需在行尾添加一个
shopt -s extglob;。 -
即使这样,它也不会按原样工作。至少,不是便携的。该行为在 POSIX shell 中不可用,它只能在 bash 中工作。但是make默认不调用bash,它调用
/bin/sh。在某些系统上,/bin/sh实际上是 bash,它会起作用。在其他系统上,/bin/sh是一个简单的 POSIX shell,它会失败。如果您想始终使用bash,则必须设置变量SHELL = /bin/bash。 -
感谢您的回复,所以在makefile中没有``` shopt -s extglob ``` ?