BitBake — проблема с расширением переменных и наиболее эффективный способ чтения исходных файлов BitBake

#bitbake

Вопрос:

В официальной документации bitbake есть пример немедленного расширения (здесь ), который практически гласит:

В этом примере:

 T = "123"
A := "test ${T}"
T = "456"
B := "${T} ${C}"
C = "cval"
C := "${C}append"
 

В конце мы получаем следующие значения:

  • A содержит test 123 ,
  • T содержит 456
  • B содержит 456 cvalappend
  • C содержит cvalappend .

Но в той же официальной документации также указано (источник, последний абзац):

Если синтаксис расширения переменной используется для переменной, которая не существует, строка сохраняется как есть. Например, учитывая следующее назначение, BAR расширяется до литеральной строки ${FOO} до тех пор, пока FOO не существует.

 BAR = "${FOO}"
 

И именно поэтому мне все значения из первого приведенного блока кажутся разумными, за исключением B тех, которые, на мой взгляд, должны содержать 456 ${C} .

Но официальная документация дает краткое объяснение:

Это связано с тем, что ссылки на неопределенные переменные сохраняются как есть во время (немедленного) расширения.

О: И я не понимаю этого объяснения. Кто-нибудь может помочь мне понять?

Все это лишь часть более серьезной проблемы… На самом деле, я даже не знаю, как правильно читать исходные файлы BitBake, где некоторые переменные / переопределения назначаются немедленно, некоторые переменные / переопределения назначаются при использовании переменной, а некоторые назначаются после анализа всего файла, т.Е. анонимных функций.

Это одна большая путаница… В настоящее время я сомневаюсь, возможно ли вообще нормально читать исходный файл построчно? Должен ли я вместо этого сначала выполнить поиск всех непосредственных операций ( := , = , = , .= , =. ) и прочитать только эти строки, а затем перечитать чистый исходный файл, содержащий анонимные функции, а затем перечитать весь исходный файл, а затем читать только анонимные функции. И синтезировать все в моей голове в конце? Вы знаете, что моя оперативная память ограничена … Итак…

B: Какой наиболее эффективный способ чтения исходных файлов Bitbake?

Ответ №1:

Значение B после немедленного расширения равно 456 ${C} , т.Е. Значение C не установлено, поэтому оно просто остается нерасширенным.

After C устанавливается несколькими строками позже, а не значением 456 ${C} , оно становится 456 cvalappend , поскольку C теперь имеет значение. Если вы удалите значение C , оно снова станет 456 ${C} , но если вы удалите ${T} , оно останется неизменным, поскольку значение T теперь жестко закодировано B .

«В конце» означает, что после всех этих утверждений вы просто думаете о значении после B того, как установлено, но нет C .

Самый эффективный способ анализа исходных файлов bitbake — позволить bitbake самому делать это, это то, для чего он предназначен!

Комментарии:

1. Как программа может даже установить B значение 456 cvalappend ? Перечитывается ли исходный файл несколько раз?

2. Для него не установлено значение, значение расширяется до него при чтении переменной.

3. Но, кажется, его нужно прочитать два раза… Потому что при первом чтении он оценивается 456 ${C} как , потому что на тот момент время C еще не установлено. Как именно работает этот механизм?

4. Нет, это не нужно читать дважды. По умолчанию код не раскрывается сразу, он просто сохраняется в хранилище данных. Немедленное расширение возможно, но только по специальному запросу, и почти все расширения откладываются.