2016-06-10 7 views
4

Один из моих рецептов в Yocto нужно создать файл, содержащий очень специфическую линию, что-то вроде:

${libdir}/something 

Чтобы сделать это, у меня есть задание рецепт:

do_install() { 
    echo '${libdir}/something' >/path/to/my/file 
} 

Имея в виду, что Я хочу, чтобы строка точно, как показано, я не могу понять, как избежать ее, чтобы предотвратить замену bitbake от собственного значения libdir.

Первоначально я думал echo команды с одинарными кавычками будет делать трюк (как это делает в bash оболочке), но bitbake должна интерпретировать линию перед тем пропуская его к корпусу. Я также попытался убежать от него как с $$, так и с \$ безрезультатно.

Я ничего не могу найти в doco о предотвращении изменения переменных, просто связанных с непосредственными, отложенными и расширениями Python.

Что нужно сделать, чтобы получить эту строку в файле как есть?

ответ

3

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

Таким образом, если вы хотите, чтобы они не быть расширен, вам нужно эффективно скрыть их от BitBake, и это можно сделать что-то вроде:

echo -e '\x24{libdir}/something' >/path/to/my/file 

Это использует версию шестнадцатеричное $, так что BitBake не распознает его как расширяемую переменную.

Вы, , должны должны убедиться, что вы используете правильную команду echo. В некоторых дистрибутивах (например, Ubuntu) он может запускать sh - внутренний echo, который не распознает опцию -e.Для того, чтобы обойти это, вы, возможно, придется запустить вариант echo, который живет в файловой системе (и что делает признать, что вариант):

/bin/echo -e '\x24{libdir}/something' >/path/to/my/file 
+0

Альтернатива, использующая только Утилиты оболочки bourne могут быть реализованы с помощью echo, awk и printf: 'echo '$ (awk' BEGIN {printf"% c {libdir}/something "}, 0x24} ')">/path/to/my/file' – PeterErnsthaft

2

По умолчанию эта задача будет выполнена в виде функции оболочки с помощью /bin/sh, но это зависит от вашей системы, что это будет, как вы можете иметь символическую ссылку с именем /bin/sh указывая на Баш. Однако руководство BitBake предотвращает использование синтаксиса bashism.

Вы можете рассмотреть просто добавить эту задачу в рецепте в качестве функции питона:

python do_install() { 
    with open('/path/to/your/file', 'a') as file: 
     file.write('${libdir}/something') 
} 

'a' означает добавление.

Это должно устранить проблему с переменным расширением.

+0

Итак, есть * нет * способ сделать это с вариантом оболочки? У меня есть довольно много другого кода, который будет раздражать, чтобы преобразовать его в Python. – paxdiablo

2

Там нет стандартного способа избежать такого рода выражений, которые я отдаю себе отчет, кроме попытаться разбить выражение - соответственно это должно работать:

do_install() { 
    echo '$''{libdir}/something' >/path/to/my/file 
} 
+0

Довольно близко. К сожалению, это, по-видимому, вызывает проблемы для любого используемого парсера - он * делает * помещает '$ {prefix}' в файл, но он также помещает в перенаправление, а остальную часть функции дословно или, возможно, только до второй (из двух) линий, нуждающихся в этом трюке. Тем не менее, это хороший указатель на то, чтобы решить, что для решения, вероятно, мне понадобится ввести '$' таким образом, чтобы он не был распознан (например, восьмеричный код. Я буду следовать этой строке на данный момент. – paxdiablo

0

Если вам нужно использовать $ в присваивания значения переменной, помните, что битбаке не будет оценивать $, так что вам нужно избежать его для основной оболочки.

Например, я установить опцию GCC/л.д. RPATH использовать $ ORIGIN ключевое слово так:

TARGET_LDFLAGS_append = " -Wl,-rpath-link=\\$$ORIGIN" 

https://lists.yoctoproject.org/pipermail/yocto/2017-September/037820.html

0

Лучшее решение является просто:

bitbake_function() { 
    command $libdir/whatever 
} 

Bitbake будет только развернуть ${libdir}; $libdir передается дословно.

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

Единственный раз, когда мы столкнулись с проблемой, с только $foo, если у нас есть что-то вроде ${foo}bar где фигурные скобки требуются как разделители, так что bar не входит в имя переменной. В этой ситуации существуют другие решения, такие как, например, генерация синтаксиса оболочки "$foo"bar. Это менее загадочно, чем прибегать к \x24.