2016-03-10 2 views
3

Недавно я изучаю GNU. Ниже приведен пример создания автоматической зависимости от руководства GNU make. Я знаю общий смысл вышеупомянутого скрипта (он в основном заменяет что-то другим с помощью команды sed). Но у меня есть два вопроса относительно деталей в команде. Во-первых, что означает \1.o в команде? Связано ли это с параметром позиции? И во-вторых, почему $* помещается в пару (), так как $* сам уже означает стебель целевого имени файла? (Я пытался без скобок, это не сработало.)GNU make auto dependency generation

%.d: %.c 
    $(CC) -M $(CPPFLAGS) $< > [email protected]$$$$;     \ 
    sed 's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected]; \ 
    rm -f [email protected]$$$$ 

Я попытался следующие, это не сработало.

%.d: %.c 
    $(CC) -M $(CPPFLAGS) $< > [email protected]$$$$;     \ 
    sed 's,$*\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected];  \ 
    rm -f [email protected]$$$$ 

Может ли кто-нибудь объяснить причины? Благодарю.

+1

Это оба детали 'sed', а не детали makefile. Это команда 'sed', на которую вы смотрите. –

+0

$ * - автоматическая переменная в make-файле. @EtanReisner – Jerry

+0

Вы пытались '' s, $ * \. O [:] *, $ *. O $ @:, g''? – 5gon12eder

ответ

4

Текст interpreted multiple times.

's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' 

На первом этапе, Make расширяет $ переменные. Например:

's,\(foo\)\.o[ :]*,\1.o foo.d : ,g' 

Далее эта строка передается в оболочку, которая удаляет цитату.

s,\(foo\)\.o[ :]*,\1.o foo.d : ,g 

И, наконец, оно интерпретируется sed. В основных регулярных выражениях, как понимается по умолчанию sed, \(…\) просто соответствует , но групп матча. Затем позже, при замене, вы можете вернуться к тексту, который был сопоставлен. \N относится к N -й группе, которая была сопоставлена. Таким образом, в этом примере \1 просто ссылается на то, что $* соответствует - возможно, foo. (Вы можете столкнуться с проблемами, если $* расширяется до того, что имеет особое значение в регулярном выражении. Обратите внимание, что обратные ссылки делают регулярное выражение нерегулярным, но это, вероятно, не имеет значения здесь.)

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

's,[^:]*:,$*.o [email protected] :,g' 
+0

Большое спасибо за ваш добрый и подробный ответ[email protected] 5gon12eder – Jerry

+1

Ваша предлагаемая замена намного более разрешительна, чем оригинал. Это будет соответствовать * многим * больше вещей, чем оригинальная воля. Теперь это может не иметь значения в этом случае (потому что вход ограничен), но я не об этом, и даже если это так, это все еще разница, которую стоит отметить. –

+0

@EtanReisner Абсолютно, я не утверждаю, что предложенная альтернатива эквивалентна. Я считаю, что это может быть более подходящим для конкретной задачи. – 5gon12eder

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