родной пакет отказывается помещать библиотеки в папку sysroot

У меня есть пакет (openssl), который должен быть создан для хоста и цели. Он создает несколько .so и .a библиотек, которые необходимы некоторым другим пакетам для выполнения и компиляции соответственно.

Когда я компилирую этот пакет для целевого объекта, все работает нормально, и каждый файл оказывается в том месте, где я ему говорю, но когда я компилирую для хоста (${PN}-native target), он просто не помещает библиотеки в каталог sysroot хоста ( ./build/tmp/sysroot/x86_64-linux).

Это рецепт:

SUMMARY = "Secure Socket Layer"
SECTION = "libs/network"
LICENSE = "openssl"
LIC_FILES_CHKSUM = "file://LICENSE;md5=4004583eb8fb7f89"

branch = "yocto"
SRC_URI = "git://www.myserver.com/openssl.git;protocol=ssh;branch=${branch}"
SRCREV = "${AUTOREV}"
S = "${WORKDIR}/git"

BBCLASSEXTEND += "native nativesdk"

# This is because I am porting this package from other project and I can't modify it.
FILES_${PN} += "${libdir}/libssl.so ${base_libdir}/libcrypto.so"
FILES_SOLIBSDEV = ""

do_compile() {
    ${MAKE}
}

do_install() {
    DESTDIR=${D} ${MAKE} install
}

Может ли кто-нибудь сообщить мне, что я делаю не так? заранее спасибо


person XNor    schedule 21.04.2016    source источник
comment
Есть ли причина не использовать рецепт openssl в OE-Core?   -  person Jussi Kukkonen    schedule 21.04.2016
comment
Да, я портирую свой проект из другого (очень старого и хакерского) инструмента сборки. Они попросили меня придерживаться пакетов и процедуры сборки, которые использовались в старой версии. После этого мы приступим к модификации и замене пакетов. Вот почему я отправляю .so файл.   -  person XNor    schedule 21.04.2016
comment
Где вы указываете инструменту сборки, где устанавливать двоичные файлы? Похоже, что он предполагает, что prefix = / usr, и вы не говорите об обратном, что требуется для собственных сборок, поскольку префикс $ - это то, как перемещаются собственные сборки.   -  person Ross Burton    schedule 23.04.2016


Ответы (2)


Во-первых, почему вы пишете свой собственный рецепт для openssl вместо того, чтобы использовать рецепт в oe-core?

В любом случае проблема в том, что вы ни в коем случае не указываете рецепту, какой префикс использовать. В собственных сборках префикс - это то, что правильно перемещает пакет в собственный системный корневой каталог.

person Ross Burton    schedule 21.04.2016

Хорошо, я знаю, в чем проблема:

Похоже, что для собственных рецептов вы должны установить его, используя полный путь к системному корневому каталогу вашего хоста внутри папки изображений. Это означает, что при компиляции для цели папка изображений выглядит так:

$ tree -d
/openssl/1.0.0-r0/image
├── lib
└── usr
    ├── include
    │   └── openssl
    └── lib

но для хоста в моем случае это выглядит так:

$ tree -d
openssl-native/1.0.0-r0/image
└── home
    └── xnor
        └── yocto
            └── build
                └── tmp
                    └── sysroots
                        └── x86_64-linux
                            ├── lib
                            └── usr
                                ├── include
                                │   └── openssl
                                └── lib

РЕДАКТИРОВАТЬ Правильным решением является изменение Makefile для извлечения ${prefix}, ${bindir}, ${libdir} и т. д. из среды вместо жесткого кодирования этих путей в Makefile. В моем случае это невозможно из-за требований проекта, поэтому я должен сделать следующее:

SUMMARY = "Secure Socket Layer"
SECTION = "libs/network"
LICENSE = "openssl"
LIC_FILES_CHKSUM = "file://LICENSE;md5=4004583eb8fb7f89"

branch = "yocto"
SRC_URI = "git://www.myserver.com/openssl.git;protocol=ssh;branch=${branch}"
SRCREV = "${AUTOREV}"
S = "${WORKDIR}/git"

BBCLASSEXTEND += "native nativesdk"

# This is because I am porting this package from other project and I can't modify it.
FILES_${PN} += "${libdir}/libssl.so ${base_libdir}/libcrypto.so"
FILES_SOLIBSDEV = ""

do_compile() {
    ${MAKE}
}

do_install() {
    # The change is here!
    DESTDIR=${D}${base_prefix} ${MAKE} install
}

и, как вы понимаете, ${base_prefix} расширяется до "/home/xnor/yocto/build/tmp/sysroots/x86_64-linux/" для рецепта хоста (openssl-native) и до "" для цели (openssl).

person XNor    schedule 21.04.2016
comment
Нет, для "родного" $ D отрегулировано соответствующим образом, так что это неверно. - person Ross Burton; 21.04.2016
comment
Думаю, вы ошибаетесь, если посмотрите на manual, в нем четко указано, что ${D} указывает на ${WORKDIR}/image - person XNor; 21.04.2016
comment
Точно. $ {D} корректируется соответствующим образом, поэтому стандартный make-файл, использующий DESTDIR, по-прежнему должен иметь вид DESTDIR = $ {D}, поскольку сборка должна учитывать $ {prefix}. Проблема в том, что ваш рецепт нигде не соблюдает $ {prefix}. - person Ross Burton; 23.04.2016
comment
@RossBurton Я знаю, проблема в том, что я не могу изменить make-файл. Они жестко запрограммировали prefix = /usr, и поэтому он не работал. Я знаю, что мое решение - взлом, но я не знаю, что еще я могу сделать прямо сейчас! - person XNor; 25.04.2016
comment
Вы можете изменить make-файл с помощью патча. Просто назначьте переменную и переопределите ее при вызове make. - person Ross Burton; 30.04.2016