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
Libérer: 2024-02-05 21:27:07
avant
669 Les gens l'ont consulté

如何在构建 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
Copier après la connexion

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
Copier après la connexion

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`
Copier après la connexion

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`
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

go.mod :

module example.com/m

go 1.20
Copier après la connexion

gotvm/gotvm.go :

//go:build amd64

package gotvm

import "fmt"

func f() {
    fmt.println("do awesome things using amd64")
}
Copier après la connexion

main.go :

package main

import (
    "fmt"

    _ "example.com/m/gotvm"
)

func main() {
    fmt.Println("Hello world!")
}
Copier après la connexion

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal