Ожидается ли немедленное назначение битового теста? - PullRequest
1 голос
/ 28 января 2020

Давайте рассмотрим следующий пример в файле .bb:

X = "1"
A := "X is '${X}' and Y is '${Y}'"
B = "X is '${X}' and Y is '${Y}'"
X = "2"
Y = "3"

На основании документации bitbake, доступной в Интернете, и многочисленных других примеров, я ожидаю, что переменные A и B будут храниться следующие значения в конце синтаксического анализа:

A="X is '1' and Y is ''"
B="X is '2' and Y is '3'"

Однако выполнение bitbake -e <recipe name> | grep ^A и то же самое для B показывают, что фактические значения для переменных следующие:

A="X is '1' and Y is '3'"
B="X is '2' and Y is '3'"

Другими словами, я ожидал, что оператор непосредственного присваивания заставит пустую еще не определенную переменную (например, B во время синтаксического анализа немедленного присваивания A). Однако, похоже, что bitbake выбирает последнее определенное значение для переменной. Такое поведение (выбора последнего определенного значения переменной) также согласуется со слабыми и стандартными присваиваниями.

Я также пробовал ту же концепцию немедленного присваивания для GNU Make, и кажется, что make ведет себя как я и ожидал:

X = 1
A := X is '$(X)' and Y is '$(Y)'
B = X is '$(X)' and Y is '$(Y)'
X = 2
Y = 3

A:
        echo "$(A)"
B:
        echo "$(B)"

Есть ли причина для поведения bitbake, когда немедленное присваивание содержит неопределенную переменную? Или это просто ошибка?

Я склонен полагать, что мне чего-то не хватает.

$ bitbake --version
BitBake Build Tool Core version 1.42.0

$ make -v
GNU Make 4.2.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

1 Ответ

0 голосов
/ 28 января 2020

Я разместил в комментариях [1] теорию, которую я разработал, пытаясь объяснить поведение.

Действительно, после некоторого тестирования кажется, что (вопреки документации), bitbake не подставьте неопределенные переменные, но это сохранит всю строку ${Y} на месте (согласно нашему примеру). Таким образом, в конце синтаксического анализа последнее значение Y окончательно подставляется.

Чтобы доказать это, мне просто нужно было заменить ${Y} на ${Z} в непосредственном присваивании A line, и оставьте Z неопределенным. В конце анализа значение A равно "For A, X is '1' and Y is '\${Z}'".

Загадка раскрыта. Немного нелогично. Я предполагаю, что это зависит от перспективы.

[1] Ожидается ли поведение немедленного назначения битового теста?

...