Makefile: пара вопросов о синтаксисе - PullRequest
0 голосов
/ 05 мая 2010
  • package_version: = $ (версия) x0d $ (дата)

    что такое часть x0d между версиями и датами?это просто строка?

  • Что $ (dotin_files: .in =) делает ниже

код

dotin_files       := $(shell find . -type f -name \*.in)
dotin_files       := $(dotin_files:.in=)
  • что это значит $ (dotin_files: =. In)

код

$(dotin_files): $(dotin_files:=.in)
 $(substitute) $@.in > $@
  • может ли цель содержать несколько файлов?

  • что означает объявление целевой переменной как PHONY?

код

.PHONY: $(dotin_files)
  • В коде замены регулярного выражения ниже

код

substitute := perl -p -e 's/@([^@]+)@/defined $$ENV{$$1} ? $$ENV{$$1} : $$&/ge'

Что такое $$ENV{$$1} и $$&?Я предполагаю, что это область действия Perl ...

спасибо за ваше время

Ответы [ 3 ]

2 голосов
/ 05 мая 2010

Расширение переменной

$() - это расширение переменной в make, это должна быть просто подстановка строк - если ваш make-файл имеет значение

version=1
date=1.1.10
package_version:=$(version)x0d$(date)

, тогда переменная package_version расширится до 1x0d1.1.10.

Замена

Синтаксис $(var:a=b) является ссылкой для подстановки и расширится до var с суффиксом a, замененным на b.

Например, в

foobar:= foo bar
faabar:=$(foobar:oo=aa)

$(faabar) расширится до строки faa bar.

Несколько целей

Несколько целей в правиле make эквивалентны наличию n правил с одной целью, например

foo bar:foo.c bar.c
     $(CC) -o $@ $^

эквивалентно

foo:foo.c bar.c
     $(CC) -o $@ $^
bar:foo.c bar.c
     $(CC) -o $@ $^

помните, что все переменные здесь раскрываются.

Ложные цели

Цель .PHONY объявляет, что правило не создает фактический файл, поэтому оно всегда будет построено. Как всегда, переменные раскрываются первыми. В вашем случае это расширится до что-то вроде

.PHONY: foo bar

Экранирование

Знак доллара - это escape-символ в make-файлах, $$ в вашем примере perl - это литерал $, например, substitute будет строкой

perl -p -e 's/@([^@]+)@/defined $ENV{$1} ? $ENV{$1} : $&/ge'

Знаки доллара здесь обрабатываются perl и, вероятно, дают переменные окружения (я не знаю perl).

1 голос
/ 05 мая 2010
  • x0d часть между версией и датой, это просто строка?
    Да.

  • Что $ (dotin_files: .in =) делает ниже
    Удаляет .in из имен файлов, найденных с помощью команды find.

  • что это значит $ (dotin_files: =. In)
    Я думаю, что вы имели в виду $ (dotin_files: .in =). Как уже отвечалось, в переменной dotin_files он заменяет любое вхождение ".in" пустой строкой (часть между "=" и ")".

  • может содержать несколько файлов?
    Да

  • что означает объявление целевой переменной как PHONY?
    make игнорирует временную отметку целей и считает их новыми таким образом восстанавливая их каждый раз.

  • В коде замены регулярного выражения ниже указаны $$ ENV {$$ 1} и $$ &?

Чтобы избежать расширения $ ENV, $ удваивается, представьте «%» в строках формата C, таким образом, строку
perl -p -e 's / @ ([^ @] +) @ / определено $$ ENV {$$ 1}? $$ ENV {$$ 1}: $$ & / ge '
при вызове команды оболочки становится:
perl -p -e 's / @ ([^ @] +) @ / определено $ ENV {$ 1}? $ ENV {$ 1}: $ & / ge '

$ ENV - это хеш perl Environment, $ 1 Я думаю, что это обратная ссылка в группе s /// regexp.

1 голос
/ 05 мая 2010

Майкл, ты задавал много базовых вопросов по Makefile, и те, которые ты спрашиваешь сейчас, - это те, на которые ты должен ответить сам экспериментом.

can target contain multiple files?

Попробуйте:

dotin_files := foo.in bar.in

$(dotin_files):
    @echo $@

Теперь попробуйте make foo.in и make bar.in. Что происходит?

What $(dotin_files:.in=) does

Это ссылка на замену. Попробуйте сами и посмотрите, что произойдет, вот так:

dotin_files := foo.in bar.in
dotin_files := $(dotin_files:.in=)

all:
    @echo $(dotin_files)

Что это сделало?

substitute := perl -p -e 's/@([^@]+)@/defined $$ENV{$$1} ? $$ENV{$$1} : $$&/ge'
what are $$ENV{$$1} and $$&? I guess it's Perl scope...

Давайте посмотрим:

all:
    @echo $(substitute)

Если вы хотите узнать больше о Perl, или регулярных выражениях, или найти, или сделать, или что-то еще, не стесняйтесь спрашивать здесь, но, пожалуйста, потратьте немного времени, чтобы попытаться выяснить это в первую очередь.

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