Создайте файл для проверки орфографии

#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 правиле) на вкладку.