在Makefile规则中执行Shell命令

时间:2016-07-23 09:28:34

标签: bash unix makefile

我正在尝试从Makefile规则部分运行shell命令。我使用basename命令获取文件名无法通过$$file提供正确的文件名。有人请,帮忙。

for file in `ls *.fof`; \
   do \
   $(eval VIP = `basename $$file .fof`) \
   echo "filename with ext. is $$file"; \
   echo "filename is $(VIP)";\
done               

2 个答案:

答案 0 :(得分:2)

虽然你可以通过这种方式实现目标,但几乎不需要 basename (1)。

  • 在shell中,模式${file##*/}删除了目录,${file%.*}删除了扩展名。作为内置函数,它们比调用可执行文件更快。

  • 在GNU make中,你有$(notdir $(basename $(file)))。 BSD制作有类似的。

我尽量避免make中的循环。要完成你正在做的事情,我可能会做类似

的事情
.SUFFIXES = .fof .T
NAMES=$(wildcard *.fof)

all: $(subst .fof,.T,$(NAMES))

.fof.T: 
        echo "filename with ext. is $^"
        echo "filename is $(notdir $(basename($@)))"

答案 1 :(得分:0)

我可以通过小改动来实现它:

all:
    for file in `ls *.txt`; \
       do \
       VIP=`basename $$file .txt` ;\
       echo "filename with ext. is $$file"; \
       echo "filename is $$VIP";\
    done   
  1. VIP=
  2. 中的更改
  3. 最后一个回音使用$$VIP