Search code examples
goyoctoyocto-recipewails

Yocto Fails to Cross-Compile GoLang Wails Application


I am using Yocto Kirkstone to build a system for an ARMv7 custom embedded Linux board. I have go-runtime version 1.20 in my Yocto meta layers.

I am trying to build a simple example GoLang 'wails' (https://github.com/wailsapp/wails) application that I am able to build on my Mac for my target. This requires the wails 'cli' to be installed to build the application. I'm not sure how to cross-compile this app with Yocto. How can I accomplish this? Thanks.

This command fails in do_compile():

wails build .

The error I am getting is shown here:

...
| HASH[link github.com/wailsapp/wails/v2/cmd/wails]: "packagefile internal/lazyregexp=PNiPFusr6BDvpzrFOO2q\n"
| HASH[link github.com/wailsapp/wails/v2/cmd/wails]: 58443e84e42fc0e5254356b82561065095a39a1606a457c34cf63d8dd364173c
| HASH subkey a9f4ce5dc6a5c97cab06b5c8cfec3a64e5db0f7bcc79e02fc0002cafcc719a67 "link-stdout" = 80ee6464b934ca7407296396849147804b0862ee25e2b844a6e9cc98cfa588b3
| qemu-arm: Could not open '/lib/ld-linux-armhf.so.3': No such file or directory
| WARNING: /home/sensonix/poky/build-microchip/tmp/work/cortexa5t2hf-neon-vfpv4-poky-linux-gnueabi/go-example/1.0.0-r0/temp/run.do_compile.87405:178 exit 255 from './bin/linux_arm/wails build .'
| WARNING: Backtrace (BB generated script):
|       #1: do_compile, /home/sensonix/poky/build-microchip/tmp/work/cortexa5t2hf-neon-vfpv4-poky-linux-gnueabi/go-example/1.0.0-r0/temp/run.do_compile.87405, line 178
|       #2: main, /home/sensonix/poky/build-microchip/tmp/work/cortexa5t2hf-neon-vfpv4-poky-linux-gnueabi/go-example/1.0.0-r0/temp/run.do_compile.87405, line 186

Bitbake Recipe:

DESCRIPTION = "Wails Example App"
LICENSE = "CLOSED"
LIC_FILES_CHKSUM=""

SRC_URI = "file://wails.json"
SRC_URI += "file://README.md"
SRC_URI += "file://main.go"
SRC_URI += "file://app.go"
SRC_URI += "file://frontend"

GO_IMPORT = "import"
GO_LINKSHARED = ""
PTEST_ENABLED="0"
export GO111MODULE="auto"
CGO_ENABLED = "1"

inherit go goarch

do_compile() {

    cd ${WORKDIR}/build
    export TMPDIR="${GOTMPDIR}"

    ${GO} install github.com/wailsapp/wails/v2/cmd/wails@latest

    export GOPATH="$GOPATH:${S}/src/import/.gopath"

    # Pass the needed cflags/ldflags so that cgo
    # can find the needed headers files and libraries
    export CGO_CFLAGS="${CFLAGS} --sysroot=${STAGING_DIR_TARGET}"
    export CGO_LDFLAGS="${LDFLAGS} --sysroot=${STAGING_DIR_TARGET}"

    ./bin/linux_arm/wails build .

    #${GO} build ${GO_LINKSHARED} ${GOBUILDFLAGS} -o streamerapp

    cd ${OLDPWD}

}

do_install() {

    cd ${WORKDIR}/build
    #install -m <permisions> SRC DEST

    mkdir -p ${D}${bindir}
    #install -m 0755 ./wailsapp ${D}${bindir}

    cd ${OLDPWD}

}

Solution

  • I solved it with the following recipe.

    DESCRIPTION = "Wails Example App"
    LICENSE = "CLOSED"
    LIC_FILES_CHKSUM=""
    
    LICENSE = "CLOSED"
    
    SRC_URI = "git://[email protected]/abc/go-wails-demo.git;branch=master;protocol=ssh"
    SRCREV = "eaa61c30bff997c811da1d176c7273cea4f6b7d8"
    
    GO_IMPORT = "import"
    GO_LINKSHARED = ""
    PTEST_ENABLED="0"
    CGO_ENABLED = "1"
    
    DEPENDS = "nodejs-native"
    DEPENDS += "gtk+3 webkitgtk"
    
    INSANE_SKIP:${PN} += "already-stripped"
    
    inherit go goarch pkgconfig
    
    do_compile() {
    
        # Allow cloning of properietary repositories
        git config --global --add url."[email protected]:".insteadOf "https://github.com/"
        ${GO} env -w GOPRIVATE="github.com/abc"
    
        cd ${WORKDIR}/go-wails-demo-1.0.0/src/import
        export TMPDIR="${GOTMPDIR}"
    
        # Pass the needed cflags/ldflags so that cgo
        # can find the needed headers files and libraries
        export QEMU_LD_PREFIX="${STAGING_DIR_TARGET}"
        export GOARCH=${TARGET_GOARCH}
        export CGO_ENABLED="1"
        export CGO_CFLAGS="${CFLAGS} --sysroot=${STAGING_DIR_TARGET}"
        export CGO_LDFLAGS="${LDFLAGS} --sysroot=${STAGING_DIR_TARGET}"
        export GO111MODULE="on"
        export GOPATH="${WORKDIR}/build"
        export GIT_TERMINAL_PROMPT=1
    
        ${GO} install github.com/wailsapp/wails/v2/cmd/wails@latest
    
        /usr/bin/sync
        sleep 0.5
    
        ${WORKDIR}/build/bin/linux_arm/wails build .
    
    }
    
    do_install() {
    
        cd ${WORKDIR}/go-wails-demo-1.0.0/src/import/build/bin
    
        mkdir -p ${D}${bindir}
        install -m 0755 ./react-wails-demo ${D}${bindir}
    
        cd ${OLDPWD}
    
    }