Makefile .tar:扁平化源文件的目录结构

Makefile .tar: Flatten the source files' directory structure

我想收集一些源文件并 tar 使用 Makefile。源文件分布如下:

  project
    │
    ├── Makefile
    │
    ├── folder(name is arbitrary)
    │    │
    │    ├── test1.txt
    │    ├── test2.txt
    │    .
    │    .
    │    .
    │ 
    ├── source.cpp
    │
    ├── source2.cpp
    │
    ├── source.h
    .
    .

现在,当我在根目录中调用 make 时,我想要一个扁平化的 tarball 文件,其中包含此 tarball 文件根目录下的所有源文件目录(项目),像这样:

 myTarball.tar.gz
    │
    ├── Makefile
    │
    ├── source.cpp
    │
    ├── source2.cpp
    │
    ├── source.h
    │
    ├── test1.txt
    │
    ├── test2.txt
    │
    .
    .
    .

当前的 make 文件看起来像这样:

FILES=$($(wildcard Makefile *.h *.hpp *.cpp test*.txt */test*.txt))

$(NAME): $(FILES)
    COPYFILE_DISABLE=true tar -vczf $(NAME) $(FILES)

我对 makefile 和 bash 不熟悉,但我尽力尝试并进行了一些搜索,但一无所获。当前的只能生成类似

的东西
  NAME.tar.gz
    │
    ├── Makefile
    │
    ├── folder
    │    │
    │    ├── test1.txt
    │    ├── test2.txt
    │    .
    │    .
    │    .
    │ 
    ├── source.cpp
    │
    ├── source2.cpp
    │
    ├── source.h
    .
    .

与文件夹结构。我想我可能会先将文件夹中的所有源文件复制到根目录,然后在 tar 之后删除它们。有没有更好的方法来优雅地做到这一点?

好吧,你可以这样做,但是如果你使用 GNU tar 那么让 tar 为你完成工作可能比将文件复制到临时文件更简单位置第一。

像这样的东西应该可以工作:

$(NAME): $(FILES)
        COPYFILE_DISABLE=true tar -vczf $(NAME) --transform='s,.*/,,' $(FILES)

这将从生成的 tar 文件中的文件中删除所有目录。请参阅 --transform 选项的手册。