2015-11-09 4 views
2

Я привязан к конкатенации переменной в цикле for в моем Makefile.
У меня есть переменная, которая содержит gcc флаги для файлов заголовков -I и массив имен зависимостей, которые я бы хотел добавить к переменной в цикле for.
Я не знаю, насколько я прозрачен, поэтому позвольте мне показать вам часть Makefile. (Несвязанные части удалены)Объединить переменную в цикле

IFL := -I ./inc 

... 

LIBS = libX libY libZ 

... 

libraries: 
    @for i in $(LIBS); do  \ 
     IFL += -I ./$(LIBD)/$$i; \ # PROBLEM ? 
     make -C $(LIBD)/$$i ; \ 
    done 
+0

Я не уверен, что вы можете изменять переменные в рецептах; это никогда не работало для меня. Если вы переместите этот цикл до рецепта, он, вероятно, сработает. – Kenney

+3

у вас возникнет проблема с выполнением 'IFL + = $ (foreach lib, $ (LIBS), -I ./$ (LIBD)/$ (lib))' вне рецепта, а затем выполнение цикла for для выполнения 'make - C'? – jepio

ответ

0
  1. Я не хотел бы предложить для цикла здесь, я бы настоятельно рекомендую сделать libraries = ${LIBS} в этом случае или созданий правил прямо ${LIBS}. таким образом, вы можете внести изменения в каждую цель, и рецепты могут выполняться параллельно.

  2. Когда это так, вы можете сделать что-то немного больше, как бы бессмысленно, так

    ЛИЭС = libX Либи libZ

    $ {ЛИЭС}: CFLAGS = -I ./${LIBD}/[email protected] сделать -C $ {LIBD}/$ {@}

    Key нюанс в том, что вы должны изменить, чтобы «добавить» к CFLAGS вместо прямого простого присваивания, или, если вы действительно нуждаетесь в них разделены, заменить мое использование CFLAGS С IFL, а также сменить команду IFL := -I ./inc быть IFL += -I ./inc

  3. Если вы не экспортируете эту переменную, она не будет передана в ваш субмарок независимо от того, что вы делаете.

Лучшие идеи:
У вас есть Makefile уже сидит в каталоге ${LIBD}/[email protected] потому что make -C работ; почему вы не можете добавить сюда этот путь include? ИЛИ всегда ваши сборки включают текущий каталог, если вы пытаетесь быть более общим.

Вы также можете посмотреть целевые конкретные переменные.

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

+0

Спасибо за ваши объяснения! – tbzr75

0

Посмотрите на Makefile's text functions. Вам, вероятно, понадобится либо subst(), либо patsubst(). Например, для случая, описанного выше, это будет:

LIBS = x y z 
FLAGS = $(patsubst %, -I ./${LIBD}/%, ${LIBS}) 
Смежные вопросы