我想收集一些源文件并使用Makefile对它们进行tar。源文件分布如下:
project
│
├── Makefile
│
├── folder(name is arbitrary)
│ │
│ ├── test1.txt
│ ├── test2.txt
│ .
│ .
│ .
│
├── source.cpp
│
├── source2.cpp
│
├── source.h
.
.
现在,我想要有一个扁平的tarball文件,它包含了当我在根目录(项目)中调用make
时,这个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 up后删除它们。有没有更好的方式来优雅地做到这一点?
好吧,你可以这样做,但是如果你使用GNU tar,那么让tar为你做这项工作可能更简单,而不是先将文件复制到一个临时位置。
应该这样做:
$(NAME): $(FILES)
COPYFILE_DISABLE=true tar -vczf $(NAME) --transform='s,.*/,,' $(FILES)
将从生成的tar文件内的文件中删除所有目录。--transform
选项请参考手册