Как создать сценарий Bash в рецепте Yocto

История вопроса: я пытаюсь создать ADLINK Vortex OpenSplice Community Edition в рецепт Yocto.
Все работает нормально, когда я пытаюсь собрать OpenSplice в оболочке Bash. Однако, когда я пытаюсь собрать OpenSplice в оболочке sh, возникает множество проблем. Проблема в том, что скрипт configure (и скрипты, которые он вызывает) имеют множество башизмов (массивы, popd, pushd и т. Д.). Файлы конфигурации Bash слишком длинные и сложные, чтобы их можно было переписать в sh с помощью файла исправления Yocto.

Проблема. Я не могу создать сценарий Bash для установки переменных среды в do_configure () в рецепте Yocto.
Я могу запустить сценарий configure в моем рецепте Yocto. Это работает, например:
bash -c "printf '5' | source ${S}/configure" Сценарий configure спрашивает, для какой платформы я хочу создать OpenSplice, printf '5' вводит параметр 5.
Но этот сценарий не устанавливает переменные среды, которые должны быть установлен. Я знаю, что Bash запускает дочернюю оболочку, и переменные среды не покидают эту оболочку.
Я пытался использовать исходный код Bash в своем рецепте: . bash -c "printf '5' | source ${S}/configure"
Но это дает следующую ошибку: sh: 3: /bin/bash: Syntax error: Unterminated quoted string

Я также пробовал использовать системные вызовы в Python. Но это дает ту же проблему, он открывает дочернюю оболочку, а переменные среды недоступны в родительской оболочке.

Вопрос Итак, вопрос в том, как я могу создать сценарий Bash в рецепте Yocto? Приветствуются любые решения, в том числе и грязные.

Рецепт

LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=c4bfc022908a26f6f895ab14b6baebca"

# Opensplice does not work with semantic versioning. Therefore ${PV} cannot be used.
# OSPL_V6_9_190925OSS_RELEASE is the 10th release of Opensplice V6.9 (.9 in zero-based 
# numbering). SRCREV is commit hash of OSPL_V6_9_190925OSS_RELEASE.
SRC_URI = "git://github.com/ADLINK-IST/opensplice.git"
SRCREV = "c98e118a2e4366d2a5a6af8cbcecdf112bf9e4ab"

S = "${WORKDIR}/git"

DEPENDS += " bash gcc gawk flex bison perl bison-native "
RDEPENDS_${PN} += " bash bison "

do_configure () {
#    # configure prompts for choice of target architecture
#    # printf '5' enters choice 5; armv7l.linux-release
    bash -c "printf '5' | source ${S}/configure"
}


do_build () {
    make
}

do_install () {
    make install
}

person KJ Russcher    schedule 10.12.2019    source источник


Ответы (2)


Вы можете попробовать изменить эту строку с помощью метода do_configure:

bash -c "printf '5' | source ${S}/configure"

примерно так:

bash -c ". /some/path/fileName && printf '5' | source ${S}/configure"
person Geoff Murray    schedule 11.12.2019
comment
Я попробую это сделать, но где имеется в виду / some / path / fileName? - person KJ Russcher; 11.12.2019

Вы не можете создать сценарий Bash, который содержит специфические для Bash команды в рецепте Yocto.

К счастью, в конце сценария настройки OpenSplice все переменные среды сбрасываются в файл sh. Затем этот sh-файл может быть получен POSIX-совместимым способом. Результирующий рецепт:

LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=c4bfc022908a26f6f895ab14b6baebca"

SRC_URI = "git://github.com/ADLINK-IST/opensplice.git"
SRCREV = "c98e118a2e4366d2a5a6af8cbcecdf112bf9e4ab"

S = "${WORKDIR}/git"

DEPENDS += " bash gcc gawk flex bison perl bison-native "
RDEPENDS_${PN} += " bash "

do_configure () {
#   configure prompts for choice of target architecture
#   printf '5' enters choice 5; armv7l.linux-release
#   This command creates the file ./envs-armv7l.linux-release.sh
#   which is sourced by do_compile and do_install
    bash -c "printf '5' | source ${S}/configure"
}

do_compile () {
    # Source the file with the environment variables
    . ${S}/envs-armv7l.linux-release.sh
    make
}

do_install_prepend () {
    # Source the file with the environment variables
    . ${S}/envs-armv7l.linux-release.sh
}

do_install_append () {
    install -d ${D}/bin/
    install -m 0644 ${S}/exec/armv7l.linux-release/* ${D}/bin/
    install -d ${D}/lib/
    install -m 0644 ${S}/lib/armv7l.linux-release/* ${D}/lib/
}
person KJ Russcher    schedule 12.12.2019