如何使用make的源文件名创建目录

时间:2016-06-10 16:52:26

标签: makefile

我正在尝试编写一个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

2 个答案:

答案 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%)

其他婴儿床:

这是the manual

<强>后来

  

有没有办法自动生成所有文件列表,扩展名为.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