Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Build auf Host-PC oder auf dem Target ?
#1
Hallo zusammen,
                                        
ich verwende SmartPi 3.0 und möchte für die Integration in meine private Home-Automation Anpassungen am Quell-Code vornehmen
und die Binaries dann neu bauen lassen.
                                        
Das makefile beinhaltet nun explizit keine Information zum Build für ein arm64-Target (Raspbi4). Ich gehe demnach zunächst davon aus,
dass das Build auf dem Target selbst durchgeführt werden soll.

Nun habe ich das ursprüngliche makefile etwas modifiziert und Go-Env Variablen, GOAS, GOARCH ergänzt. Das scheint prinzipiell zu funktionieren,
nur bekomme ich dann offenbar beim Build auf dem PC (amd64) mit dem Paket "github.com/msteinert/pam" ein Problem:
                                        
VERSION is 431cad8-dirty_2023-07-01_04:15:23
start building smartpiserver...
GOARCH=arm64 GOOS=linux go build -o ../bin64/smartpiserver -ldflags="-X
main.appVersion=431cad8-dirty_2023-07-01_04:15:23" server/server.go
# github.com/nDenerserve/SmartPi/linuxtools
linuxtools/user.go:103:16: undefined: pam.StartFunc
linuxtools/user.go:103:60: undefined: pam.Style
linuxtools/user.go:105:12: undefined: pam.PromptEchoOff
linuxtools/user.go:107:12: undefined: pam.PromptEchoOn
linuxtools/user.go:107:30: undefined: pam.ErrorMsg
linuxtools/user.go:107:44: undefined: pam.TextInfo
make: *** [makefile:58: buildsmartpiserver] Fehler 1
                                        
Das Paket <libpam0g-dev> als auch der Go-Wrapper ("github.com/msteinert/pam V1.1.0") ist aus meiner Sicht korrekt auf dem PC installiert.
Ein <make update-go-deps> habe ich zuvor ebenfalls durchgeführt.
                                        
Ich würde nun gern, wie gewohnt, auf dem PC coden und anschließend bauen lassen. Habe ich da etwas übersehen ?
                                                                                
@Enerserve: Wo / Wie erzeugt ihr eure arm64-Binaries ?
                                        
Beste Grüße
Reply
#2
Hallo Thomek,

wir bauen unsere builds auf Raspberry Pis, auf die wir remote per SSH zugreifen. Wir haben einen für 32bit und einen für 64bit.

Als wir noch auf dem PC compiliert haben, haben wir extra ein sysroot eingerichtet, wo die Libraries von einem Raspberry Pi reinkopiert wurden. Es muss ja die Prozessorarchitektur stimmen.

Folgend Variablen haben wir gesetzt:

Code:
export GOPATH=/home/jens/share/Produkte/SmartPi
export CGO_LDFLAGS="--sysroot=/home/jens/raspberrypi/rootfs"
export CGO_CFLAGS="--sysroot=/home/jens/raspberrypi/rootfs"

env CGO_ENABLED=1 GOOS=linux GOARCH=arm CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ go build -ldflags '-w'  -v -o bin/smartpireadout src/readout/*.go


Allerdings war die Pflege mit 32bit und 64bit auf Dauer zu aufwendig (wir hätten dann ein 32bit und ein 64bit sysroot pflegen müssen) und wir sind auf die Remotegeschichte umgestiegen.

Das von uns aktuell verwendet Makefile Makefile ist dasselbe wie in Github:

Code:
BINARY_READOUT=smartpireadout
BINARY_SERVER=smartpiserver
BINARY_FTPUPLOAD=smartpiftpupload
BINARY_MODBUSSERVER=smartpimodbusserver
BINARY_EMETERSERVER=smartpiemeterserver

#VERSION=0.3.7
VERS = $(shell git describe --always --long --dirty)
BUILD_TIME := $(shell date -u '+%Y-%m-%d_%I:%M:%S%p')
LBITS := $(shell getconf LONG_BIT)

BUILDPATH=$(CURDIR)
GO=$(shell which go)
GOFMT?=$(GO)fmt
GOBUILD=$(GO) build
GOINSTALL=$(GO) install
GOCLEAN=$(GO) clean
GOGET=$(GO) get

pkgs = $(shell $(GO) list ./...)


ifdef VERSION
VERSION := $(VERSION)
else
VERSION := $(VERS)_${BUILD_TIME}
endif

$(info    VERSION is $(VERSION))


all: format makedir get buildsmartpireadout buildsmartpiserver buildsmartpiftpupload buildsmartpimodbusserver buildsmartpiemeterserver


makedir:
@echo "start building tree..."
@if [ ! -d $(BUILDPATH)/bin ] ; then mkdir -p $(BUILDPATH)/bin ; fi
@if [ ! -d $(BUILDPATH)/pkg ] ; then mkdir -p $(BUILDPATH)/pkg ; fi

get:

style:
@echo "checking code style"
! $(GOFMT) -d $$(find . -path ./vendor -prune -o -name '*.go' -print) | grep '^'


format:
@echo "formatting code..."
@$(GO) fmt $(pkgs)

buildsmartpireadout:
@echo "start building smartpireadout..."
$(GOBUILD) -o ../bin$(LBITS)/$(BINARY_READOUT) -ldflags="-X main.appVersion=${VERSION}" readout/*.go
@echo "building smartpireadout done"

buildsmartpiserver:
@echo "start building smartpiserver..."
$(GOBUILD) -o ../bin$(LBITS)/$(BINARY_SERVER) -ldflags="-X main.appVersion=${VERSION}" server/server.go
@echo "building smartpiserver done"

buildsmartpiftpupload:
@echo "start building smartpiftpupload..."
$(GOBUILD) -o ../bin$(LBITS)/$(BINARY_FTPUPLOAD) -ldflags="-X main.appVersion=${VERSION}" ftpupload/ftpupload.go
@echo "building smartpiftpupload done"

buildsmartpimodbusserver:
@echo "start building smartpimodbusserver..."
$(GOBUILD) -o ../bin$(LBITS)/$(BINARY_MODBUSSERVER) -ldflags="-X main.appVersion=${VERSION}" services/modbus/modbusserver.go
@echo "building smartpimodbusserver done"

buildsmartpiemeterserver:
@echo "start building smartpiemeterserver..."
$(GOBUILD) -o ../bin$(LBITS)/$(BINARY_EMETERSERVER) -ldflags="-X main.appVersion=${VERSION}" services/emeter/emeter.go
@echo "building smartpiemeterserver done"

install:
@echo install

.PHONY: update-go-deps
update-go-deps:
@echo ">> updating Go dependencies"
@for m in $$($(GO) list -mod=readonly -m -f '{{ if and (not .Indirect) (not .Main)}}{{.Path}}{{end}}' all); do \
$(GO) get $$m; \
done
$(GO) mod tidy






Viele Grüße Jens
Reply
#3
Besten Dank für die Rückmeldung !

Grüße
Thomek
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)