代码之家  ›  专栏  ›  技术社区  ›  Gergely

rm命令在shell中工作,但在Makefile中不工作

  •  0
  • Gergely  · 技术社区  · 10 月前

    我有一个 rm 该命令在Makefile中不起作用,但当我将其复制到shell时,它就起作用了:

    $ make clean
    rm paper.{abs,blg,pdf,aux,log,bbl,out,xmpdata}
    rm: cannot remove 'paper.{abs,blg,pdf,aux,log,bbl,out,xmpdata}': No such file or directory
    make: *** [Makefile:8: clean] Error 1
    $ rm paper.{abs,blg,pdf,aux,log,bbl,out,xmpdata}
    $
    

    是什么导致了这种情况?文件权限似乎还可以。我尝试在文件名表达式周围使用双引号和撇号,但都不起作用。

    更新:我在Ubuntu 22.04上运行GNU Make 4.3

    2 回复  |  直到 10 月前
        1
  •  1
  •   MadScientist    10 月前

    GNU Make运行POSIX兼容 /bin/sh 对于一个贝壳。如果它调用了用户正在使用的任何shell,那么可移植性将是一场灾难。

    这个 {} 您使用的表单不是符合POSIX的语法:POSIX没有为 {} .你正试图利用你的个人外壳的能力(可能 bash )这是非标准的。

    您要么需要写出多个文件名,要么使用标准的POSIX globbing,要么在makefile中添加一行,强制它使用bash而不是 /bin/sh ,例如:

    SHELL := /bin/bash
    

    请注意,您的makefile在以下任何系统上都无法正常工作: /bin/bash 不存在。

    你也可以使用GNU Make函数,例如:

    clean:
            rm $(addprefix paper.,abs,blg,pdf,aux,log,bbl,out,xmpdata)
    
        2
  •  0
  •   Gergely    10 月前

    按照这个答案: https://unix.stackexchange.com/a/270799/46710

    我能够在经典shell中做到这一点:

    define clean_aux_files =
    
            for e in abs blg pdf aux log bbl out xmpdata
            do 
              rm "paper.$e"
            done
    endef
    
    .ONESHELL:
    
    clean:  
            $(value clean_aux_files)
            rm pdfa.xmpi texput.log
    

    我测试了这个,它奏效了。