#makefile #aspell
Вопрос:
Я пытаюсь настроить файл makefile так, чтобы я мог использовать aspell в нем для проверки папки с файлами .mb. Я не уверен, как его настроить, но я попробовал это:
spellcheck-en:
for f in src/docs/en/*.md; do aspell --lang=en check $f; done
Дело в том, что файл makefile не читает $f, поэтому, когда я запускаю «make spellcheck-en», я получаю это:
Error: You must specify a file name.
Error: You must specify a file name.
Error: You must specify a file name.
Error: You must specify a file name.
Error: You must specify a file name.
make: *** [Makefile:29: spellcheck-en] Error 255
Однако выполнение этого: «для f в src/docs/en/*.md; do aspell —lang=en проверьте $f; готово» на терминале не является проблемой. Есть ли другой способ указать $f в файле makefile?
Спасибо.
Комментарии:
1. Очевидно, вы хотите проверить
.mb
файлы, но вместо этого вы проверяете.tex
файлы. Это намеренно?2. Вы не должны использовать
@
их до ваших команд, конечно, не до тех пор, пока они все не заработают! Пожалуйста, удалите их, чтобы вы могли видеть, какие команды вызывает make (затем выберите cute и вставьте их сюда с форматированием). Кроме того, пожалуйста, покажите вызванную вами команду make, полученный результат (снова вырезайте и вставьте с форматированием). Выражение «выводит ошибку 255» на самом деле не очень помогает нам.3. И если это два разных файла makefile, я не понимаю, что должен делать первый, извините. Какой смысл работать
find
в строке рецепта и не использовать результат? Пожалуйста, четко объясните, какие файлы (.mb
,.tex
…) у вас есть, сколько у вас файлов makefile и как вы их назвали, какую команду вы вводите и копируете-вставляете именно то сообщение об ошибке, которое вы получаете.4. @RenaudPacalet Идея состояла в том, чтобы использовать основной файл makefile и вызвать инструкции во втором (основной-тот, в котором есть все полезные вызовы), поэтому найдите этот файл, а затем выполните проверку орфографии. Я также изменил часть .tex и забыл изменить ее позже (я получил это из некоторых инструкций с .tex). Я не уверен, могу ли я просто добавить вторую часть (инструкции 2-го файла) к моей первой вместо этого. Теперь, когда я изменил его на .tex, я получаю эту ошибку: make: MB_FILES: Такого файла или каталога нет. сделать: *** [Файл создания:29: проверка орфографии] Ошибка 127
5.
$
это особенное, чтобы сделать. Если вы хотите передать a$
в оболочку, вам нужно удвоить ее, чтобы избежать ее, поэтому вы напишете$$f
.
Ответ №1:
Этот ответ не касается ваших проблем, которые были исправлены в комментариях. Ваш файл Makefile, работающий после замены $f
на $$f
, не лучше, чем эквивалентный сценарий оболочки. У него есть 2 основных недостатка:
- если вы снова запустите ту же проверку и текстовые файлы не изменились, они будут проверены еще раз, что бесполезно,
- проверки не могут быть распараллелены.
Следующее решает эти два недостатка:
# File Makefile MDDIR := src/docs/en OKDIR := .ok MDFILES := $(wildcard $(MDDIR)/*.md) OKFILES := $(patsubst $(MDDIR)/%.md,$(OKDIR)/%,$(MDFILES)) .PHONY: spellcheck-en spellcheck-en: $(OKFILES) $(OKDIR)/%: $(MDDIR)/%.md | $(OKDIR) aspell --lang=en check
lt;
touch $@$(OKDIR):
mkdir -p $@.PHONY: clean
clean:
rm -rf $(OKDIR)
Если ты сейчас побежишь:make -j8 spellcheck-en
или просто (потому что быть первой целью
spellcheck-en
-это цель по умолчанию):make -j8
Вы будете проверять только файлы, которые изменились с момента последней проверки, и вы будете выполнять эти проверки параллельно с 8 заданиями одновременно.
Объяснения:
wildcard
иpatsubst
есть 2 функции GNU make.- Фальшивые цели объявляются в качестве предварительных условий
.PHONY
специальной цели. Это цели, которые не являются реальными файлами. Make должен знать о них, просто на случай, если файл с таким же именем существует. $(OKDIR)/%: $(MDDIR)/%.md | $(OKDIR) ...
это правило шаблона.| $(OKDIR)
является обязательным условием только для заказа.
Все это хорошо объяснено в руководстве GNU make.
Комментарии:
1. Спасибо, это звучит идеально. Однако я получаю эту ошибку: Makefile:28: *** отсутствует разделитель. Остановка. Эта строка соответствует этой: aspell —lang=en check $ Есть какие-нибудь идеи, почему это может быть? Я читал, что это проблема синтаксиса
2. Рецепты начинаются с вкладки, а не с пробелов. Итак, если вы скопировали вставку, вам нужно отредактировать и заменить начальные пробелы в четырех строках рецептов (2 в правиле шаблона, один в
$(OKDIR)
правиле и один вclean
правиле) на вкладку.