Maison >développement back-end >Golang >Comment ignorer gotvm lors de la création de binaires ARM64

Comment ignorer gotvm lors de la création de binaires ARM64

PHPz
PHPzavant
2024-02-05 21:27:07542parcourir

如何在构建 ARM64 二进制文件时忽略gotvm

Contenu de la question

Je souhaite construire mon référentiel go pour construire un référentiel complet en goarch=arm64 时忽略 myrepo/gotvm/* et dans tout autre cas.

La structure des dossiers du projet est la suivante :

└── myrepo
    ├── go.mod
    ├── main.go
    ├── gotvm
    │   ├── array.go
    │   ├── device.go
    │   └── gotvm.go
    └── otherstuff
        └── otherstuff.go

Tout fonctionne bien lors de la construction sur amd64 :

goos=linux goarch=amd64 go build -o amdbuild main.go

Construit sur la base de arm64

goos=linux goarch=arm64 go build -o armbuild main.go

L'erreur suivante se produit avant que le binaire ne soit créé :

package command-line-arguments
    imports github.com/myrepo/gotvm: build constraints exclude all go files in /homedir/myrepo/gotvm

La même chose est vraie lorsque j'ajoute la ligne suivante en haut de chaque fichier en utilisant package gotvm (array.go, device.go, gotvm.go) :

//go:build amd64
// +build amd64`

Autres étapes que j'ai essayées :

  • go clean -modcache
  • Ajoutez les indicateurs de build suivants package gotvm au-dessus de tous les fichiers appartenant à
  • (individuellement)
// go:build (darwin && cgo) || (linux && cgo)
//go:build amd64
// +build amd64`

Il y a une question similaire ici : (package de simulation) , mais cela ignore l'intégralité du dossier. Je veux ignorer les dossiers avec arch 不是 arm64 comme condition.

tl;dr; Existe-t-il un moyen de compiler mon référentiel de manière croisée vers arm64 et amd64 ? Je veux ignorer tvm dans la version arm64.

Spécifications :

  • version aller : go1.20.4 linux/amd64
  • Système : Ubuntu 20.04.5 lts

Bonne réponse


Ajoutez le fichier go contenant uniquement la clause package au fichier gotvm 文件夹中可以解决此问题。例如,doc.go :

// this file is a workaround for the following issue when built with goarch=arm64:
//
//   build constraints exclude all go files in /homedir/myrepo/gotvm

package gotvm

Mais lorsque vous rencontrez ce problème, la plupart du temps, cela signifie qu'il y a au moins un fichier qui importe ce package, et goarch=arm64不排除这个文件。也许您应该从此文件中删除导入(或者对于 goarch=arm64 exclut également ce fichier).

J'ajouterai une démo pour illustrer le problème. Voici les fichiers :

├── go.mod
├── gotvm
│   └── gotvm.go
└── main.go

go.mod :

module example.com/m

go 1.20

gotvm/gotvm.go :

//go:build amd64

package gotvm

import "fmt"

func f() {
    fmt.println("do awesome things using amd64")
}

main.go :

package main

import (
    "fmt"

    _ "example.com/m/gotvm"
)

func main() {
    fmt.Println("Hello world!")
}

Pour cette démo, commencez par main.go 中删除 _ "example.com/m/gotvm" 或添加前面提到的 doc.go 文件即可解决该问题。我认为,最好从 main.go 中删除 _ "example.com/m/gotvm" .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer