Makefile,替换先决条件自动变量中的路径

Makefile,替换先决条件自动变量中的路径,makefile,Makefile,我有以下规则: $ ls files a b c $ cat Makefile files.7z: ./files/* 7z a $@ $? 该规则将按如下方式执行: 7z a文件.7z文件/a文件/b文件/c 7z处理以/开头的路径,特别是在这种情况下,它将在存档中包含文件,而不包含路径。替换路径的最短方法是什么,首先是/中的$??(文件名可以有空格。)Makefile根本不能很好地处理空格(请参阅)。最简单的方法是在有空格的情况下使其失败,然后很容易: check: @ ls .

我有以下规则:

$ ls files
a b c
$ cat Makefile
files.7z: ./files/*
7z a $@ $?
该规则将按如下方式执行:

7z a文件.7z文件/a文件/b文件/c


7z处理以
/
开头的路径,特别是在这种情况下,它将在存档中包含文件,而不包含路径。替换路径的最短方法是什么,首先是
/
中的
$?
?(文件名可以有空格。)

Makefile根本不能很好地处理空格(请参阅)。最简单的方法是在有空格的情况下使其失败,然后很容易:

check:
    @ ls ./files/* | grep -q " "; \
      if [ $$? -ne 1 ]; then \
         echo "WE DO NOT SUPPORT FILENAMES WITH SPACES"; \
         exit 1; \
      fi

files.7z: ./files/* | check
    7z a $@ $(addprefix ./,$^)
注意:web上有一些带空格的文件名解决方案,但它们过于复杂,不易维护,而且比告诉客户/同事“我们不支持带空格的文件名”要麻烦得多