Проблема с файлом Makefile, начинающимся с "#" - PullRequest
3 голосов
/ 27 февраля 2010

У меня есть каталог "FS2", который содержит следующие файлы:

  • ARGH

  • это
  • что

У меня есть make-файл со следующим содержимым.

Template:sh= ls ./FS2/*
#all: $(Template)
        echo "Template is: $(Template)"
        touch all

Когда я запускаю «clearmake -C sun» и файл «all» не существует, я получаю следующий вывод:

"Template is: ./FS2/#ARGH# ./FS2/that ./FS2/this"

Изменение «this» или «that» не приводит к регенерации «all». При запуске с «-d» для отладки цель «all» зависит только от каталога «./FS2», а не от трех файлов в каталоге. Я определил, что когда он расширяет «Шаблон», «#» обрабатывается как начало комментария, а остальная часть строки игнорируется!

Проблема вызвана редактором, который при уничтожении оставляет вокруг файлы, которые начинаются с "#". Если один из этих файлов существует, то никакие изменения файлов в каталоге не приводят к повторному созданию «всех».

Хотя я не хочу, чтобы компиляция зависела от того, был ли изменен временный файл, и удалит ли он файл из переменной «Template», мне все еще интересно, как заставить это работать, если я это сделал хочу трактовать "# ARGH #" как имя файла, от которого зависит правило "all". Это вообще возможно?

Ответы [ 5 ]

3 голосов
/ 27 февраля 2010

У меня есть каталог "FS2", который содержит следующие файлы: # ARGH # ...

В этом и заключается ваша проблема. На мой взгляд, неразумно использовать «забавные» символы в именах файлов. Теперь я знаю, что эти символы разрешены, но это не делает их хорошей идеей (управляющие символы ASCII, такие как backspace, также допускаются с похожими раздражающими результатами).

Мне даже не нравятся пробелы в именах файлов, вместо этого я предпочитаю SomethingLikeThis для отображения независимых слов в имени файла, но, по крайней мере, инструменты для обработки пробелов во многих инструментах UNIX известны достаточно хорошо.

Я бы посоветовал переименовать файл, если он был одним из ваших, и сэкономить немного времени. Но, поскольку они являются временными файлами, оставленными после сбоя редактора, удалите их, прежде чем ваши правила начнут работать в make-файле. В любом случае, вам, вероятно, не стоит перестраивать на основе временного файла редактора.

Или используйте более целевой шаблон, например: Template:sh= ls ./FS2/[A-Za-z0-9]*, чтобы вообще обойти эти файлы (это только пример, вы должны убедиться, что он не исключает файлы, которые должны быть включены).

1 голос
/ 27 февраля 2010

Я не знаком с clearmake, но попробуйте заменить определение шаблона на

Template:sh= ls ./FS2/* | grep -v '#'

, чтобы имена файлов, содержащие #, не включались в $(Template).

1 голос
/ 27 февраля 2010

'#' является допустимым символом комментария Makefile, поэтому вторая строка игнорируется программой make.

Можете ли вы отфильтровать (с помощью grep) файлы, начинающиеся с #, и обработать их отдельно?

0 голосов
/ 28 февраля 2010

Если я действительно хочу, чтобы файл #ARGH# способствовал тому, нужно ли перестраивать цель all, а также включать ее в артефакты, создаваемые правилом, Makefile следует изменить так, чтобы строка

Template:sh= ls ./FS2/*

изменено на

Template=./FS2/*
Template_files:sh= ls $(Template)

Это работает, потому что $(Template) будет заменено литеральной строкой ./FS2/* после all и расширением $(Template_files).

Clearmake (и GNU make) затем используют ./FS2/* в качестве пути, содержащего подстановочный знак при оценке зависимостей, который расширяется до имен файлов ./FS2/#ARGH# ./FS2/that ./FS2/this, и $(Template_files) можно использовать в правилах, где список имен файлов необходимо.

0 голосов
/ 27 февраля 2010

Если clearmake следует тем же правилам, что и GNU make, то вы также можете переписать свою цель, используя что-то вроде Template := $(wildcard *.c), что немного более разумно для файлов с странными именами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...