2016-06-10 2 views
0

Я пытаюсь написать Makefile, который возьмет директорию, в которой есть некоторые файлы.Как создать каталоги, используя имя исходных файлов с помощью make

file1.txt file2.txt file3.txt other.conf

Я хочу создавать папки file1/ file2/ file3/ с соответствующим файлом и other.conf в там

Затем я хочу, чтобы пронестись эту папку.

Моя проблема с моим текущим Makefile заключается в том, что я не уверен, как создавать папки и объекты на основе имени файла. Я даже не уверен, что это возможно.

Мой текущий Makefile

[email protected] -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

Если у вас есть переменная $ (имя файла), который является примером file1/file1.txt вы можете получить 'file1', как это: $ (basename $ (notdir $ (имя файла))). Теперь я не уверен, как это может быть в целевом имени, и я не могу проверить его на данный момент. Если переменная является file1.txt, у вас будет полный путь и имя: $ (basename $ (filename))/$ (filename) – Tim

+0

Является ли каталог значительным артефактом вашего процесса сборки? Или вам нужен только zip-файл в качестве вывода? – Leon

+0

@Leon Каталог не имеет значения. Мне просто нужен zip-файл в конце – cmp

ответ

2

Я до сих пор не знаете, как сделать общую цель на основе имени файла.

Обычно вы используете pattern rule, , например.

Makefile

files := file1.txt file2.txt file3.txt 
zips := $(files:.txt=.zip) 

.PHONY: all clean 

all: $(zips) 

%.zip: %.txt other.conf 
    zip [email protected] $^ 

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?

+0

Есть ли способ сделать список файлов автоматически всеми файлами с расширением .txt? – cmp

+0

@cmp Да. См. Обновление. –

0

Если каталог не является значительным артефактом процесса сборки, то вы можете создать скрипт простой оболочки (скажем create_zip) и использовать его в Makefile следующим образом:

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 [email protected]; 
do 
    cp $startdir/$file $name 
done 

zip -r $startdir/$name.zip $name 
+1

Это страдает от * синдрома * bash * всего мира, недостаточно двойного цитирования и бесполезной точки с запятой. – Jens

Смежные вопросы