2010-05-05 4 views
0

код

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

cod е

$(dotin_files): $(dotin_files:=.in) 
$(substitute) [email protected] > [email protected] 
  • может предназначаться содержать несколько файлов?

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

код

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

код

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

какие $$ENV{$$1} и $$&? Я предполагаю, что это Perl сфера ...

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

ответ

2

Variable расширения

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

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

затем переменная package_version будет расширена до 1x0d1.1.10.

Замена

Синтаксис $(var:a=b) является substitution reference и будет расширяться var с суффиксом a замещенным b.

Например, в

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

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

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

Множественные цели в правиле макияжем эквивалентно тому, что п правил с одной целью, например

foo bar:foo.c bar.c 
    $(CC) -o [email protected] $^ 

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

foo:foo.c bar.c 
    $(CC) -o [email protected] $^ 
bar:foo.c bar.c 
    $(CC) -o [email protected] $^ 

помнить, что любой переменные здесь расширены.

Фиктивные цели

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

.PHONY: foo bar 

спасаясь

знака доллара маскирующего в Makefiles, то $$ в вашем PERL, например, является буквальным $, например substitute будет строкой

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

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

+0

@Scott Wales: спасибо, но не совсем отвечаю на мои вопросы. Я знаю, что такое переменная, PHONY и ускользание ... – Pablo

+0

@ Майкл: Тогда какая часть ответа не ответила? –

+0

@Ignacio: он был отредактирован после – Pablo

1

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

can target contain multiple files? 

Попробуйте:

Теперь попробуйте 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 или regexs, или найти, или сделать, или что-то, не стесняйтесь спросить здесь, но, пожалуйста, принять мало времени, чтобы попытаться понять это в первую очередь.

1
  • x0d часть между версией и датой vars, это просто строка?
    Да.

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

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

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

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

  • В коде замены regex ниже, чем $$ 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 hash, $ 1 Я думаю, что это backreference в группе s /// regexp.

Смежные вопросы