我正在尝试编写一个Makefile,它将获取一个包含一些文件的目录。
file1.txt file2.txt file3.txt other.conf
我想使用相应的文件和其他文件
创建文件夹file1/ file2/ file3/
然后我想要压缩该文件夹。
我当前Makefile的问题是我不确定如何根据文件名创建文件夹和目标。我甚至不确定它是否可能。
我当前的makefile
dir_guard=@mkdir -p $(@D)
CP=cp -r
file1/file1.txt: file1.txt
$(dir_guard)
cp file1.txt file1/file1.txt
file1/other.conf: other.conf
$(dir_guard)
cp other.conf file1/other.conf
file1.zip: file1/other.conf file1/file1.txt
zip file1.zip $?
build: file1.zip
clean:
-rm -r *.zip
答案 0 :(得分:2)
我仍然不确定如何根据文件名制作通用目标。
通常你使用pattern rule, e.g。
<强>生成文件强>
files := file1.txt file2.txt file3.txt
zips := $(files:.txt=.zip)
.PHONY: all clean
all: $(zips)
%.zip: %.txt other.conf
zip $@ $^
clean:
rm -fr *.zip
将运行如下:
$ make
zip file1.zip file1.txt other.conf
adding: file1.txt (stored 0%)
adding: other.conf (stored 0%)
zip file2.zip file2.txt other.conf
adding: file2.txt (stored 0%)
adding: other.conf (stored 0%)
zip file3.zip file3.txt other.conf
adding: file3.txt (stored 0%)
adding: other.conf (stored 0%)
其他婴儿床:
(files:.txt=.zip)
zip $@ $^
这是the manual。
<强>后来强>
有没有办法自动生成所有文件列表,扩展名为.txt?
files := $(wildcard *.txt)
答案 1 :(得分:0)
如果目录不是构建过程的重要工件,那么您可以创建一个简单的shell脚本(比如create_zip
)并在makefile中使用它,如下所示:
<强>生成文件强>
...
file1.zip: file1.txt other.conf
create_zip $?
<强> create_zip 强>
#!/bin/bash
startdir=$(pwd)
tmpdir=$(mktemp -d)
trap "rm -rf $tmpdir" EXIT
cd $tmpdir
name=$(basename $1|sed -e 's/\.[^.]\+//')
mkdir $name
for file in $@;
do
cp $startdir/$file $name
done
zip -r $startdir/$name.zip $name