Проблема в использовании оболочки для цикла внутри GNU Make? - PullRequest
2 голосов
/ 01 февраля 2011

рассмотрите приведенный ниже файл make

all: 
     @for x in y z; \ 
     do \ 
          for a in b c; \
          do \
                   echo $$x$$a >> log_$$x; \
          done; \
     done

При выполнении этого файла make были созданы два файла log_y и log_z. log_y имеет данные "yb" и "yc". аналогично log_z имеет данные "zb" и "zc".

На самом деле я хочу создать четыре файла (log_y_b, log_y_c, log_z_b, log_z_c). Для этого я изменил приведенный выше файл make как

all:
     @for x in y z; \ 
     do \ 
          for a in b c; \
          do \
                   echo $$x$$a >> log_$$x_$$a; \
          done; \
     done

Но создается только один файл log_. Что мне нужно сделать, чтобы создать четыре файла.

Ответы [ 2 ]

4 голосов
/ 01 февраля 2011

Возможно поставьте скобки вокруг имен переменных: это работает в моей системе.

all:
    @for x in y z; \
    do \
        for a in b c; \
        do \
            echo $$x$$a >> log_$${x}_$${a}; \
        done; \
    done

Вы также можете использовать foreach :

all:
    @$(foreach x,y z,$(foreach a,b c,echo $(x)$(a) >> log_$(x)_$(a);))
1 голос
/ 01 февраля 2011

log_$$x_$$a в Makefile превращается в log_$x_$a для оболочки, что эквивалентно log_${x_}${a}. Однако переменная $x_ не определена, поэтому оболочка заменяет ее пустой строкой.

Решение: Правильно напишите переменную $x с фигурными скобками вокруг имени (${variablename}), т. Е. Для согласованности напишите log_${x}_${a} (или в стиле Makefile : log_$${x}_$${a}).

...