2013-12-20 3 views
0

я следующий целевой gmake:

$(GCH_demo): $(PCH_demo) | $$(@D) prebuild_demo 
     @echo PCH $< 
     -cp $< $(@D) 
     $(CXX_demo) $(strip $(CPPFLAGS_demo) $(CXXFLAGS_demo)) -o [email protected] -c $< 

Здесь обратите внимание на $ (@ D):

  • В предпосылку, мне нужно уйти от доллара, так как: $$ (@ D)
  • В рецепте, не уйдешь не требуется:: $ (@ D)

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

Любая идея?

Спасибо.

+0

Прочтите [это] (http://www.gnu.org/software/make/manual/make.html#Rule-Syntax) раздел из [manual] (http://www.gnu.org/software /make/manual/make.html). – devnull

+0

@devnull Да, я имею - вы имеете в виду «если вы действительно хотите, чтобы знак доллара был в мишени или предпосылке, вы должны написать два из них»? НЕТ - я не думаю, что хочу знак доллара, я просто хочу, чтобы он был расширен –

ответ

2

Вы используете вторичное расширение (см. Обсуждение в the manual).

Обычно в правиле make автоматические переменные действительны только в рецепте. Они недоступны в списке предварительных условий, поскольку цели и предпосылки правила расширяются до того, как правило будет проанализировано; любая «нормальная» ссылка на переменную будет расширена до того, как make узнает, что такое цель, и так до того, как будет установлена ​​автоматическая переменная [email protected] (или ее альтернативные формы).

Если включить вторичное расширение, то список Предпосылки будет проходить через второго раунда расширения, после того, как правило, анализируется, и во втором разложении автоматической переменная [email protected] будет установлена ​​правильно. Тем не менее, чтобы убедиться, что ссылка на переменную попадает во второй раунд, вам нужно сбежать от нее, чтобы она не расширялась в течение первого раунда.

Рассмотрим это:

.SECONDEXPANSION: 
all: $(info [email protected]) $$(info [email protected]) 
     @: 

При запуске этого вы получаете:

first= 
second=all 

, как и ожидалось.

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