L oop через файлы в файле make - PullRequest
1 голос
/ 06 августа 2020

Прямо сейчас в моем make-файле есть следующее, чтобы создать символическую c ссылку на файл в моем текущем каталоге:

MY_FILE := "$(SOME_PATH)/file.txt"

ln -s $(MY_FILE)

Я бы хотел выполнить какую-то операцию с глобусом чтобы связать кучу файлов (или ни одного).

MY_FILES :=  "$(SOME_PATH)/*.txt"
for file in files:
   ln -s $(MY_FILE)     

Может ли кто-нибудь указать мне в правильном направлении, чтобы сделать это? Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Следующее должно делать то, что вы хотите:

MY_FILES := $(wildcard $(SOME_PATH)/*.txt)
LINKS    := $(notdir $(MY_FILES))

.PHONY: links clean-links
links: $(LINKS)

$(LINKS): %: $(SOME_PATH)/%
    ln -s $<

clean-links:
    rm -f $(LINKS)

Объяснение:

  1. Make functions. wildcard и notdir - это две функции make . Знание функций make (по крайней мере, наиболее часто используемых) действительно помогает писать красивые, элегантные и эффективные файлы make. Конечно, если у вас есть пробелы или специальные символы в именах файлов, вы столкнетесь с некоторыми проблемами, потому что большинство функций make рассматривают пробелы как разделители. Но если у вас есть такие имена файлов и каталогов, вам, вероятно, следует использовать что-то еще, кроме make.

  2. Stati c правила шаблона:

    $(LINKS): %: $(SOME_PATH)/%
    

    - это stati c шаблонное правило . Для каждого слова foo.txt в $(LINKS) он создает одно единственное правило make:

    foo.txt: $(SOME_PATH)/foo.txt
        ln -s $(SOME_PATH)/foo.txt
    

    Знание того, как использовать правила шаблона (stati c или нет), необходимо, если вы хотите писать компактные и общие c создавать файлы.

  3. Автоматические c переменные. $< - это make automati c переменная . В рецептах (часть правил, связанных с командами) он раскрывается как первое указанное обязательное условие. Есть много других c автоматических переменных, и они очень удобны для написания общих c правил.

  4. Фальшивые цели. links и clean-links являются фальшивыми целями , потому что они не соответствуют реальным файлам, которые мы хотим создать или обновить. Это своего рода короткое время для действий. make links создает все недостающие ссылки, а make clean-links удаляет их все. Поскольку make не имеет возможности угадать, что эти цели не являются обычными именами файлов, мы сообщаем ей об этом с помощью специальной цели .PHONY.

0 голосов
/ 06 августа 2020

Make создает «цели» из «предпосылок». В вашем случае MY_FILES содержит предпосылки для создания целей (ссылки). Правило для одного файла может выглядеть так:

file.txt: $(SOME_PATH)/file.txt
    ln -s $<

Вам нужно несколько файлов, и в этом случае мы можем использовать это шаблонное правило:

%.txt: $(SOME_PATH)/%.txt
    ln -s $<

Теперь вы можете создавать ссылки с помощью команд make:

make file.txt
make otherfile.txt

Наконец, мы рассмотрим функцию wildcard, чтобы получить все файлы, и функцию notdir, чтобы получить имена ссылок из имен файлов. Следующее правило распечатает все текстовые файлы и зависит от всех файлов в SOME_PATH, связанных с текущим рабочим каталогом:

MY_FILES := $(notdir $(wildcard $(SOME_PATH)/*.txt))
cat: $(MY_FILES)
    cat $^

%.txt: $(SOME_PATH)/%.txt
    ln -s $<
...