Make GNU: получить букву / символ из переменной - PullRequest
0 голосов
/ 11 мая 2018

У меня есть переменная в файле make GNU:

VAR=DDC

Я хочу объединить эти символы в другую строку и назначить их другой переменной, например:

TOT_VAR=--'D','D','C'--

Моей первой идеей было сделать что-то вроде этого псевдокода:

#Pseudo code
TOT_VAR=--'@(letter1, VAR)','@(letter2, VAR)','@(letter3, VAR)'--

Но я не могу найти функцию, которая извлекает отдельные символы. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Набор инструментов таблицы GNU имеет функцию explode, которая расширяет строку в список:

$ (вызов разнесен, список строк , строка)

Вставлять пробел после каждого вхождения строк из списка строк в строку.Эта функция в основном служит для преобразования строки в список:

$(call explode,0 1 2 3 4 5 6 7 8 9,0x1337c0de) --> 0 x1 3 3 7 c0 de

Вы можете получить доступ к членам вашей переменной, как показано ниже:

include gmtt/gmtt.mk
XPLD_VAR := $(call explode,$([alnum]),$(VAR))
TOT_VAR := --$(word 1,$(XPLD_VAR)),$(word 2,$(XPLD_VAR)),$(word 3,$(XPLD_VAR))--
0 голосов
/ 12 мая 2018

Вы можете использовать sed для преобразования:

echo DDC | sed -E "s/^(.{1})(.{1})(.{1}).*/--'\1','\2','\3'--/")

Что это делает:

  1. Трубы струнные DDC до sed
  2. Говорит sed, чтобы проанализировать строку и сопоставить первые три символа
  3. Замените DDC форматом замены, вставив эти три символа в заполнители \1, \2 и \3

[Если вы используете ОС Linux, а не MacOS, как я, то я думаю, вам нужно будет использовать sed -e вместо sed -E]

Как говорится в комментарии @Maxim, вам нужно вызвать оболочку из make, чтобы выполнить эту команду. Построение этого подхода в простой make-файл для иллюстрации:

VAR=DDC
TOT_VAR:=$(shell echo $(VAR) | sed -E "s/^(.{1})(.{1})(.{1}).*/--'\1','\2','\3'--/")

all:
    echo "$(TOT_VAR)"

Выполнение make all для этого дает этот вывод и показывает, что замещение сработало:

echo "--'D','D','C'--"
--'D','D','C'--
...